{"cells":[{"metadata":{},"cell_type":"markdown","source":"based on : https://www.kaggle.com/CVxTz/keras-cnn-starter\n# || Loading Packages"},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\nimport os, time, random, cv2, glob, pickle, librosa\nfrom pathlib import Path\nfrom PIL import Image\nimport imgaug as ia\nfrom imgaug import augmenters as iaa\nfrom tqdm import tqdm\n\nfrom keras.models import Model\nfrom keras.layers import (Convolution1D, Input, Dense, Flatten, Dropout, GlobalAveragePooling1D, concatenate,\n                          Activation, MaxPool1D, GlobalMaxPool1D, BatchNormalization, Concatenate, ReLU, LeakyReLU)\nfrom keras.callbacks import ModelCheckpoint, EarlyStopping, LearningRateScheduler\nfrom keras.optimizers import Adam, SGD, RMSprop\nfrom keras.losses import sparse_categorical_crossentropy\nfrom keras.utils.np_utils import to_categorical\nfrom sklearn.model_selection import train_test_split\nprint(os.listdir(\"../input\"))","execution_count":1,"outputs":[{"output_type":"stream","text":"Using TensorFlow backend.\n","name":"stderr"},{"output_type":"stream","text":"['test', 'train_noisy.csv', 'train_curated.csv', 'train_curated', 'sample_submission.csv', 'train_noisy']\n","name":"stdout"}]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","collapsed":true,"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":false},"cell_type":"markdown","source":"# || Configuration"},{"metadata":{"trusted":true},"cell_type":"code","source":"%matplotlib inline\npd.set_option('max_colwidth', 400)\nplt.rcParams['figure.figsize'] = [16, 10]\nplt.rcParams['font.size'] = 16\nt_start = time.time()\n\n# Keras reproduce score (then init all model seed)\n# seed_nb=14\n# import numpy as np \n# np.random.seed(seed_nb)\n# import tensorflow as tf\n# tf.set_random_seed(seed_nb)","execution_count":2,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# || Data Preparation"},{"metadata":{"trusted":true},"cell_type":"code","source":"input_length = 16000*2\n\nbatch_size = 32\n\ndef audio_norm(data):\n\n    max_data = np.max(data)\n    min_data = np.min(data)\n    data = (data-min_data)/(max_data-min_data+0.0001)\n    return data-0.5\n\n\ndef load_audio_file(file_path, input_length=input_length):\n    data = librosa.core.load(file_path, sr=16000)[0] #, sr=16000\n    if len(data)>input_length:\n        max_offset = len(data)-input_length\n        offset = np.random.randint(max_offset)\n        data = data[offset:(input_length+offset)]\n        \n    else:\n        if input_length > len(data):\n            max_offset = input_length - len(data)\n            offset = np.random.randint(max_offset)\n        else:\n            offset = 0\n            \n        data = np.pad(data, (offset, input_length - len(data) - offset), \"constant\")\n        \n    data = audio_norm(data)\n    return data","execution_count":3,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_files = glob.glob(\"../input/train_curated/*.wav\")\ntest_files = glob.glob(\"../input/train_noisy/*.wav\")\ntrain_labels = pd.read_csv(\"../input/train_curated.csv\")","execution_count":4,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"file_to_label = {\"../input/train_curated/\"+k:v for k,v in zip(train_labels.fname.values, train_labels.labels.values)}","execution_count":5,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data_base = load_audio_file(train_files[0])\nfig = plt.figure(figsize=(14, 8))\nplt.title('Raw wave : %s ' % (file_to_label[train_files[0]]))\nplt.ylabel('Amplitude')\nplt.plot(np.linspace(0, 1, input_length), data_base)\nplt.show();","execution_count":6,"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 1008x576 with 1 Axes>","image/png":"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RERERBHA4IuIiIiIiCgCGHwRERERERFFAIMvIiIiIiKiCGDwRURECUU53QAiIkpYDL6IiIiIiIgigMEXERERERFRBDD4IiIiIiIiigAGX0RERERERBHA4IuIiIiIiCgCGHwRERERERFFAIMvIiIiIiKiCGDwRURECUVxoS8iInIIgy8iIkooe47mOt0EIiJKUAy+iIgooTz78xqnm0BERAmKwRcREREREVEEMPgiIiIiori2evcxNBo0CQu2HXK6KZTgGHwRERERUVxbtOMwACB1y0GHW0KJjsEXEREREcU1FjmlaMHgi4iIiIjimr7EhDjbDCIGX0REREQU3xQYfVF0YPBFRERERAlBGH2Rwxh8ERERERERRQCDLyIiIiKKa4oVNyhKMPgiIiIiooQgzDokhzH4IiIiIiIiigAGX0REREQU15Qr75ADX+Q0Bl9EMS6/qBizN2U63QwiIqKox7RDchqDL6IY98pfm3D3V0uxfNdRp5tCRERERH7ETPAlImeJyM8iclxEskTkVxE5uwzHGSQiSkTmhaOdRJGWdjgHAHD8ZIHDLSEiIopOrHZI0SImgi8RqQJgFoCWAO4CcAeAZgBmi0jVII7TGMAQAMzRorihn1C4cCQREZF/PFeS01KcboBN9wFoDKCFUmobAIjIGgBbATwA4E2bx/kIwHgALRA7vzuRPTyfEBERWeLAF0WLmBj5AtAfwCI98AIApdROAPMBDLBzABG5DcBFAJ4PSwuJHMITChERkX/uLBF2VJLDYiX4agNgncX29QBaB3qwiJwK4C0A/1FKHQlx24iiAs8nRERE1hRYap6iQ6wEX6cBsCrldgTAqTYePwbAFgBfhbBNREREREREtsX9vCcR6QrgTgAXKWWv1o2I3A/gfgA4++ygCyoSRZTNlzUREREROSxWRr6OwnqEy9eImNHHAD4HsEdEaolILWhBZ7LrdiXzA5RSnyil2iul2tetW7e8bSeKCGEiOxERkSV3PyXPleSwWBn5Wg9t3pdZawAbAjy2levrQYv7jgJ4EsDb5WodURTgCBgREZF/DL3IabEy8vU7gI6udboAACLSCEBn133+9LD4Wg2tgEcPAD+HvrlEREQUKo0GTcKwiVZ1t4jsYfckRYtYCb4+BZAGYKKIDBCR/gAmAtgNLa0QACAi54hIkYgM07cppVLNXwCOATjuur0n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\n"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"list_labels = sorted(list(set(train_labels.labels.values)))\nlabel_to_int = {k:v for v,k in enumerate(list_labels)}\nint_to_label = {v:k for k,v in label_to_int.items()}\nfile_to_int = {k:label_to_int[v] for k,v in file_to_label.items()}","execution_count":7,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def get_model():\n    nclass = len(list_labels)\n    inp = Input(shape=(input_length, 1))\n    img_1 = Convolution1D(16, kernel_size=9, activation=\"relu\", padding=\"valid\")(inp)\n    img_1 = Convolution1D(16, kernel_size=9, activation=\"relu\", padding=\"valid\")(img_1)\n    img_1 = MaxPool1D(pool_size=16)(img_1)\n    img_1 = Dropout(rate=0.1)(img_1)\n    img_1 = Convolution1D(32, kernel_size=3, activation=\"relu\", padding=\"valid\")(img_1)\n    img_1 = Convolution1D(32, kernel_size=3, activation=\"relu\", padding=\"valid\")(img_1)\n    img_1 = MaxPool1D(pool_size=4)(img_1)\n    img_1 = Dropout(rate=0.1)(img_1)\n    img_1 = Convolution1D(32, kernel_size=3, activation=\"relu\", padding=\"valid\")(img_1)\n    img_1 = Convolution1D(32, kernel_size=3, activation=\"relu\", padding=\"valid\")(img_1)\n    img_1 = MaxPool1D(pool_size=4)(img_1)\n    img_1 = Dropout(rate=0.1)(img_1)\n    img_1 = Convolution1D(256, kernel_size=3, activation=\"relu\", padding=\"valid\")(img_1)\n    img_1 = Convolution1D(256, kernel_size=3, activation=\"relu\", padding=\"valid\")(img_1)\n    img_1 = GlobalMaxPool1D()(img_1)\n    img_1 = Dropout(rate=0.2)(img_1)\n\n    dense_1 = Dense(64, activation=\"relu\")(img_1)\n    dense_1 = Dense(1028, activation=\"relu\")(dense_1)\n    dense_1 = Dense(nclass, activation=\"softmax\")(dense_1)\n\n    model = Model(inputs=inp, outputs=dense_1)\n\n    model.compile(optimizer=Adam(0.001), loss=sparse_categorical_crossentropy, metrics=['acc'])\n    model.summary()\n    return model","execution_count":8,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def chunker(seq, size):\n    return (seq[pos:pos + size] for pos in range(0, len(seq), size))","execution_count":9,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def train_generator(list_files, batch_size=batch_size):\n    while True:\n        random.shuffle(list_files)\n        for batch_files in chunker(list_files, size=batch_size):\n            batch_data = [load_audio_file(fpath) for fpath in batch_files]\n            batch_data = np.array(batch_data)[:,:,np.newaxis]\n            batch_labels = [file_to_int[fpath] for fpath in batch_files]\n            batch_labels = np.array(batch_labels)\n            \n            yield batch_data, batch_labels","execution_count":10,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"tr_files, val_files = train_test_split(train_files, test_size=0.1)","execution_count":11,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = get_model()","execution_count":12,"outputs":[{"output_type":"stream","text":"WARNING:tensorflow:From /opt/conda/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py:263: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.\nInstructions for updating:\nColocations handled automatically by placer.\nWARNING:tensorflow:From /opt/conda/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py:3445: calling dropout (from tensorflow.python.ops.nn_ops) with keep_prob is deprecated and will be removed in a future version.\nInstructions for updating:\nPlease use `rate` instead of `keep_prob`. Rate should be set to `rate = 1 - keep_prob`.\n_________________________________________________________________\nLayer (type)                 Output Shape              Param #   \n=================================================================\ninput_1 (InputLayer)         (None, 32000, 1)          0         \n_________________________________________________________________\nconv1d_1 (Conv1D)            (None, 31992, 16)         160       \n_________________________________________________________________\nconv1d_2 (Conv1D)            (None, 31984, 16)         2320      \n_________________________________________________________________\nmax_pooling1d_1 (MaxPooling1 (None, 1999, 16)          0         \n_________________________________________________________________\ndropout_1 (Dropout)          (None, 1999, 16)          0         \n_________________________________________________________________\nconv1d_3 (Conv1D)            (None, 1997, 32)          1568      \n_________________________________________________________________\nconv1d_4 (Conv1D)            (None, 1995, 32)          3104      \n_________________________________________________________________\nmax_pooling1d_2 (MaxPooling1 (None, 498, 32)           0         \n_________________________________________________________________\ndropout_2 (Dropout)          (None, 498, 32)           0         \n_________________________________________________________________\nconv1d_5 (Conv1D)            (None, 496, 32)           3104      \n_________________________________________________________________\nconv1d_6 (Conv1D)            (None, 494, 32)           3104      \n_________________________________________________________________\nmax_pooling1d_3 (MaxPooling1 (None, 123, 32)           0         \n_________________________________________________________________\ndropout_3 (Dropout)          (None, 123, 32)           0         \n_________________________________________________________________\nconv1d_7 (Conv1D)            (None, 121, 256)          24832     \n_________________________________________________________________\nconv1d_8 (Conv1D)            (None, 119, 256)          196864    \n_________________________________________________________________\nglobal_max_pooling1d_1 (Glob (None, 256)               0         \n_________________________________________________________________\ndropout_4 (Dropout)          (None, 256)               0         \n_________________________________________________________________\ndense_1 (Dense)              (None, 64)                16448     \n_________________________________________________________________\ndense_2 (Dense)              (None, 1028)              66820     \n_________________________________________________________________\ndense_3 (Dense)              (None, 213)               219177    \n=================================================================\nTotal params: 537,501\nTrainable params: 537,501\nNon-trainable params: 0\n_________________________________________________________________\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.fit_generator(train_generator(tr_files), \n                    steps_per_epoch=len(tr_files)//batch_size, \n                    validation_data=train_generator(val_files),\n                    validation_steps=len(val_files)//batch_size,\n                    epochs=1\n    )","execution_count":14,"outputs":[{"output_type":"stream","text":"Epoch 1/1\n139/139 [==============================] - 1384s 10s/step - loss: 4.7217 - acc: 0.0110 - val_loss: 4.7379 - val_acc: 0.0125\n","name":"stdout"},{"output_type":"execute_result","execution_count":14,"data":{"text/plain":"<keras.callbacks.History at 0x7f0ba00ffc50>"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.save_weights(\"baseline_cnn.h5\")","execution_count":15,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"list_preds = []","execution_count":16,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for batch_files in tqdm(chunker(test_files, size=batch_size), total=len(test_files)//batch_size ):\n    batch_data = [load_audio_file(fpath) for fpath in batch_files]\n    batch_data = np.array(batch_data)[:,:,np.newaxis]\n    preds = model.predict(batch_data).tolist()\n    list_preds += preds","execution_count":null,"outputs":[{"output_type":"stream","text":"  7%|▋         | 44/619 [12:58<2:49:25, 17.68s/it]","name":"stderr"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"array_preds = np.array(list_preds)\nlist_labels = np.array(list_labels)\n\ntop_3 = list_labels[np.argsort(-array_preds, axis=1)[:, :3]]\npred_labels = [' '.join(list(x)) for x in top_3]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df = pd.DataFrame(test_files, columns=[\"fname\"])\ndf['label'] = pred_labels","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df['fname'] = df.fname.apply(lambda x: x.split(\"/\")[-1])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df.to_csv(\"baseline.csv\", index=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"t_finish = time.time()\nprint(f\"Kernel run time = {(t_finish-t_start)/3600} hours\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.4","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}