{"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":"none","dataSources":[{"sourceId":70203,"databundleVersionId":8068726,"sourceType":"competition"},{"sourceId":8178713,"sourceType":"datasetVersion","datasetId":4841595}],"dockerImageVersionId":30698,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"Code modified from [STEFAN KAHL](https://www.kaggle.com/stefankahl)'s [How to submit to BirdCLEF 2023](https://www.kaggle.com/code/stefankahl/how-to-submit-to-birdclef-2023). ","metadata":{}},{"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\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":{"execution":{"iopub.status.busy":"2024-04-27T23:25:13.427296Z","iopub.execute_input":"2024-04-27T23:25:13.427718Z","iopub.status.idle":"2024-04-27T23:25:13.434423Z","shell.execute_reply.started":"2024-04-27T23:25:13.427690Z","shell.execute_reply":"2024-04-27T23:25:13.433251Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow as tf\nimport tensorflow_io as tfio\nimport soundfile as sf\nimport random\nimport librosa\nimport os\nimport glob\nimport shutil\nimport zipfile\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport numpy as np\nimport plotly.express as px\nimport librosa\nfrom IPython.display import Audio\nimport pandas as pd\nimport pickle\nfrom joblib import dump, load\nfrom pathlib import Path\nfrom imblearn.over_sampling import RandomOverSampler\nimport sklearn\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import LabelEncoder\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix\nimport torch\nimport torchvision\nimport torchvision.transforms as transforms","metadata":{"execution":{"iopub.status.busy":"2024-04-27T23:25:13.436267Z","iopub.execute_input":"2024-04-27T23:25:13.436806Z","iopub.status.idle":"2024-04-27T23:25:13.451570Z","shell.execute_reply.started":"2024-04-27T23:25:13.436776Z","shell.execute_reply":"2024-04-27T23:25:13.450677Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"samples_per_sec = 32000\nsamples_per_mfcc = 128\nn_fft = 2048\nim_size = 80\nhop_length = 320\ntest_prop = 0.2\nsamples_per_bird = 20\nto_combine_ratio = 0.35\nbat_size = 32","metadata":{"execution":{"iopub.status.busy":"2024-04-27T23:25:13.452881Z","iopub.execute_input":"2024-04-27T23:25:13.453449Z","iopub.status.idle":"2024-04-27T23:25:13.464219Z","shell.execute_reply.started":"2024-04-27T23:25:13.453419Z","shell.execute_reply":"2024-04-27T23:25:13.463225Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"metadata_df = pd.read_csv('/kaggle/input/birdclef-2024/train_metadata.csv')\nmetadata_df.shape","metadata":{"execution":{"iopub.status.busy":"2024-04-27T23:25:13.465746Z","iopub.execute_input":"2024-04-27T23:25:13.466153Z","iopub.status.idle":"2024-04-27T23:25:13.690931Z","shell.execute_reply.started":"2024-04-27T23:25:13.466111Z","shell.execute_reply":"2024-04-27T23:25:13.689799Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''\nind = 0\nbird_dict = {}m\nfor i in range(len(metadata_df)):\n    calltype = metadata_df['type'][i]\n    bird = metadata_df['primary_label'][i]\n    if bird not in bird_dict.keys():\n            bird_dict[bird] = [0, 0]\n    bird_dict[bird][1] += 1\n    if 'call' not in calltype.split(\"'\") and 'song' not in calltype.split(\"'\") and 'Call' not in calltype.split(\"'\") and 'Song' not in calltype.split(\"'\"):\n       # print(calltype)\n        \n        bird_dict[bird][0] += 1\n        \n        ind += 1\nprint(ind/len(metadata_df))\ncounts = []\nfor key in bird_dict.keys():\n    bird_dict[key] = bird_dict[key][1]\n    counts.append(bird_dict[key])\n#sorted(counts)\n'''","metadata":{"_kg_hide-input":false,"execution":{"iopub.status.busy":"2024-04-27T23:25:13.693637Z","iopub.execute_input":"2024-04-27T23:25:13.693978Z","iopub.status.idle":"2024-04-27T23:25:13.701249Z","shell.execute_reply.started":"2024-04-27T23:25:13.693950Z","shell.execute_reply":"2024-04-27T23:25:13.700049Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"birds = os.listdir('/kaggle/input/birdclef-2024/train_audio')\nfiles = []\nind = 0\nfor bird in birds:\n    for file in sorted(os.listdir('/kaggle/input/birdclef-2024/train_audio/' + bird))[0:samples_per_bird]:\n        for i in range(len(metadata_df['filename'])):\n            meta_file = metadata_df['filename'][i]\n            filename = meta_file.split('/')[1]\n            if filename == file:\n                if metadata_df['secondary_labels'][i] == '[]':\n                    files.append([file, bird])\n                    break\n#print(ind)\n    \n\nrandom.shuffle(files)","metadata":{"execution":{"iopub.status.busy":"2024-04-27T23:25:13.702892Z","iopub.execute_input":"2024-04-27T23:25:13.703598Z","iopub.status.idle":"2024-04-27T23:26:36.812846Z","shell.execute_reply.started":"2024-04-27T23:25:13.703568Z","shell.execute_reply":"2024-04-27T23:26:36.811730Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train = []\ny_train = []\nind = 0\n\nfor file in files:\n    path = '/kaggle/input/birdclef-2024/train_audio/' + file[1] + '/' + file[0]\n    X, sample_rate= librosa.load(path, sr=32000)\n    interval = sample_rate/samples_per_sec\n    trimmed = X[0:X.shape[0] - (X.shape[0]%(5*sample_rate))]\n    total_sounds = []\n    \n    for i in range(1, int(len(trimmed)/sample_rate/5)+1):\n        filtered_sound = []\n\n        sound = np.array(X[(i-1)*sample_rate*5:i*sample_rate*5])\n        sound = sound/np.max(sound)\n        \n        mfccs = librosa.feature.mfcc(y=sound, sr=sample_rate, n_mfcc=samples_per_mfcc, n_fft=n_fft, hop_length=hop_length)\n\n        X_train.append(np.array(mfccs))\n        y_train.append(file[1])\n    \n    ind += 1\n    if ind%50 == 0:\n        print(float(ind/len(files)))\n\n        \nX_unfiltered = np.array(X_train)\nY_unfiltered = np.array(y_train)\n\n","metadata":{"execution":{"iopub.status.busy":"2024-04-27T23:26:36.814608Z","iopub.execute_input":"2024-04-27T23:26:36.815042Z","iopub.status.idle":"2024-04-27T23:28:55.616680Z","shell.execute_reply.started":"2024-04-27T23:26:36.815006Z","shell.execute_reply":"2024-04-27T23:28:55.615741Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"bird_lists = os.listdir('/kaggle/input/birdclef-2024/train_audio')\nfor y in Y_unfiltered:\n    if y in bird_lists:\n        bird_lists.remove(y)\nbird_lists","metadata":{"execution":{"iopub.status.busy":"2024-04-27T23:28:55.617849Z","iopub.execute_input":"2024-04-27T23:28:55.618879Z","iopub.status.idle":"2024-04-27T23:28:55.632487Z","shell.execute_reply.started":"2024-04-27T23:28:55.618847Z","shell.execute_reply":"2024-04-27T23:28:55.631211Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ind = 0\nbird_dict = {}\nfor bird in sorted(os.listdir('/kaggle/input/birdclef-2024/train_audio')):\n    bird_dict[bird] = ind\n    ind += 1\n    \nencoded_Y = []\nfor bird in Y_unfiltered:\n    encoded_Y.append(bird_dict[bird])","metadata":{"execution":{"iopub.status.busy":"2024-04-27T23:28:55.633820Z","iopub.execute_input":"2024-04-27T23:28:55.634171Z","iopub.status.idle":"2024-04-27T23:28:55.642855Z","shell.execute_reply.started":"2024-04-27T23:28:55.634128Z","shell.execute_reply":"2024-04-27T23:28:55.641905Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"combined = []\nfor i in range(0, len(encoded_Y)):\n    combined.append([X_unfiltered[i], encoded_Y[i]])\n\nrandom.shuffle(combined)\n\nprint(len(combined))\n\nkey_ind = int(len(X_unfiltered)*test_prop)\ncombined_train = combined[key_ind:]\ncombined_test = combined[:key_ind]\n\nbirds_list = list(range(0, 182))\n\nfor train_pair in combined_train:\n    if train_pair[1] in birds_list:\n        birds_list.remove(train_pair[1])\n","metadata":{"execution":{"iopub.status.busy":"2024-04-27T23:28:55.644041Z","iopub.execute_input":"2024-04-27T23:28:55.644391Z","iopub.status.idle":"2024-04-27T23:28:56.006625Z","shell.execute_reply.started":"2024-04-27T23:28:55.644365Z","shell.execute_reply":"2024-04-27T23:28:56.005467Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(len(combined_train))\nprint(len(combined_test))","metadata":{"execution":{"iopub.status.busy":"2024-04-27T23:28:56.007713Z","iopub.execute_input":"2024-04-27T23:28:56.007995Z","iopub.status.idle":"2024-04-27T23:28:56.013528Z","shell.execute_reply.started":"2024-04-27T23:28:56.007972Z","shell.execute_reply":"2024-04-27T23:28:56.012222Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nX_train = []\ny_train = []\nfor comb in combined_train:\n    X_train.append(comb[0])\n    y_train.append(comb[1])\nX_train = np.array(X_train)\ny_train = np.array(y_train)\n\nX_test = []\ny_test = []\nfor comb in combined_test:\n    X_test.append(comb[0])\n    y_test.append(comb[1])\nX_test = np.array(X_test)\ny_test = np.array(y_test)","metadata":{"execution":{"iopub.status.busy":"2024-04-27T23:28:56.015206Z","iopub.execute_input":"2024-04-27T23:28:56.015613Z","iopub.status.idle":"2024-04-27T23:28:57.082636Z","shell.execute_reply.started":"2024-04-27T23:28:56.015540Z","shell.execute_reply":"2024-04-27T23:28:57.081442Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"se = set()\nfor y in y_train:\n    se.add(y)\n    \nprint(len(se))","metadata":{"execution":{"iopub.status.busy":"2024-04-27T23:28:57.083897Z","iopub.execute_input":"2024-04-27T23:28:57.084233Z","iopub.status.idle":"2024-04-27T23:28:57.091257Z","shell.execute_reply.started":"2024-04-27T23:28:57.084205Z","shell.execute_reply":"2024-04-27T23:28:57.090191Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nfrom sklearn.metrics import mean_absolute_error\n\n\nfrom tensorflow import keras\nfrom tensorflow.keras import layers\n\nfrom tensorflow.keras import layers, models\nfrom keras.callbacks import EarlyStopping\n\nfrom sklearn.model_selection import train_test_split","metadata":{"execution":{"iopub.status.busy":"2024-04-27T23:28:57.095600Z","iopub.execute_input":"2024-04-27T23:28:57.095928Z","iopub.status.idle":"2024-04-27T23:28:57.104595Z","shell.execute_reply.started":"2024-04-27T23:28:57.095902Z","shell.execute_reply":"2024-04-27T23:28:57.103428Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_test[0][0].shape","metadata":{"execution":{"iopub.status.busy":"2024-04-27T23:28:57.105953Z","iopub.execute_input":"2024-04-27T23:28:57.106315Z","iopub.status.idle":"2024-04-27T23:28:57.120581Z","shell.execute_reply.started":"2024-04-27T23:28:57.106286Z","shell.execute_reply":"2024-04-27T23:28:57.119257Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train_to_comb = X_train[:int(len(X_train)*to_combine_ratio)]\nX_train_to_uncomb = X_train[int(len(X_train)*to_combine_ratio):]\nX_test_to_comb = X_test[:int(len(X_test)*to_combine_ratio)]\nX_test_to_uncomb = X_test[int(len(X_test)*to_combine_ratio):]\n\ny_train_to_comb = y_train[:int(len(y_train)*to_combine_ratio)]\ny_train_to_uncomb = y_train[int(len(y_train)*to_combine_ratio):]\ny_test_to_comb = y_test[:int(len(y_test)*to_combine_ratio)]\ny_test_to_uncomb = y_test[int(len(y_test)*to_combine_ratio):]","metadata":{"execution":{"iopub.status.busy":"2024-04-27T23:28:57.123121Z","iopub.execute_input":"2024-04-27T23:28:57.123667Z","iopub.status.idle":"2024-04-27T23:28:57.133394Z","shell.execute_reply.started":"2024-04-27T23:28:57.123537Z","shell.execute_reply":"2024-04-27T23:28:57.132262Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#COMBINER VERSION\n\n\nimport cv2\nimport random\n\n\ny_train_reshaped = []\nX_train_reshaped = []\n\n\nif len(X_train_to_comb)%2 != 0:\n    X_train_to_comb = X_train_to_comb[:-1]\n    y_train_to_comb = y_train_to_comb[:-1]\n    \nfor ind in range(int(len(X_train_to_comb)/2)):\n    x1 = X_train_to_comb[ind*2]\n    y1 = y_train_to_comb[ind*2]\n    x2 = X_train_to_comb[ind*2+1]\n    y2 = y_train_to_comb[ind*2+1]\n    resized1 = cv2.resize(x1, dsize=(im_size, im_size), interpolation=cv2.INTER_CUBIC)\n    resized2 = cv2.resize(x2, dsize=(im_size, im_size), interpolation=cv2.INTER_CUBIC)\n    \n    cliplength = len(resized1[0])\n    \n    \n    clip1_cutoff = random.randrange(int(cliplength*0.2), int(cliplength*0.7))\n    clip2_cutoff = random.randrange(int(cliplength*0.3), int(cliplength*0.8))\n    final = []\n    for i in range(len(resized1)):\n        local = []\n        for j in range(len(resized1[0])):\n            to_add = 0\n            if j <= clip1_cutoff:\n                to_add += resized1[i][j]\n            if j >= clip2_cutoff:\n                to_add += resized2[i][j]\n            local.append(to_add)\n        final.append([[xind1, xind1, xind1] for xind1 in local])\n    \n#    print(resized1)\n#    print(resized2)\n#    print(clip1_cutoff)\n#    print(clip2_cutoff)\n#    print(final)\n    X_train_reshaped.append(final)\n    ytemp = np.zeros(182)\n    ytemp[y1] = 1\n    ytemp[y2] = 1\n    y_train_reshaped.append(ytemp)\nX_train_reshaped = np.array(X_train_reshaped)\ny_train_reshaped = np.array(y_train_reshaped)\n    \n\n\ny_test_reshaped = []\nX_test_reshaped = []\n\n\nif len(X_test_to_comb)%2 != 0:\n    X_test_to_comb = X_test_to_comb[:-1]\n    y_test_to_comb = y_test_to_comb[:-1]\n    \nfor ind in range(int(len(X_test_to_comb)/2)):\n    x1 = X_test_to_comb[ind*2]\n    y1 = y_test_to_comb[ind*2]\n    x2 = X_test_to_comb[ind*2+1]\n    y2 = y_test_to_comb[ind*2+1]\n    resized1 = cv2.resize(x1, dsize=(im_size, im_size), interpolation=cv2.INTER_CUBIC)\n    resized2 = cv2.resize(x2, dsize=(im_size, im_size), interpolation=cv2.INTER_CUBIC)\n    \n    cliplength = len(resized1[0])\n\n    clip1_cutoff = random.randrange(int(cliplength*0.2), int(cliplength*0.7))\n    clip2_cutoff = random.randrange(int(cliplength*0.3), int(cliplength*0.8))\n    final = []\n    for i in range(len(resized1)):\n        local = []\n        for j in range(len(resized1[0])):\n            to_add = 0\n            if j <= clip1_cutoff:\n                to_add += resized1[i][j]\n            if j >= clip2_cutoff:\n                to_add += resized2[i][j]\n            local.append(to_add)\n        final.append([[xind1, xind1, xind1] for xind1 in local])\n    X_test_reshaped.append(final)\n    ytemp = np.zeros(182)\n    ytemp[y1] = 1\n    ytemp[y2] = 1\n    y_test_reshaped.append(ytemp)\nX_test_reshaped = np.array(X_test_reshaped)\ny_test_reshaped = np.array(y_test_reshaped)\n    \n\n\n","metadata":{"execution":{"iopub.status.busy":"2024-04-27T23:28:57.135174Z","iopub.execute_input":"2024-04-27T23:28:57.135492Z","iopub.status.idle":"2024-04-27T23:29:17.195878Z","shell.execute_reply.started":"2024-04-27T23:28:57.135465Z","shell.execute_reply":"2024-04-27T23:29:17.194716Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n#NON COMBINING\n\nimport cv2\n\n\nX_test_reshaped_uncomb = []\nfor x in X_test_to_uncomb:\n    resized = cv2.resize(x, dsize=(im_size, im_size), interpolation=cv2.INTER_CUBIC)\n    final = []\n    for i in range(len(resized)):\n        final.append([[li, li, li] for li in resized[i]])\n    X_test_reshaped_uncomb.append(np.array(final))\nX_test_reshaped_uncomb = np.array(X_test_reshaped_uncomb)\n\ny_test_reshaped_uncomb = []\nfor y in y_test_to_uncomb:\n    final = []\n    for i in range(182):\n        if i == y:\n            final.append(1)\n        else:\n            final.append(0)\n    y_test_reshaped_uncomb.append(final)\ny_test_reshaped_uncomb = np.array(y_test_reshaped_uncomb)\n\n    \nX_train_reshaped_uncomb = []\nfor x in X_train_to_uncomb:\n    resized = cv2.resize(x, dsize=(im_size, im_size), interpolation=cv2.INTER_CUBIC)\n    final = []\n    for i in range(len(resized)):\n        final.append([[li, li, li] for li in resized[i]])\n    X_train_reshaped_uncomb.append(np.array(final))\nX_train_reshaped_uncomb = np.array(X_train_reshaped_uncomb)\n\n\ny_train_reshaped_uncomb = []\nfor y in y_train_to_uncomb:\n    final = []\n    for i in range(182):\n        if i == y:\n            final.append(1)\n        else:\n            final.append(0)\n    y_train_reshaped_uncomb.append(final)\ny_train_reshaped_uncomb = np.array(y_train_reshaped_uncomb)\n","metadata":{"execution":{"iopub.status.busy":"2024-04-27T23:29:17.197311Z","iopub.execute_input":"2024-04-27T23:29:17.197657Z","iopub.status.idle":"2024-04-27T23:29:36.018252Z","shell.execute_reply.started":"2024-04-27T23:29:17.197631Z","shell.execute_reply":"2024-04-27T23:29:36.017216Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\ncombined_train = []\ncombined_test = []\n\n\nfor i in range(len(X_train_reshaped)):\n    combined_train.append([X_train_reshaped[i], y_train_reshaped[i]])\n    \nfor i in range(len(X_train_reshaped_uncomb)):\n    combined_train.append([X_train_reshaped_uncomb[i], y_train_reshaped_uncomb[i]])\n    \nfor i in range(len(X_test_reshaped)):\n    combined_test.append([X_test_reshaped[i], y_test_reshaped[i]])    \n    \nfor i in range(len(X_test_reshaped_uncomb)):\n    combined_test.append([X_test_reshaped_uncomb[i], y_test_reshaped_uncomb[i]])\n    \nrandom.shuffle(combined_train)\nrandom.shuffle(combined_test)\n\nX_train_balance = []\nX_test_balance = []\ny_train_balance = []\ny_test_balance = []\n\nfor comb in combined_train:\n    X_train_balance.append(comb[0])\n    y_train_balance.append(comb[1])\n\nfor comb in combined_test:\n    X_test_balance.append(comb[0])\n    y_test_balance.append(comb[1])\n    \nX_train_balance = np.array(X_train_balance)\nX_test_balance = np.array(X_test_balance)\ny_train_balance = np.array(y_train_balance)\ny_test_balance = np.array(y_test_balance)\n\n","metadata":{"execution":{"iopub.status.busy":"2024-04-27T23:29:36.019610Z","iopub.execute_input":"2024-04-27T23:29:36.019930Z","iopub.status.idle":"2024-04-27T23:29:36.756466Z","shell.execute_reply.started":"2024-04-27T23:29:36.019903Z","shell.execute_reply":"2024-04-27T23:29:36.755115Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"input_shape = X_train_reshaped_uncomb[0].shape\noutput_units = len(os.listdir(\"/kaggle/input/birdclef-2024/train_audio\"))\navg_labels = 2*len(X_train_reshaped)/len(X_train_balance) + len(X_train_reshaped_uncomb)/len(X_train_balance)","metadata":{"execution":{"iopub.status.busy":"2024-04-27T23:29:36.757963Z","iopub.execute_input":"2024-04-27T23:29:36.758393Z","iopub.status.idle":"2024-04-27T23:29:36.765475Z","shell.execute_reply.started":"2024-04-27T23:29:36.758362Z","shell.execute_reply":"2024-04-27T23:29:36.764223Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torch.optim as optim\nimport torchvision\n\nclass Net(nn.Module):\n        \n    def __init__(self):\n        super().__init__()\n\n        self.conv1 = nn.Conv2d(in_channels=input_shape[2], out_channels=32, kernel_size=3, stride=2, padding=1)\n        self.act1 = nn.ReLU()\n        self.batch1 = nn.BatchNorm2d(32)\n        self.maxp1 = nn.MaxPool2d(kernel_size = 2)\n        self.batch2 = nn.BatchNorm2d(32)\n        self.conv2 = nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3, padding=1)\n        self.act2 = nn.ReLU()\n        self.batch3 = nn.BatchNorm2d(64)\n        self.maxp2 = nn.MaxPool2d(kernel_size = 2)\n        self.batch4 = nn.BatchNorm2d(64)\n        self.conv3 = nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3, padding=1)\n        self.act3 = nn.ReLU()\n        self.batch5 = nn.BatchNorm2d(128)\n        self.maxp3 = nn.MaxPool2d(kernel_size = 2)\n        self.batch6 = nn.BatchNorm2d(128)\n        self.flat = nn.Flatten()\n        self.lin1 = nn.Linear(in_features= 3200, out_features=256)\n        self.act4 = nn.ReLU()\n        self.batch7 = nn.BatchNorm1d(256)\n        self.drop1 = nn.Dropout(0.5)\n        self.out = nn.Linear(in_features=256, out_features=output_units)\n        self.outact = nn.Sigmoid()\n\n\n    def forward(self, x):\n        x = self.act1(self.conv1(x))\n        x = self.batch2(self.maxp1(self.batch1(x)))\n        x = self.act2(self.conv2(x))\n        x = self.batch4(self.maxp2(self.batch3(x)))\n        x = self.act3(self.conv3(x))\n        x = self.batch6(self.maxp3(self.batch5(x)))\n        x = self.flat(x)\n        x = self.act4(self.lin1(x))\n        x = self.drop1(self.batch7(x))\n        x = self.outact(self.out(x))\n        return x\n\nmodel = Net()","metadata":{"execution":{"iopub.status.busy":"2024-04-27T23:29:36.766824Z","iopub.execute_input":"2024-04-27T23:29:36.767194Z","iopub.status.idle":"2024-04-27T23:29:36.792929Z","shell.execute_reply.started":"2024-04-27T23:29:36.767158Z","shell.execute_reply":"2024-04-27T23:29:36.792071Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch\nimport numpy as np\nfrom torch.utils.data import TensorDataset, DataLoader\n\n\nloss_fn = nn.BCELoss()\noptimizer = torch.optim.Adam(model.parameters(), lr=1e-4)\n\ntrain_dataset = TensorDataset(torch.Tensor(X_train_balance), torch.Tensor(y_train_balance))\ntrain_dataloader = DataLoader(train_dataset, batch_size=bat_size, shuffle=True, drop_last=True)\n\ntest_dataset = TensorDataset(torch.Tensor(X_test_balance), torch.Tensor(y_test_balance))\ntest_dataloader = DataLoader(test_dataset, batch_size=bat_size, shuffle=True, drop_last=True)","metadata":{"execution":{"iopub.status.busy":"2024-04-27T23:29:36.794384Z","iopub.execute_input":"2024-04-27T23:29:36.795128Z","iopub.status.idle":"2024-04-27T23:29:37.125454Z","shell.execute_reply.started":"2024-04-27T23:29:36.795094Z","shell.execute_reply":"2024-04-27T23:29:37.124287Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"positive_label_relative_weight = 1\n\nimport math\n'''\ndef my_loss(output, target):\n    total_loss = 0\n    for i in range(len(output)):\n        local_log_loss = 0\n        for j in range(len(output[0])):\n            pred = float(output[i][j])\n            label = float(target[i][j])\n            \n            local_log_loss += label * math.log(pred) + (1-label) * math.log(1-pred)\n        total_loss += local_log_loss \n    \n    return torch.Tensor(np.array([total_loss * -1 * 1/(len(output[0]) * len(output))]))[0]\n    \n\n'''\nimport torch.nn as nn\n\nclass CustomLoss(nn.Module):\n    def __init__(self):\n        super(CustomLoss, self).__init__()\n\n    def forward(self, inputs, targets):\n        loss = -1 * (targets * torch.log(inputs) * positive_label_relative_weight + (1 - targets) * torch.log(1 - inputs))\n        return loss.mean()\nmy_loss = CustomLoss()","metadata":{"execution":{"iopub.status.busy":"2024-04-27T23:29:37.127047Z","iopub.execute_input":"2024-04-27T23:29:37.127477Z","iopub.status.idle":"2024-04-27T23:29:37.138513Z","shell.execute_reply.started":"2024-04-27T23:29:37.127438Z","shell.execute_reply":"2024-04-27T23:29:37.137182Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"n_epochs = 30\nnormal_acc_stop = 1\n\nmodel.train()\nfor epoch in range(n_epochs):\n    \n    for inputs, labels in train_dataloader:\n        inputs = inputs.permute(0, 3, 1, 2)\n        y_pred = model(inputs)\n        \n        \n       # loss = loss_fn(y_pred, labels)\n        other_loss = my_loss(y_pred, labels)\n       # print(loss.shape)\n        #print(loss, ', ', other_loss)\n        optimizer.zero_grad()\n        other_loss.backward()\n        optimizer.step()\n\n    acc = 0\n    count = 0\n    \n    important_acc = 0\n    important_count = 0\n    false_positives = 0\n    false_negatives = 0\n    for inputs, labels in test_dataloader:\n        inputs = inputs.permute(0, 3, 1, 2)\n        y_pred = model(inputs)\n        \n        for yind in range(len(y_pred)):\n            for predind in range(len(y_pred[0])):\n                sigma = float(y_pred[yind][predind])\n                if sigma >= 0.5:\n                    sigma = 1\n                else:\n                    sigma = 0\n                if sigma == int(labels[yind][predind]):\n                    acc += 1\n                    \n                    \n                if int(labels[yind][predind]) == 1:\n                    important_count += 1\n                    if sigma == int(labels[yind][predind]):\n                        important_acc += 1\n                    else:\n                        false_negatives += 1\n                \n                if int(labels[yind][predind]) == 0:\n                    if sigma != int(labels[yind][predind]):\n                        false_positives += 1\n        count += len(labels) * output_units\n        \n        \n    acc /= count\n    important_acc /= important_count\n    false_positives /= (len(test_dataloader)*bat_size)\n    false_negatives /= (len(test_dataloader)*bat_size)\n    print(\"Epoch \", epoch, 'normal acc: ',  acc, ', important acc: ', important_acc)\n    \n    if acc > normal_acc_stop: \n        break","metadata":{"execution":{"iopub.status.busy":"2024-04-27T23:29:37.140557Z","iopub.execute_input":"2024-04-27T23:29:37.140986Z","iopub.status.idle":"2024-04-27T23:32:36.063688Z","shell.execute_reply.started":"2024-04-27T23:29:37.140939Z","shell.execute_reply":"2024-04-27T23:32:36.062400Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.eval()\nmodel(torch.Tensor(X_test_balance)[0:1].permute(0, 3, 1, 2))","metadata":{"execution":{"iopub.status.busy":"2024-04-27T23:32:36.065292Z","iopub.execute_input":"2024-04-27T23:32:36.065728Z","iopub.status.idle":"2024-04-27T23:32:36.115099Z","shell.execute_reply.started":"2024-04-27T23:32:36.065688Z","shell.execute_reply":"2024-04-27T23:32:36.113992Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport numpy as np\nimport pandas as pd\nimport librosa\n\n\n\n# First, load list of audio files by parsing the test_soundscape folder.\ntest_audio_dir = '../input/birdclef-2024/test_soundscapes/'\n\nfile_list = [f for f in sorted(os.listdir(test_audio_dir))]\nfile_list = [file.split('.')[0] for file in file_list if file.endswith('.ogg')]\n\nprint('Number of test soundscapes:', len(file_list))","metadata":{"execution":{"iopub.status.busy":"2024-04-27T23:32:36.116246Z","iopub.execute_input":"2024-04-27T23:32:36.116648Z","iopub.status.idle":"2024-04-27T23:32:36.128943Z","shell.execute_reply.started":"2024-04-27T23:32:36.116619Z","shell.execute_reply":"2024-04-27T23:32:36.126983Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import time\n# This is where we will store our results\npred = {'row_id': []}\ntrain_audio_dir = '../input/birdclef-2024/train_audio/'\nspecies_list = sorted(os.listdir(train_audio_dir))\nfor species_code in species_list:\n    pred[species_code] = []\n\n# Process audio files and make predictions\nfor afile in file_list:\n    start_time = time.time()\n    \n    path = test_audio_dir + afile + '.ogg'\n    \n    X, sample_rate = librosa.load(path, sr=32000)\n    trimmed = X[0:X.shape[0] - (X.shape[0]%(5*sample_rate))]\n    chunks = []\n\n    for i in range(1, int(len(trimmed)/sample_rate/5)+1):\n        sound = np.array(X[(i-1)*sample_rate*5:i*sample_rate*5])\n        sound = sound/np.max(sound)\n        \n        mfccs = librosa.feature.mfcc(y=sound, sr=sample_rate, n_mfcc=samples_per_mfcc, n_fft=n_fft, hop_length=hop_length)\n        chunks.append(np.array(mfccs))\n    chunks = np.array(chunks)\n    \n    chunks_reshaped = []\n    for x in chunks:\n        resized = cv2.resize(x, dsize=(im_size, im_size), interpolation=cv2.INTER_CUBIC)\n        final = []\n        for i in range(len(resized)):\n            final.append([[li, li, li] for li in resized[i]])\n        chunks_reshaped.append(np.array(final))\n    chunks_reshaped = np.array(chunks_reshaped)\n\n    \n \n        \n\n\n    for i in range(len(chunks_reshaped)):        \n        chunk_end_time = (i + 1) * 5\n        row_id = afile + '_' + str(chunk_end_time)\n        pred['row_id'].append(row_id)\n        \n        prediction = model(torch.Tensor(chunks_reshaped[i:i+1]).permute(0, 3, 1, 2))[0]\n\n        for i in range(len(species_list)):\n            bird = species_list[i]\n            \n            \n            sigmoid_score = float(prediction[i])\n            score = 0\n            \n            if sigmoid_score >= 0.5:\n                score = 1\n            \n            else:\n                score = 0\n            \n            \n            pred[bird].append(sigmoid_score)\n    print(time.time()-start_time)","metadata":{"execution":{"iopub.status.busy":"2024-04-27T23:32:36.131766Z","iopub.execute_input":"2024-04-27T23:32:36.132203Z","iopub.status.idle":"2024-04-27T23:32:36.145585Z","shell.execute_reply.started":"2024-04-27T23:32:36.132135Z","shell.execute_reply":"2024-04-27T23:32:36.144686Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Make a new data frame and look at some results        \nresults = pd.DataFrame(pred, columns = ['row_id'] + species_list)\n\n# Quick sanity check\nprint(results.head()) \n    \n# Convert our results to csv\nresults.to_csv(\"submission.csv\", index=False)    ","metadata":{"execution":{"iopub.status.busy":"2024-04-27T23:32:36.146820Z","iopub.execute_input":"2024-04-27T23:32:36.147954Z","iopub.status.idle":"2024-04-27T23:32:36.176629Z","shell.execute_reply.started":"2024-04-27T23:32:36.147913Z","shell.execute_reply":"2024-04-27T23:32:36.175437Z"},"trusted":true},"execution_count":null,"outputs":[]}]}