{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":19596,"databundleVersionId":1292430,"sourceType":"competition"}],"dockerImageVersionId":30683,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\n# for dirname, _, filenames in os.walk('/kaggle/input'):\n#     for filename in filenames:\n#         print(os.path.join(dirname, filename))\n#         break\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-04-18T12:46:44.232177Z","iopub.execute_input":"2024-04-18T12:46:44.232941Z","iopub.status.idle":"2024-04-18T12:46:44.237942Z","shell.execute_reply.started":"2024-04-18T12:46:44.232906Z","shell.execute_reply":"2024-04-18T12:46:44.236973Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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\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\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()","metadata":{"execution":{"iopub.status.busy":"2024-04-18T12:46:49.130454Z","iopub.execute_input":"2024-04-18T12:46:49.131189Z","iopub.status.idle":"2024-04-18T12:46:49.140708Z","shell.execute_reply.started":"2024-04-18T12:46:49.131156Z","shell.execute_reply":"2024-04-18T12:46:49.139664Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tf.__version__","metadata":{"execution":{"iopub.status.busy":"2024-04-18T14:22:18.908476Z","iopub.execute_input":"2024-04-18T14:22:18.909283Z","iopub.status.idle":"2024-04-18T14:22:18.915228Z","shell.execute_reply.started":"2024-04-18T14:22:18.909245Z","shell.execute_reply":"2024-04-18T14:22:18.914332Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pip list | grep tensorflow","metadata":{"execution":{"iopub.status.busy":"2024-04-18T15:22:58.655863Z","iopub.execute_input":"2024-04-18T15:22:58.656732Z","iopub.status.idle":"2024-04-18T15:23:03.248363Z","shell.execute_reply.started":"2024-04-18T15:22:58.656696Z","shell.execute_reply":"2024-04-18T15:23:03.247190Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = pd.read_csv('/kaggle/input/birdsong-recognition/train.csv')\ntrain_df.head()","metadata":{"execution":{"iopub.status.busy":"2024-04-18T12:46:57.713389Z","iopub.execute_input":"2024-04-18T12:46:57.719226Z","iopub.status.idle":"2024-04-18T12:46:58.044878Z","shell.execute_reply.started":"2024-04-18T12:46:57.719176Z","shell.execute_reply":"2024-04-18T12:46:58.043947Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = train_df.query(\"rating>=4\")\n\nbirds_count = {}\nfor bird_species, count in zip(train_df.ebird_code.unique(), train_df.groupby(\"ebird_code\")[\"ebird_code\"].count().values):\n    birds_count[bird_species] = count\nmost_represented_birds = [key for key,value in birds_count.items() if value == 100]\n\ntrain_df = train_df.query(\"ebird_code in @most_represented_birds\")\ntrain_df.shape","metadata":{"execution":{"iopub.status.busy":"2024-04-18T12:47:00.610435Z","iopub.execute_input":"2024-04-18T12:47:00.611371Z","iopub.status.idle":"2024-04-18T12:47:00.653596Z","shell.execute_reply.started":"2024-04-18T12:47:00.611334Z","shell.execute_reply":"2024-04-18T12:47:00.652713Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(train_df.ebird_code.unique())","metadata":{"execution":{"iopub.status.busy":"2024-04-18T12:47:03.071508Z","iopub.execute_input":"2024-04-18T12:47:03.072349Z","iopub.status.idle":"2024-04-18T12:47:03.079148Z","shell.execute_reply.started":"2024-04-18T12:47:03.072320Z","shell.execute_reply":"2024-04-18T12:47:03.078182Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"birds_to_recognise = sorted(shuffle(most_represented_birds)[:20])\nbirds_to_recognise","metadata":{"execution":{"iopub.status.busy":"2024-04-18T12:47:05.975740Z","iopub.execute_input":"2024-04-18T12:47:05.976120Z","iopub.status.idle":"2024-04-18T12:47:05.983114Z","shell.execute_reply.started":"2024-04-18T12:47:05.976090Z","shell.execute_reply":"2024-04-18T12:47:05.982165Z"},"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    #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 = librosa.feature.melspectrogram(y=song_sample, sr=wave_rate, n_mels=N_mels) # Converts audio to mel spectrum\n            db = librosa.power_to_db(mel) # Converts into decibel unit.\n            normalised_db = sklearn.preprocessing.minmax_scale(db) # Normalize the Spectrogram Data\n            filename = str(uuid4())+\".tif\"\n            # Converts the normalized data to an 8-bit format, suitable for image creation, and stacks the single-channel data into three channels (RGB) to form a color image.\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                                            \"bird\":bird})\n    return samples_from_file","metadata":{"execution":{"iopub.status.busy":"2024-04-18T12:47:09.859974Z","iopub.execute_input":"2024-04-18T12:47:09.860694Z","iopub.status.idle":"2024-04-18T12:47:09.869583Z","shell.execute_reply.started":"2024-04-18T12:47:09.860661Z","shell.execute_reply":"2024-04-18T12:47:09.868598Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nwarnings.filterwarnings(\"ignore\")\nsamples_df = pd.DataFrame(columns=[\"song_sample\",\"bird\"])\n\n#We limit the number of audio files being sampled to 1000 in this notebook to save time\n#on top of having limited the number of bird species previously\nsample_limit= 1000\nsample_list = []\n\noutput_folder = \"/kaggle/working/melspectrogram_dataset/\"\nos.mkdir(output_folder)\nwith tqdm(total=sample_limit) as pbar:\n    for idx, row in train_df[:sample_limit].iterrows():\n        pbar.update(1)\n        try:\n            audio_file_path = \"/kaggle/input/birdsong-recognition/train_audio/\"\n            audio_file_path += row.ebird_code\n            \n            if row.ebird_code in birds_to_recognise:\n                sample_list += get_sample('{}/{}'.format(audio_file_path, row.filename), row.ebird_code, output_folder)\n            else:\n                sample_list += get_sample('{}/{}'.format(audio_file_path, row.filename), \"nocall\", output_folder)\n        except:\n            raise\n            print(\"{} is corrupted\".format(audio_file_path))\n            \nsamples_df = pd.DataFrame(sample_list)\nsamples_df.head()","metadata":{"execution":{"iopub.status.busy":"2024-04-18T12:47:12.881152Z","iopub.execute_input":"2024-04-18T12:47:12.882609Z","iopub.status.idle":"2024-04-18T13:03:17.094065Z","shell.execute_reply.started":"2024-04-18T12:47:12.882558Z","shell.execute_reply":"2024-04-18T13:03:17.092491Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"samples_df.iloc[0].song_sample","metadata":{"execution":{"iopub.status.busy":"2024-04-18T13:03:19.969469Z","iopub.execute_input":"2024-04-18T13:03:19.970230Z","iopub.status.idle":"2024-04-18T13:03:19.976594Z","shell.execute_reply.started":"2024-04-18T13:03:19.970197Z","shell.execute_reply":"2024-04-18T13:03:19.975638Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"demo_img = Image.open(samples_df.iloc[0].song_sample)\nplt.imshow(demo_img)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-04-18T13:03:22.243316Z","iopub.execute_input":"2024-04-18T13:03:22.244079Z","iopub.status.idle":"2024-04-18T13:03:22.614591Z","shell.execute_reply.started":"2024-04-18T13:03:22.244045Z","shell.execute_reply":"2024-04-18T13:03:22.612933Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"samples_df = shuffle(samples_df)\nsamples_df[:10]","metadata":{"execution":{"iopub.status.busy":"2024-04-18T13:03:26.520858Z","iopub.execute_input":"2024-04-18T13:03:26.521486Z","iopub.status.idle":"2024-04-18T13:03:26.534087Z","shell.execute_reply.started":"2024-04-18T13:03:26.521451Z","shell.execute_reply":"2024-04-18T13:03:26.532961Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"training_percentage = 0.9\ntraining_item_count = int(len(samples_df)*training_percentage)\nvalidation_item_count = len(samples_df)-int(len(samples_df)*training_percentage)\ntraining_df = samples_df[:training_item_count]\nvalidation_df = samples_df[training_item_count:]","metadata":{"execution":{"iopub.status.busy":"2024-04-18T13:03:29.191829Z","iopub.execute_input":"2024-04-18T13:03:29.192598Z","iopub.status.idle":"2024-04-18T13:03:29.198806Z","shell.execute_reply.started":"2024-04-18T13:03:29.192565Z","shell.execute_reply":"2024-04-18T13:03:29.197810Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"classes_to_predict = sorted(samples_df.bird.unique())\ninput_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(effnet_layers)\n    \nmodel.add(GlobalAveragePooling2D())\nmodel.add(Dense(256, use_bias=False))\nmodel.add(BatchNormalization())\nmodel.add(Activation('relu'))\nmodel.add(Dropout(dropout_dense_layer))\n\nmodel.add(Dense(len(classes_to_predict), activation=\"softmax\"))\n\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2024-04-18T13:03:31.686458Z","iopub.execute_input":"2024-04-18T13:03:31.687132Z","iopub.status.idle":"2024-04-18T13:03:32.458807Z","shell.execute_reply.started":"2024-04-18T13:03:31.687098Z","shell.execute_reply":"2024-04-18T13:03:32.457928Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"classes_to_predict","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"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='BirdIdentify.keras', monitor='val_loss', save_best_only=True)]\nmodel.compile(loss=\"categorical_crossentropy\", optimizer='adam')\n","metadata":{"execution":{"iopub.status.busy":"2024-04-18T13:06:32.942966Z","iopub.execute_input":"2024-04-18T13:06:32.943372Z","iopub.status.idle":"2024-04-18T13:06:32.954302Z","shell.execute_reply.started":"2024-04-18T13:06:32.943336Z","shell.execute_reply":"2024-04-18T13:06:32.953355Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.utils.class_weight import compute_sample_weight\n\n# Assuming `samples_df.bird.values` contains your target variable (classes/labels for each sample)\nsample_weights = compute_sample_weight(class_weight='balanced', y=samples_df.bird.values)\n\n# If you need class weights in the format of a dictionary:\nimport numpy as np\n\n# Calculate unique classes and their corresponding weights\nclasses, weights = np.unique(samples_df.bird.values, return_counts=True)\nclass_weights = weights.sum() / (len(classes) * weights)\n\nclass_weights_dict = {classes[i]: class_weights[i] for i in range(len(classes))}","metadata":{"execution":{"iopub.status.busy":"2024-04-18T13:08:19.043185Z","iopub.execute_input":"2024-04-18T13:08:19.043899Z","iopub.status.idle":"2024-04-18T13:08:19.079025Z","shell.execute_reply.started":"2024-04-18T13:08:19.043847Z","shell.execute_reply":"2024-04-18T13:08:19.077870Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"training_batch_size = 32\nvalidation_batch_size = 32\ntarget_size = (216,216)\n\ntrain_datagen = ImageDataGenerator(\n    rescale=1. / 255\n)\n\ntrain_generator = train_datagen.flow_from_dataframe(\n    dataframe = training_df,\n    x_col='song_sample',\n    y_col='bird',\n    directory='/',\n    target_size=target_size,\n    batch_size=training_batch_size,\n    shuffle=True,\n    class_mode='categorical')\n\n\nvalidation_datagen = ImageDataGenerator(rescale=1. / 255)\nvalidation_generator = validation_datagen.flow_from_dataframe(\n    dataframe = validation_df,\n    x_col='song_sample',\n    y_col='bird',\n    directory='/',\n    target_size=target_size,\n    shuffle=False,\n    batch_size=validation_batch_size,\n    class_mode='categorical')","metadata":{"execution":{"iopub.status.busy":"2024-04-18T13:09:30.253015Z","iopub.execute_input":"2024-04-18T13:09:30.253738Z","iopub.status.idle":"2024-04-18T13:09:30.425864Z","shell.execute_reply.started":"2024-04-18T13:09:30.253706Z","shell.execute_reply":"2024-04-18T13:09:30.424914Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = model.fit(train_generator,\n          epochs = 20, \n          validation_data=validation_generator,\n#           class_weight=class_weights_dict,\n          callbacks=callbacks)","metadata":{"execution":{"iopub.status.busy":"2024-04-18T13:09:44.319417Z","iopub.execute_input":"2024-04-18T13:09:44.320302Z","iopub.status.idle":"2024-04-18T13:24:43.050585Z","shell.execute_reply.started":"2024-04-18T13:09:44.320267Z","shell.execute_reply":"2024-04-18T13:24:43.049458Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.plot(history.history['loss'])\nplt.plot(history.history['val_loss'])\nplt.title('Loss over epochs')\nplt.ylabel('Loss')\nplt.xlabel('Epoch')\nplt.legend(['Train', 'Validation'], loc='best')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-04-18T14:22:27.940808Z","iopub.execute_input":"2024-04-18T14:22:27.941677Z","iopub.status.idle":"2024-04-18T14:22:28.342813Z","shell.execute_reply.started":"2024-04-18T14:22:27.941642Z","shell.execute_reply":"2024-04-18T14:22:28.341854Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Assume model and validation_generator are already defined and loaded\npreds = model.predict(validation_generator)\n\n# Initialize an empty DataFrame to store predictions and ground truths\nvalidation_df = pd.DataFrame(columns=[\"prediction\", \"groundtruth\", \"correct_prediction\"])\n\n# Get the first batch from the generator\nbatch = validation_generator.__getitem__(0)\n\n# Initialize a list to collect data dictionaries\ndata_list = []\n\n# Iterate through the batch to process predictions and actual labels\nfor pred, groundtruth in zip(preds[:16], batch[1]):\n    data_list.append({\n        \"prediction\": classes_to_predict[np.argmax(pred)],\n        \"groundtruth\": classes_to_predict[np.argmax(groundtruth)],\n        \"correct_prediction\": np.argmax(pred) == np.argmax(groundtruth)\n    })\n\n# Convert the list of dictionaries to a DataFrame and concatenate with the existing DataFrame\nvalidation_df = pd.concat([validation_df, pd.DataFrame(data_list)], ignore_index=True)\n\nprint(validation_df)\n","metadata":{"execution":{"iopub.status.busy":"2024-04-18T13:30:35.135863Z","iopub.execute_input":"2024-04-18T13:30:35.136769Z","iopub.status.idle":"2024-04-18T13:30:36.967922Z","shell.execute_reply.started":"2024-04-18T13:30:35.136733Z","shell.execute_reply":"2024-04-18T13:30:36.966917Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!rm -rf /kaggle/working/melspectrogram_dataset","metadata":{"execution":{"iopub.status.busy":"2024-04-18T13:30:59.422447Z","iopub.execute_input":"2024-04-18T13:30:59.423293Z","iopub.status.idle":"2024-04-18T13:31:02.011019Z","shell.execute_reply.started":"2024-04-18T13:30:59.423257Z","shell.execute_reply":"2024-04-18T13:31:02.009596Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.load_weights(\"BirdIdentify.keras\")","metadata":{"execution":{"iopub.status.busy":"2024-04-18T15:46:16.154523Z","iopub.execute_input":"2024-04-18T15:46:16.155111Z","iopub.status.idle":"2024-04-18T15:46:19.148268Z","shell.execute_reply.started":"2024-04-18T15:46:16.155080Z","shell.execute_reply":"2024-04-18T15:46:19.147434Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def predict_on_melspectrogram(song_sample, sample_length):\n    N_mels=216\n\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        db_array = (np.asarray(normalised_db)*255).astype(np.uint8)\n\n        prediction = model.predict(np.array([np.array([db_array, db_array, db_array]).T]))\n        predicted_bird = classes_to_predict[np.argmax(prediction)]\n        return predicted_bird\n    else:\n        return \"nocall\"","metadata":{"execution":{"iopub.status.busy":"2024-04-18T13:31:42.010395Z","iopub.execute_input":"2024-04-18T13:31:42.011166Z","iopub.status.idle":"2024-04-18T13:31:42.017934Z","shell.execute_reply.started":"2024-04-18T13:31:42.011134Z","shell.execute_reply":"2024-04-18T13:31:42.016873Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def predict_submission(df, audio_file_path):\n        \n    loaded_audio_sample = []\n    previous_filename = \"\"\n    wave_data = []\n    wave_rate = None\n    sample_length = None\n    \n    for idx,row in df.iterrows():\n        #I added this exception as I've heard that some files may be corrupted.\n        try:\n            if previous_filename == \"\" or previous_filename!=row.audio_id:\n                filename = '{}/{}.mp3'.format(audio_file_path, row.audio_id)\n                wave_data, wave_rate = librosa.load(filename)\n                sample_length = 5*wave_rate\n            previous_filename = row.audio_id\n\n            #basically allows to check if we are running the examples or the test set.\n            if \"site\" in df.columns:\n                if row.site==\"site_1\" or row.site==\"site_2\":\n                    song_sample = np.array(wave_data[int(row.seconds-5)*wave_rate:int(row.seconds)*wave_rate])\n                elif row.site==\"site_3\":\n                    #for now, I only take the first 5s of the samples from site_3 as they are groundtruthed at file level\n                    song_sample = np.array(wave_data[0:sample_length])\n            else:\n                #same as the first condition but I isolated it for later and it is for the example file\n                song_sample = np.array(wave_data[int(row.seconds-5)*wave_rate:int(row.seconds)*wave_rate])\n            \n            predicted_bird = predict_on_melspectrogram(song_sample, sample_length)\n            df.at[idx,\"birds\"] = predicted_bird\n        except:\n            df.at[idx,\"birds\"] = \"nocall\"\n    return df","metadata":{"execution":{"iopub.status.busy":"2024-04-18T13:31:58.966707Z","iopub.execute_input":"2024-04-18T13:31:58.967364Z","iopub.status.idle":"2024-04-18T13:31:58.978181Z","shell.execute_reply.started":"2024-04-18T13:31:58.967330Z","shell.execute_reply":"2024-04-18T13:31:58.977102Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"audio_file_path = \"/kaggle/input/birdsong-recognition/example_test_audio\"\nexample_df = pd.read_csv(\"/kaggle/input/birdsong-recognition/example_test_audio_summary.csv\")\n#Ajusting the example filenames and creating the audio_id column to match with the test file.\nexample_df[\"audio_id\"] = [ \"BLKFR-10-CPL_20190611_093000.pt540\" if filename==\"BLKFR-10-CPL\" else \"ORANGE-7-CAP_20190606_093000.pt623\" for filename in example_df[\"filename\"]]\n\nif os.path.exists(audio_file_path):\n    example_df = predict_submission(example_df, audio_file_path)\nexample_df","metadata":{"execution":{"iopub.status.busy":"2024-04-18T13:32:07.782780Z","iopub.execute_input":"2024-04-18T13:32:07.783173Z","iopub.status.idle":"2024-04-18T13:32:08.321741Z","shell.execute_reply.started":"2024-04-18T13:32:07.783140Z","shell.execute_reply":"2024-04-18T13:32:08.320620Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_file_path = \"/kaggle/input/birdsong-recognition/test_audio\"\ntest_df = pd.read_csv(\"/kaggle/input/birdsong-recognition/test.csv\")\nsubmission_df = pd.read_csv(\"/kaggle/input/birdsong-recognition/sample_submission.csv\")\n\nif os.path.exists(test_file_path):\n    submission_df = predict_submission(test_df, test_file_path)\n\nsubmission_df[[\"row_id\",\"birds\"]].to_csv('submission.csv', index=False)\nsubmission_df.head()","metadata":{"execution":{"iopub.status.busy":"2024-04-18T13:32:18.391772Z","iopub.execute_input":"2024-04-18T13:32:18.392173Z","iopub.status.idle":"2024-04-18T13:32:18.423771Z","shell.execute_reply.started":"2024-04-18T13:32:18.392142Z","shell.execute_reply":"2024-04-18T13:32:18.422738Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_json = model.to_json()","metadata":{"execution":{"iopub.status.busy":"2024-04-18T15:34:53.941537Z","iopub.execute_input":"2024-04-18T15:34:53.942517Z","iopub.status.idle":"2024-04-18T15:34:54.061370Z","shell.execute_reply.started":"2024-04-18T15:34:53.942481Z","shell.execute_reply":"2024-04-18T15:34:54.060422Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with open('model_architecture.json', 'w') as json_file:\n    json_file.write(model_json)","metadata":{"execution":{"iopub.status.busy":"2024-04-18T15:35:13.030900Z","iopub.execute_input":"2024-04-18T15:35:13.031606Z","iopub.status.idle":"2024-04-18T15:35:13.036306Z","shell.execute_reply.started":"2024-04-18T15:35:13.031572Z","shell.execute_reply":"2024-04-18T15:35:13.035378Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.models import load_model\ninference_model = load_model('BirdIdentify.keras')","metadata":{"execution":{"iopub.status.busy":"2024-04-18T15:45:06.823615Z","iopub.execute_input":"2024-04-18T15:45:06.824452Z","iopub.status.idle":"2024-04-18T15:45:07.767466Z","shell.execute_reply.started":"2024-04-18T15:45:06.824421Z","shell.execute_reply":"2024-04-18T15:45:07.765966Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.save(filepath='IdentifyBird.keras')","metadata":{"execution":{"iopub.status.busy":"2024-04-18T16:12:27.999823Z","iopub.execute_input":"2024-04-18T16:12:28.000704Z","iopub.status.idle":"2024-04-18T16:12:28.306701Z","shell.execute_reply.started":"2024-04-18T16:12:28.000669Z","shell.execute_reply":"2024-04-18T16:12:28.305417Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}