{"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_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport wave\nfrom scipy.io import wavfile\nimport os\nimport librosa\nfrom librosa.feature import melspectrogram\nimport warnings\nfrom sklearn.utils import shuffle\nfrom sklearn.utils import class_weight\nfrom PIL import Image\nfrom uuid import uuid4\nimport sklearn\nfrom tqdm import tqdm\nimport IPython.display as ipd\n\nimport tensorflow as tf\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras import layers\nfrom tensorflow.keras import Input\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.layers import Dense, Flatten, Dropout, Activation, Rescaling\nfrom tensorflow.keras.layers import BatchNormalization, GlobalAveragePooling2D\nfrom tensorflow.keras.callbacks import ModelCheckpoint, ReduceLROnPlateau, EarlyStopping\nfrom tensorflow.keras.utils import to_categorical\nfrom tensorflow.keras.layers import Dense, Flatten, Dropout, Activation, LSTM, SimpleRNN, Conv1D, Input, BatchNormalization, GlobalAveragePooling2D\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.applications import EfficientNetB0\n\n\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nsns.set()\n\nseed = 30\ntf.random.set_seed(seed)\nnp.random.seed(seed)","metadata":{"execution":{"iopub.status.busy":"2022-05-18T07:00:44.580866Z","iopub.execute_input":"2022-05-18T07:00:44.581341Z","iopub.status.idle":"2022-05-18T07:00:44.594561Z","shell.execute_reply.started":"2022-05-18T07:00:44.581296Z","shell.execute_reply":"2022-05-18T07:00:44.593485Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = pd.read_csv('../input/birdclef-2021/train_metadata.csv')","metadata":{"execution":{"iopub.status.busy":"2022-05-18T07:00:51.139744Z","iopub.execute_input":"2022-05-18T07:00:51.140047Z","iopub.status.idle":"2022-05-18T07:00:51.475301Z","shell.execute_reply.started":"2022-05-18T07:00:51.140013Z","shell.execute_reply":"2022-05-18T07:00:51.474658Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = train_df.query(\"rating>=5\")\nbirds_count = {}\nfor bird_species, count in zip(train_df.primary_label.unique(), train_df.groupby(\"primary_label\")[\"primary_label\"].count().values):\n    birds_count[bird_species] = count\nmost_represented_birds = [key for key,value in birds_count.items() if value in range(50,70)]\n\ntrain_df = train_df.query(\"primary_label in @most_represented_birds\")","metadata":{"execution":{"iopub.status.busy":"2022-05-18T07:00:53.292117Z","iopub.execute_input":"2022-05-18T07:00:53.292412Z","iopub.status.idle":"2022-05-18T07:00:53.329031Z","shell.execute_reply.started":"2022-05-18T07:00:53.292365Z","shell.execute_reply":"2022-05-18T07:00:53.327985Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"most_represented_birds","metadata":{"execution":{"iopub.status.busy":"2022-05-18T07:00:55.64532Z","iopub.execute_input":"2022-05-18T07:00:55.645816Z","iopub.status.idle":"2022-05-18T07:00:55.651867Z","shell.execute_reply.started":"2022-05-18T07:00:55.645754Z","shell.execute_reply":"2022-05-18T07:00:55.651087Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(train_df.primary_label.unique())","metadata":{"execution":{"iopub.status.busy":"2022-05-18T07:00:59.047676Z","iopub.execute_input":"2022-05-18T07:00:59.047983Z","iopub.status.idle":"2022-05-18T07:00:59.054096Z","shell.execute_reply.started":"2022-05-18T07:00:59.047945Z","shell.execute_reply":"2022-05-18T07:00:59.053469Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"birds_to_recognise = sorted(most_represented_birds[:15])\nprint(birds_to_recognise)\ntrain_df = train_df.query(\"primary_label in @birds_to_recognise\")","metadata":{"execution":{"iopub.status.busy":"2022-05-18T07:01:01.23113Z","iopub.execute_input":"2022-05-18T07:01:01.232002Z","iopub.status.idle":"2022-05-18T07:01:01.242534Z","shell.execute_reply.started":"2022-05-18T07:01:01.231955Z","shell.execute_reply":"2022-05-18T07:01:01.241443Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.primary_label.unique()","metadata":{"execution":{"iopub.status.busy":"2022-05-18T07:01:03.264274Z","iopub.execute_input":"2022-05-18T07:01:03.264763Z","iopub.status.idle":"2022-05-18T07:01:03.270108Z","shell.execute_reply.started":"2022-05-18T07:01:03.264697Z","shell.execute_reply":"2022-05-18T07:01:03.269536Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(train_df)","metadata":{"execution":{"iopub.status.busy":"2022-05-18T07:01:06.0143Z","iopub.execute_input":"2022-05-18T07:01:06.014838Z","iopub.status.idle":"2022-05-18T07:01:06.020047Z","shell.execute_reply.started":"2022-05-18T07:01:06.014801Z","shell.execute_reply":"2022-05-18T07:01:06.019126Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = shuffle(train_df)","metadata":{"execution":{"iopub.status.busy":"2022-05-18T07:01:08.764513Z","iopub.execute_input":"2022-05-18T07:01:08.764789Z","iopub.status.idle":"2022-05-18T07:01:08.770813Z","shell.execute_reply.started":"2022-05-18T07:01:08.76476Z","shell.execute_reply":"2022-05-18T07:01:08.769711Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"training_percentage = 0.8\ntraining_item_count = int(len(train_df)*0.8)\nvalidation_item_count = int(len(train_df)*0.1)\ntest_item_count = int(len(train_df)*0.1)\ntraining_df = train_df[:training_item_count]\nvalidation_df = train_df[training_item_count:training_item_count+validation_item_count]\ntest_df = train_df[training_item_count+validation_item_count:]","metadata":{"execution":{"iopub.status.busy":"2022-05-18T07:01:12.17929Z","iopub.execute_input":"2022-05-18T07:01:12.17995Z","iopub.status.idle":"2022-05-18T07:01:12.186232Z","shell.execute_reply.started":"2022-05-18T07:01:12.179877Z","shell.execute_reply":"2022-05-18T07:01:12.185477Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(training_df)","metadata":{"execution":{"iopub.status.busy":"2022-05-18T07:01:14.660084Z","iopub.execute_input":"2022-05-18T07:01:14.660731Z","iopub.status.idle":"2022-05-18T07:01:14.667055Z","shell.execute_reply.started":"2022-05-18T07:01:14.660663Z","shell.execute_reply":"2022-05-18T07:01:14.666212Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(validation_df)","metadata":{"execution":{"iopub.status.busy":"2022-05-18T07:01:16.873519Z","iopub.execute_input":"2022-05-18T07:01:16.873927Z","iopub.status.idle":"2022-05-18T07:01:16.879394Z","shell.execute_reply.started":"2022-05-18T07:01:16.873898Z","shell.execute_reply":"2022-05-18T07:01:16.878539Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"wav, sr = librosa.load(\"../input/birdclef-2021/train_short_audio/amecro/XC109768.ogg\")","metadata":{"execution":{"iopub.status.busy":"2022-05-18T07:01:19.211484Z","iopub.execute_input":"2022-05-18T07:01:19.212393Z","iopub.status.idle":"2022-05-18T07:01:20.641992Z","shell.execute_reply.started":"2022-05-18T07:01:19.212334Z","shell.execute_reply":"2022-05-18T07:01:20.641067Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def plot_time_series(data):\n    fig = plt.figure(figsize=(14, 8))\n    plt.title('Raw wave ')\n    plt.ylabel('Amplitude')\n    plt.plot(np.linspace(0, 1, len(data)), data)\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2022-05-18T07:01:23.175871Z","iopub.execute_input":"2022-05-18T07:01:23.176178Z","iopub.status.idle":"2022-05-18T07:01:23.182253Z","shell.execute_reply.started":"2022-05-18T07:01:23.176147Z","shell.execute_reply":"2022-05-18T07:01:23.18123Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# stretching the sound\ndef stretch(data, rate=1):\n    input_length = sr\n    data = librosa.effects.time_stretch(data, rate)\n    data = np.pad(data, (0, max(0, input_length - len(data))), \"constant\")\n\n    return data","metadata":{"execution":{"iopub.status.busy":"2022-05-18T07:01:25.081903Z","iopub.execute_input":"2022-05-18T07:01:25.082186Z","iopub.status.idle":"2022-05-18T07:01:25.086925Z","shell.execute_reply.started":"2022-05-18T07:01:25.082157Z","shell.execute_reply":"2022-05-18T07:01:25.086193Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_stretch =stretch(wav, 0.8)\nipd.Audio(data_stretch, rate=sr)\nplot_time_series(data_stretch)","metadata":{"execution":{"iopub.status.busy":"2022-05-18T07:01:28.781562Z","iopub.execute_input":"2022-05-18T07:01:28.782349Z","iopub.status.idle":"2022-05-18T07:01:29.996171Z","shell.execute_reply.started":"2022-05-18T07:01:28.78231Z","shell.execute_reply":"2022-05-18T07:01:29.993939Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_stretch =stretch(wav, 1.2)\nipd.Audio(data_stretch, rate=sr)\nplot_time_series(data_stretch)","metadata":{"execution":{"iopub.status.busy":"2022-05-18T07:01:33.740599Z","iopub.execute_input":"2022-05-18T07:01:33.740894Z","iopub.status.idle":"2022-05-18T07:01:34.331167Z","shell.execute_reply.started":"2022-05-18T07:01:33.740864Z","shell.execute_reply":"2022-05-18T07:01:34.330315Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Whitenoise\nwn = np.random.randn(len(wav))\nwav_wn = wav + 0.01*wn\n# We limited the amplitude of the noise so we can still hear the word even with the noise, \n#which is the objective\nipd.Audio(wav_wn, rate=sr)\nplot_time_series(wav_wn)","metadata":{"execution":{"iopub.status.busy":"2022-05-18T07:01:37.081322Z","iopub.execute_input":"2022-05-18T07:01:37.081659Z","iopub.status.idle":"2022-05-18T07:01:37.605423Z","shell.execute_reply.started":"2022-05-18T07:01:37.081625Z","shell.execute_reply":"2022-05-18T07:01:37.604403Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Pitch\nwav_p = librosa.effects.pitch_shift(wav, sr, 4)\nipd.Audio(wav_p, rate=sr)\nplot_time_series(wav)\nplot_time_series(wav_p)","metadata":{"execution":{"iopub.status.busy":"2022-05-18T07:01:41.729325Z","iopub.execute_input":"2022-05-18T07:01:41.729641Z","iopub.status.idle":"2022-05-18T07:01:43.292138Z","shell.execute_reply.started":"2022-05-18T07:01:41.729611Z","shell.execute_reply":"2022-05-18T07:01:43.290606Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_sample(filename, bird, output_folder):\n    wave_data, wave_rate = librosa.load(filename)\n    wave_data, _ = librosa.effects.trim(wave_data)\n    wave_data = stretch(wave_data, 1.2)\n    wn = np.random.randn(len(wave_data))\n    wave_data = wave_data + 0.01*wn\n    wave_data = librosa.effects.pitch_shift(wave_data, wave_rate, 4)\n    \n    #only take 5s samples and add them to the dataframe\n    song_sample = []\n    sample_length = 5*wave_rate\n    samples_from_file = []\n    #The variable below is chosen mainly to create a 216x216 image\n    N_mels=216\n    for idx in range(0,len(wave_data),sample_length): \n        song_sample = wave_data[idx:idx+sample_length]\n        if len(song_sample)>=sample_length:\n            mel = melspectrogram(song_sample, n_mels=N_mels)\n            db = librosa.power_to_db(mel)\n            normalised_db = sklearn.preprocessing.minmax_scale(db)\n            filename = str(uuid4())+\".jpg\"\n            db_array = (np.asarray(normalised_db)*255).astype(np.uint8)\n            db_image =  Image.fromarray(np.array([db_array, db_array, db_array]).T)\n            db_image.save(\"{}{}\".format(output_folder,filename))\n            \n            samples_from_file.append({\"song_sample\":\"{}{}\".format(output_folder,filename),\n                                            \"db\":db_array,\"bird\":bird})\n    return samples_from_file","metadata":{"execution":{"iopub.status.busy":"2022-05-18T07:01:47.052864Z","iopub.execute_input":"2022-05-18T07:01:47.053134Z","iopub.status.idle":"2022-05-18T07:01:47.065761Z","shell.execute_reply.started":"2022-05-18T07:01:47.053105Z","shell.execute_reply":"2022-05-18T07:01:47.064729Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!rm -rf /kaggle/working/melspectrogram","metadata":{"execution":{"iopub.status.busy":"2022-05-18T07:01:50.837525Z","iopub.execute_input":"2022-05-18T07:01:50.837829Z","iopub.status.idle":"2022-05-18T07:01:51.614097Z","shell.execute_reply.started":"2022-05-18T07:01:50.837799Z","shell.execute_reply":"2022-05-18T07:01:51.613111Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"warnings.filterwarnings(\"ignore\")\ntrain_samples = pd.DataFrame(columns=[\"song_sample\",\"bird\"])\ntrain_list = []\n\noutput_folder = \"/kaggle/working/melspectrogram/\"\nos.mkdir(output_folder)\noutput_folder += \"train/\"\nos.mkdir(output_folder)\nwith tqdm(total=len(training_df)) as pbar:\n    for idx, row in training_df.iterrows():\n        pbar.update(1)\n        try:\n            audio_file_path = \"../input/birdclef-2021/train_short_audio/\"\n            audio_file_path += row.primary_label\n            if row.primary_label in birds_to_recognise:\n                outf = output_folder + row.primary_label + \"/\"\n                if os.path.isdir(outf) == False:\n                    os.mkdir(outf)\n                train_list += get_sample('{}/{}'.format(audio_file_path, row.filename), row.primary_label, outf) \n        except:\n            raise\n            print(\"{} is corrupted\".format(audio_file_path))\n            \ntrain_samples = pd.DataFrame(train_list)","metadata":{"execution":{"iopub.status.busy":"2022-05-18T07:01:54.497131Z","iopub.execute_input":"2022-05-18T07:01:54.497536Z","iopub.status.idle":"2022-05-18T07:02:08.316709Z","shell.execute_reply.started":"2022-05-18T07:01:54.497495Z","shell.execute_reply":"2022-05-18T07:02:08.315415Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"warnings.filterwarnings(\"ignore\")\nvalidation_samples = pd.DataFrame(columns=[\"song_sample\",\"bird\"])\nvalidation_list = []\n\noutput_folder = \"/kaggle/working/melspectrogram/validation/\"\nos.mkdir(output_folder)\nwith tqdm(total=len(validation_df)) as pbar:\n    for idx, row in validation_df.iterrows():\n        pbar.update(1)\n        try:\n            audio_file_path = \"../input/birdclef-2021/train_short_audio/\"\n            audio_file_path += row.primary_label\n            if row.primary_label in birds_to_recognise:\n                outf = output_folder + row.primary_label + \"/\"\n                if os.path.isdir(outf) == False:\n                    os.mkdir(outf)\n                validation_list += get_sample('{}/{}'.format(audio_file_path, row.filename), row.primary_label, outf) \n        except:\n            raise\n            print(\"{} is corrupted\".format(audio_file_path))\n            \nvalidation_samples = pd.DataFrame(validation_list)","metadata":{"execution":{"iopub.status.busy":"2022-05-17T07:44:57.927479Z","iopub.execute_input":"2022-05-17T07:44:57.928253Z","iopub.status.idle":"2022-05-17T07:45:34.828559Z","shell.execute_reply.started":"2022-05-17T07:44:57.928206Z","shell.execute_reply":"2022-05-17T07:45:34.827735Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"warnings.filterwarnings(\"ignore\")\ntest_samples = pd.DataFrame(columns=[\"song_sample\",\"bird\"])\ntest_list = []\n\noutput_folder = \"/kaggle/working/melspectrogram/test/\"\nos.mkdir(output_folder)\nwith tqdm(total=len(test_df)) as pbar:\n    for idx, row in test_df.iterrows():\n        pbar.update(1)\n        try:\n            audio_file_path = \"../input/birdclef-2021/train_short_audio/\"\n            audio_file_path += row.primary_label\n            if row.primary_label in birds_to_recognise:\n                outf = output_folder + row.primary_label + \"/\"\n                if os.path.isdir(outf) == False:\n                    os.mkdir(outf)\n                test_list += get_sample('{}/{}'.format(audio_file_path, row.filename), row.primary_label, outf) \n        except:\n            raise\n            print(\"{} is corrupted\".format(audio_file_path))\n            \ntest_samples = pd.DataFrame(test_list)","metadata":{"execution":{"iopub.status.busy":"2022-05-17T07:45:37.116808Z","iopub.execute_input":"2022-05-17T07:45:37.117103Z","iopub.status.idle":"2022-05-17T07:46:12.44949Z","shell.execute_reply.started":"2022-05-17T07:45:37.117074Z","shell.execute_reply":"2022-05-17T07:46:12.448727Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_dir = \"/kaggle/working/melspectrogram/train/\"\nbatch_size = 32\ntrain_ds = tf.keras.utils.image_dataset_from_directory(\n  data_dir,\n  seed=123,\n  image_size=(216, 216),\n  batch_size=batch_size)","metadata":{"execution":{"iopub.status.busy":"2022-05-17T08:06:34.243234Z","iopub.execute_input":"2022-05-17T08:06:34.24356Z","iopub.status.idle":"2022-05-17T08:06:34.373167Z","shell.execute_reply.started":"2022-05-17T08:06:34.243524Z","shell.execute_reply":"2022-05-17T08:06:34.372534Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_dir_val = \"/kaggle/working/melspectrogram/validation/\"\nbatch_size = 32\nval_ds = tf.keras.utils.image_dataset_from_directory(\n  data_dir_val,\n  seed=123,\n  image_size=(216, 216),\n  batch_size=batch_size)","metadata":{"execution":{"iopub.status.busy":"2022-05-17T07:56:25.544738Z","iopub.execute_input":"2022-05-17T07:56:25.545106Z","iopub.status.idle":"2022-05-17T07:56:25.666193Z","shell.execute_reply.started":"2022-05-17T07:56:25.545057Z","shell.execute_reply":"2022-05-17T07:56:25.665345Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_dir_test = \"/kaggle/working/melspectrogram/test/\"\nbatch_size = 32\ntest_ds = tf.keras.utils.image_dataset_from_directory(\n  data_dir_test,\n  seed=123,\n  image_size=(216, 216),\n  batch_size=batch_size)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class_names = val_ds.class_names\nprint(class_names)","metadata":{"execution":{"iopub.status.busy":"2022-05-17T07:56:29.558672Z","iopub.execute_input":"2022-05-17T07:56:29.559429Z","iopub.status.idle":"2022-05-17T07:56:29.564187Z","shell.execute_reply.started":"2022-05-17T07:56:29.559389Z","shell.execute_reply":"2022-05-17T07:56:29.563321Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"normalization_layer = layers.Rescaling(1./255)","metadata":{"execution":{"iopub.status.busy":"2022-05-17T07:59:40.781282Z","iopub.execute_input":"2022-05-17T07:59:40.781612Z","iopub.status.idle":"2022-05-17T07:59:40.787473Z","shell.execute_reply.started":"2022-05-17T07:59:40.781576Z","shell.execute_reply":"2022-05-17T07:59:40.786436Z"}}},{"cell_type":"markdown","source":"nor_train_ds = train_ds.map(lambda x, y: (normalization_layer(x), y))\nimage_batch, labels_batch = next(iter(nor_train_ds))\nfirst_image = image_batch[0]\n# Notice the pixel values are now in `[0,1]`.\nprint(np.min(first_image), np.max(first_image))","metadata":{"execution":{"iopub.status.busy":"2022-05-17T08:06:48.161778Z","iopub.execute_input":"2022-05-17T08:06:48.162386Z","iopub.status.idle":"2022-05-17T08:06:48.297056Z","shell.execute_reply.started":"2022-05-17T08:06:48.162348Z","shell.execute_reply":"2022-05-17T08:06:48.296183Z"}}},{"cell_type":"markdown","source":"num_classes = len(class_names)\nmodel = Sequential([\n  layers.Rescaling(1./255, input_shape=(216,216, 3)),\n  layers.Conv2D(16, 3, padding='same', activation='relu'),\n  layers.MaxPooling2D(),\n  layers.Conv2D(32, 3, padding='same', activation='relu'),\n  layers.MaxPooling2D(),\n  layers.Conv2D(64, 3, padding='same', activation='relu'),\n  layers.MaxPooling2D(),\n  layers.Dropout(0.4),\n  layers.Flatten(),\n  layers.Dense(128, activation='relu'),\n  layers.Dense(num_classes)\n])","metadata":{"execution":{"iopub.status.busy":"2022-05-16T19:10:25.920691Z","iopub.execute_input":"2022-05-16T19:10:25.921068Z","iopub.status.idle":"2022-05-16T19:10:26.256687Z","shell.execute_reply.started":"2022-05-16T19:10:25.921032Z","shell.execute_reply":"2022-05-16T19:10:26.255253Z"}}},{"cell_type":"markdown","source":"model.summary()","metadata":{"execution":{"iopub.status.busy":"2022-05-16T11:36:45.869879Z","iopub.execute_input":"2022-05-16T11:36:45.870191Z","iopub.status.idle":"2022-05-16T11:36:45.882072Z","shell.execute_reply.started":"2022-05-16T11:36:45.87015Z","shell.execute_reply":"2022-05-16T11:36:45.881067Z"}}},{"cell_type":"code","source":"input_shape = (216,216,3)\neffnet_layers = EfficientNetB0(weights=None, include_top=False, input_shape=input_shape)\n\nfor layer in effnet_layers.layers:\n    layer.trainable = True\n\ndropout_dense_layer = 0.3\n\nmodel = Sequential()\nmodel.add(Rescaling(1./255, input_shape=(216,216, 3)))\nmodel.add(effnet_layers)\nmodel.add(GlobalAveragePooling2D())\nmodel.add(Dense(256, use_bias=False))\nmodel.add(BatchNormalization())\nmodel.add(Activation('relu'))\nmodel.add(Dropout(dropout_dense_layer))\nmodel.add(Dense(len(train_df.primary_label.unique()), activation=\"softmax\"))\n\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2022-05-17T08:07:12.532456Z","iopub.execute_input":"2022-05-17T08:07:12.532781Z","iopub.status.idle":"2022-05-17T08:07:14.711557Z","shell.execute_reply.started":"2022-05-17T08:07:12.532748Z","shell.execute_reply":"2022-05-17T08:07:14.710685Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"model.compile(optimizer='adam',\n              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n              metrics=['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2022-05-16T11:36:44.035119Z","iopub.execute_input":"2022-05-16T11:36:44.035417Z","iopub.status.idle":"2022-05-16T11:36:44.049711Z","shell.execute_reply.started":"2022-05-16T11:36:44.035388Z","shell.execute_reply":"2022-05-16T11:36:44.048591Z"}}},{"cell_type":"code","source":"callbacks = [ReduceLROnPlateau(monitor='val_loss', patience=2, verbose=1, factor=0.7),\n             EarlyStopping(monitor='val_loss', patience=5),\n             ModelCheckpoint(filepath='model.h5', monitor='val_loss', save_best_only=True)]","metadata":{"execution":{"iopub.status.busy":"2022-05-17T08:07:17.485585Z","iopub.execute_input":"2022-05-17T08:07:17.485856Z","iopub.status.idle":"2022-05-17T08:07:17.491262Z","shell.execute_reply.started":"2022-05-17T08:07:17.485827Z","shell.execute_reply":"2022-05-17T08:07:17.490219Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(loss=\"sparse_categorical_crossentropy\", optimizer='adam', metrics=['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2022-05-17T08:07:19.328062Z","iopub.execute_input":"2022-05-17T08:07:19.328554Z","iopub.status.idle":"2022-05-17T08:07:19.343207Z","shell.execute_reply.started":"2022-05-17T08:07:19.328489Z","shell.execute_reply":"2022-05-17T08:07:19.342341Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"epoch = 25\nhistory = model.fit(train_ds,\n          epochs = epoch, \n          validation_data=val_ds,\n          callbacks = callbacks)","metadata":{"execution":{"iopub.status.busy":"2022-05-17T08:07:27.019095Z","iopub.execute_input":"2022-05-17T08:07:27.019576Z","iopub.status.idle":"2022-05-17T08:08:18.544868Z","shell.execute_reply.started":"2022-05-17T08:07:27.019524Z","shell.execute_reply":"2022-05-17T08:08:18.543985Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"acc = history.history['accuracy']\nval_acc = history.history['val_accuracy']\n\nloss = history.history['loss']\nval_loss = history.history['val_loss']\n\nprint(acc)\nprint(val_acc)\nprint(loss)\nprint(val_loss)","metadata":{"execution":{"iopub.status.busy":"2022-05-17T10:55:58.403105Z","iopub.execute_input":"2022-05-17T10:55:58.403535Z","iopub.status.idle":"2022-05-17T10:55:58.507844Z","shell.execute_reply.started":"2022-05-17T10:55:58.403425Z","shell.execute_reply":"2022-05-17T10:55:58.506408Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"evaluate = model.evaluate(test_ds)\nprint(evaluate)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"warnings.filterwarnings(\"ignore\")\noutput_folder = \"/kaggle/working/test/\"\nos.mkdir(output_folder)\nget_sample('../input/birdclef-2021/train_short_audio/amecro/XC114556.ogg', 'amecro', output_folder)\ntest_img = os.listdir(output_folder)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"result = []\nnum_img = 0\nfor img in test_img:\n    img_path = output_folder + img\n    img = tf.keras.utils.load_img(\n    img_path, target_size=(216,216)\n    )\n    img_array = tf.keras.utils.img_to_array(img)\n    img_array = tf.expand_dims(img_array, 0) # Create a batch\n\n    predictions = model.predict(img_array)\n    score = tf.nn.softmax(predictions[0])\n    result.append(score)\n    num_img += 1\n\nresult = pd.DataFrame(result)\nresult = pd.DataFrame(result.T)\nresult = result.sum(axis=1)/num_img","metadata":{"execution":{"iopub.status.busy":"2022-05-16T12:55:10.996218Z","iopub.execute_input":"2022-05-16T12:55:10.996923Z","iopub.status.idle":"2022-05-16T12:55:11.694207Z","shell.execute_reply.started":"2022-05-16T12:55:10.996875Z","shell.execute_reply":"2022-05-16T12:55:11.693198Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\n    \"This audio most likely belongs to {} with a {:.2f} percent confidence.\"\n    .format(class_names[np.argmax(result)], 100 * np.max(result))\n)","metadata":{"execution":{"iopub.status.busy":"2022-05-16T12:55:14.479192Z","iopub.execute_input":"2022-05-16T12:55:14.479784Z","iopub.status.idle":"2022-05-16T12:55:14.48716Z","shell.execute_reply.started":"2022-05-16T12:55:14.479738Z","shell.execute_reply":"2022-05-16T12:55:14.485674Z"},"trusted":true},"execution_count":null,"outputs":[]}]}