{"cells":[{"metadata":{"trusted":true},"cell_type":"code","source":"import warnings\nwarnings.filterwarnings(\"ignore\")\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\nimport soundfile as sf\nimport scipy.signal as signal\nimport matplotlib.pyplot as plt # to support librosa display\nimport seaborn as sns\nimport IPython.display as ipd # for playing audio\nfrom collections import Counter\nfrom tqdm import tqdm\nimport gc\nimport os\nimport sys\nimport shutil\nimport random\n\nfrom joblib import Parallel, delayed\nfrom functools import partial\n\nimport librosa # audio proccessing\nimport librosa.display # cool audio visuals\nfrom librosa import feature as lf\n\n\n\nfrom skimage.io import imread\nfrom sklearn.model_selection import train_test_split, StratifiedKFold\nfrom sklearn.utils.class_weight import compute_class_weight\nfrom sklearn.metrics import precision_score, recall_score, accuracy_score\nfrom collections import Counter\nimport glob\nimport pickle\n\n\nimport tensorflow_addons as tfa\nimport tensorflow as tf\nfrom tensorflow.keras.utils import to_categorical\nfrom tensorflow.keras.layers import Input, Dense, Flatten, Dropout, GaussianNoise, Reshape, Lambda, Concatenate\nfrom tensorflow.keras.layers import Conv2D, MaxPool2D, BatchNormalization, Activation, LSTM, GRU, Bidirectional\nfrom tensorflow.keras.activations import relu, softmax\nfrom tensorflow.keras.models import Sequential, Model\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.callbacks import ModelCheckpoint, ReduceLROnPlateau\nfrom tensorflow.keras.layers.experimental.preprocessing import Resizing, Normalization\nfrom sklearn.metrics import confusion_matrix, classification_report\nfrom sklearn.utils import shuffle\nfrom tensorflow.keras.models import load_model\n\nnp.random.seed(42)\ntf.random.set_seed(100)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data_tp=pd.read_csv('/kaggle/input/rfcx-species-audio-detection/train_tp.csv')\ndata_fp=pd.read_csv('/kaggle/input/rfcx-species-audio-detection/train_fp.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data_tp.head(10)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data_fp.head(10)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\ntrain = \"../input/output-files/MFCC/train\"\ntest = \"../input/output-files/MFCC/test\"\ntrain_files = os.listdir(train)\ntest_files = os.listdir(test) \noutput_dir = \"./\"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"os.listdir(\"/kaggle\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"len(os.listdir(\"/kaggle/input/output-files/MFCC/test\"))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"len(os.listdir(\"/kaggle/input/output-files/MFCC/train\"))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"all_arrays_train = []\nfor npfile in train_files:\n    all_arrays_train.append(np.load(os.path.join(train, npfile)))\nall_arrays_train = np.array(all_arrays_train)\nnp.save('train_all.npy',all_arrays_train)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_mat= np.load('train_all.npy')\ntrain_mat.ndim \n\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_mat.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"all_arrays_test = []\nfor npfile in test_files:\n    all_arrays_test.append(np.load(os.path.join(test, npfile)))\nall_arrays_train = np.array(all_arrays_test)\nnp.save('test_all.npy',all_arrays_test)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_mat=np.load('test_all.npy')\ntest_mat.ndim ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_mat.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df1 = data_tp.iloc[:, 0:2]\nrec= data_tp['recording_id'].values\ny_labels = data_tp['species_id'].values\ny = to_categorical(y_labels, num_classes=24)\nprint (data_tp.shape, y.shape)\ndf1\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X=np.empty((0,76, 143, 1),int)\nlabels=[]\nfor i,j,k in df1.itertuples():\n    data = np.load('../input/output-files/MFCC/train/'+j+'.npy')\n    data = np.expand_dims(data,axis=0)\n    X=np.append(X,data,axis=0)\n    labels.append(k)\n    \n \n\nlabels=np.array(labels)\nlabels=labels.astype(int)\n\nprint(labels.shape)\nY=np.zeros((labels.size,24))\n\nY[np.arange(labels.size),labels] = 1\n\n\nprint(X.shape)\nprint(Y.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class_weight = compute_class_weight('balanced',np.arange(24), y_labels)\nclass_weights = dict(zip(np.arange(24), class_weight))\nclass_weights","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"x_train, x_valid, y_train, y_valid = train_test_split(X, Y, test_size = 0.2,\n                                                      stratify = y_labels, shuffle = True,\n                                                      random_state = 42)\n#x_train = x_train[..., np.newaxis]\n#x_valid = x_valid[..., np.newaxis]\nprint (x_train.shape, y_train.shape, x_valid.shape, y_valid.shape)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# CNN Model only"},{"metadata":{"trusted":true},"cell_type":"code","source":"\ndef create_model(input_shape = (76,143,1)):\n  model = Sequential()\n  model.add(Input(shape = input_shape))\n  model.add(Resizing(200,200))\n  \n  model.add(Conv2D(32, (3,3), kernel_initializer = 'he_normal', padding = 'same'))\n  #model.add(GaussianNoise(0.3))\n  model.add(BatchNormalization())\n  model.add(Activation('relu'))\n  model.add(MaxPool2D((2,2)))\n  \n\n\n  model.add(Conv2D(64, kernel_size = (3,3),  padding = 'same'))\n  #model.add(GaussianNoise(0.3))\n  model.add(BatchNormalization())\n  model.add(Activation('relu'))\n  model.add(MaxPool2D((2,2)))\n  model.add(Dropout(0.2))\n\n  model.add(Conv2D(128, kernel_size = (3,3), padding = 'same'))\n  #model.add(GaussianNoise(0.3))\n  model.add(BatchNormalization())\n  model.add(Activation('relu'))\n  model.add(MaxPool2D((2,2)))\n  model.add(Dropout(0.2))\n\n  model.add(Conv2D(256, kernel_size = (3,3), padding = 'same'))\n  model.add(BatchNormalization())\n  model.add(Activation('relu'))\n  model.add(MaxPool2D((2,2)))\n  model.add(Dropout(0.2))\n\n\n  model.add(Flatten())\n\n  model.add(Dense(512, kernel_initializer = 'he_normal'))\n  model.add(BatchNormalization())\n  model.add(Activation('relu'))\n  model.add(Dropout(0.3))\n\n  model.add(Dense(24, activation = 'softmax'))\n  model.compile(loss = 'categorical_crossentropy', optimizer = \"adam\", metrics = ['acc'])\n  model.summary()\n  return model","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\nmodel = create_model()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\nmodel_checkpoint = os.path.join(train,'models','tp_model.hdf5')\n\ncp = ModelCheckpoint(model_checkpoint, monitor='val_loss', verbose=1, save_best_only=True)\n\nlr = ReduceLROnPlateau(\n      monitor='val_loss', factor=0.3, patience=10, verbose=0,\n      mode='auto'\n)\n\ncallbacks = [cp, lr]\nhistory = model.fit(x_train, y_train, validation_data = (x_valid, y_valid),\n                    epochs = 50, batch_size = 32, callbacks = callbacks, \n                    class_weight = class_weights)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def plot_history(history):\n    fig,axs = plt.subplots(1,2, figsize = (15,6))\n    axs[0].plot(history.history['acc'])\n    axs[0].plot(history.history['val_acc'])\n    axs[0].set_title('model accuracy')\n    axs[0].set_ylabel('accuracy')\n    axs[0].set_xlabel('epoch')\n    axs[0].legend(['train', 'val'], loc='upper left')\n    \n    axs[1].plot(history.history['loss'])\n    axs[1].plot(history.history['val_loss'])\n    axs[1].set_title('model loss')\n    axs[1].set_ylabel('loss')\n    axs[1].set_xlabel('epoch')\n    axs[1].legend(['train', 'val'], loc='upper right')\n    \n    plt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plot_history(history)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.evaluate(x_valid, y_valid)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"y_pred = np.argmax(model.predict(x_valid),axis = 1)\ny_true = np.argmax(y_valid, axis = 1)\nprint (classification_report(y_true,y_pred ))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Model with both CNN and LSTM"},{"metadata":{"trusted":true},"cell_type":"code","source":"#Input shape (76,143,1) if first extracting feature by conv else (76,143) if first layer is RNN layer\ndef create_model(input_shape = (76,143)):\n  model = Sequential()\n  model.add(Input(input_shape))\n  model.add(Normalization())\n  \n  model.add(Bidirectional(LSTM(90, kernel_initializer = 'he_normal', return_sequences= True)))\n  model.add(BatchNormalization())\n\n\n  model.add(Lambda(lambda x:tf.expand_dims(x, axis = -1)))\n  \n  model.add(Resizing(200,200))\n  \n  model.add(Conv2D(64, (3,3), kernel_initializer = 'he_normal', padding = 'same'))\n  #model.add(GaussianNoise(0.3))\n  model.add(BatchNormalization())\n  model.add(Activation('relu'))\n  model.add(MaxPool2D((2,2)))\n  \n\n\n  model.add(Conv2D(64, kernel_size = (3,3), kernel_initializer = 'he_normal', padding = 'same'))\n  #model.add(GaussianNoise(0.3))\n  model.add(BatchNormalization())\n  model.add(Activation('relu'))\n  model.add(MaxPool2D((2,2)))\n  model.add(Dropout(0.2))\n\n  model.add(Conv2D(128, kernel_size = (3,3), kernel_initializer = 'he_normal', padding = 'same'))\n  #model.add(GaussianNoise(0.3))\n  model.add(BatchNormalization())\n  model.add(Activation('relu'))\n  model.add(MaxPool2D((2,2)))\n  model.add(Dropout(0.2))\n\n\n  model.add(Conv2D(256, kernel_size = (3,3), kernel_initializer = 'he_normal', padding = 'same'))\n  #model.add(GaussianNoise(0.3))\n  model.add(BatchNormalization())\n  model.add(Activation('relu'))\n  model.add(MaxPool2D((2,2)))\n  model.add(Dropout(0.2))\n\n  '''model.add(Conv2D(256, (1,1)))\n  model.add(Conv2D(32,(1,1)))\n  model.add(Conv2D(1,(1,1)))\n  \n  model.add(Reshape((12,12)))\n\n  model.add(Bidirectional(LSTM(units = 12, return_sequences=True)))\n  #model.add(LSTM(12))\n  '''\n  model.add(Flatten())\n\n  model.add(Dense(512, kernel_initializer='he_normal'))\n  model.add(BatchNormalization())\n  model.add(Activation('relu'))\n  model.add(Dropout(0.3))\n\n  model.add(Dense(24, kernel_initializer = 'he_normal', activation = 'softmax'))\n  model.compile(loss = 'categorical_crossentropy', optimizer = \"adam\", metrics = ['acc'])\n  model.summary()\n  return model","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\nmodel = create_model()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model_checkpoint = os.path.join(train,'models','tp_model.hdf5')\n\ncp = ModelCheckpoint(model_checkpoint, monitor='val_loss', verbose=1, save_best_only=True)\n\nlr = ReduceLROnPlateau(\n      monitor='val_loss', factor=0.3, patience=10, verbose=0,\n      mode='auto'\n)\n\ncallbacks = [cp, lr]\n\nhistory = model.fit(x_train, y_train, validation_data = (x_valid, y_valid),\n                    epochs = 70, batch_size = 32, callbacks = callbacks, \n                    class_weight = class_weights)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":4}