{"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"},{"sourceId":25954,"databundleVersionId":2091745,"sourceType":"competition"},{"sourceId":33246,"databundleVersionId":3221581,"sourceType":"competition"},{"sourceId":44224,"databundleVersionId":5188730,"sourceType":"competition"},{"sourceId":1487019,"sourceType":"datasetVersion","datasetId":726237},{"sourceId":1487116,"sourceType":"datasetVersion","datasetId":726312},{"sourceId":5195317,"sourceType":"datasetVersion","datasetId":3020983}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip install --upgrade pip","metadata":{"execution":{"iopub.status.busy":"2024-02-06T06:19:23.739408Z","iopub.execute_input":"2024-02-06T06:19:23.740126Z","iopub.status.idle":"2024-02-06T06:19:27.289471Z","shell.execute_reply.started":"2024-02-06T06:19:23.740094Z","shell.execute_reply":"2024-02-06T06:19:27.288619Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install -q tensorflow-addons==0.19.0\n!pip install -q tensorflow-probability==0.19.0\n!pip install -q tensorflow-io==0.32.0\n!pip install -q opencv-python-headless\n!pip install -q librosa\n!pip install -q scikit-learn\n!pip install -qU wandb","metadata":{"_kg_hide-output":true,"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-02-06T06:19:31.244902Z","iopub.execute_input":"2024-02-06T06:19:31.245698Z","iopub.status.idle":"2024-02-06T06:19:55.425831Z","shell.execute_reply.started":"2024-02-06T06:19:31.245663Z","shell.execute_reply":"2024-02-06T06:19:55.424496Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pip install tensorflow-addons\n","metadata":{"execution":{"iopub.status.busy":"2024-02-06T10:33:05.381883Z","iopub.execute_input":"2024-02-06T10:33:05.382905Z","iopub.status.idle":"2024-02-06T10:33:19.138527Z","shell.execute_reply.started":"2024-02-06T10:33:05.382861Z","shell.execute_reply":"2024-02-06T10:33:19.137301Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n!pip install -qU tensorflow_extra --no-deps\n\n!pip install -qU git+https://github.com/awsaf49/efficientnet-spec","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2024-02-06T10:34:50.806954Z","iopub.execute_input":"2024-02-06T10:34:50.807334Z","iopub.status.idle":"2024-02-06T10:35:07.501148Z","shell.execute_reply.started":"2024-02-06T10:34:50.807302Z","shell.execute_reply":"2024-02-06T10:35:07.499907Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install tensorflow-addons\n","metadata":{"execution":{"iopub.status.busy":"2024-02-06T06:31:26.039877Z","iopub.execute_input":"2024-02-06T06:31:26.040278Z","iopub.status.idle":"2024-02-06T06:31:39.865551Z","shell.execute_reply.started":"2024-02-06T06:31:26.040248Z","shell.execute_reply":"2024-02-06T06:31:39.864355Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Import Libraries ","metadata":{"papermill":{"duration":0.065343,"end_time":"2022-03-08T03:18:11.885586","exception":false,"start_time":"2022-03-08T03:18:11.820243","status":"completed"},"tags":[]}},{"cell_type":"code","source":"import os\nfrom tensorflow.python.keras.utils import tf_utils\nimport tensorflow_addons as tfa\nfrom tensorflow_addons.rnn.nas_cell import NASCell\n\nimport pandas as pd\npd.options.mode.chained_assignment = None # avoids assignment warning\nimport numpy as np\nimport random\nfrom glob import glob\nfrom tqdm import tqdm\ntqdm.pandas() \nimport gc\n\nimport librosa\nimport sklearn\nimport json\n\n# Import for visualization\nimport matplotlib as mpl\ncmap = mpl.cm.get_cmap('coolwarm')\nimport matplotlib.pyplot as plt\nimport librosa.display as lid\nimport IPython.display as ipd\nimport cv2\n\nimport tensorflow as tf\ntf.get_logger().setLevel('ERROR')\ntf.autograph.set_verbosity(0)\nimport tensorflow_io as tfio\nimport tensorflow_addons as tfa\nimport tensorflow_probability as tfp\nimport tensorflow.keras.backend as K\nfrom kaggle_datasets import KaggleDatasets\n\n\nimport wandb","metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","papermill":{"duration":2.632068,"end_time":"2022-03-08T03:18:14.585094","exception":false,"start_time":"2022-03-08T03:18:11.953026","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-02-06T10:35:18.441541Z","iopub.execute_input":"2024-02-06T10:35:18.442442Z","iopub.status.idle":"2024-02-06T10:35:34.4206Z","shell.execute_reply.started":"2024-02-06T10:35:18.442402Z","shell.execute_reply":"2024-02-06T10:35:34.419667Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"##  Version","metadata":{"papermill":{"duration":0.065649,"end_time":"2022-03-08T03:18:14.717311","exception":false,"start_time":"2022-03-08T03:18:14.651662","status":"completed"},"tags":[]}},{"cell_type":"code","source":"print('np:', np.__version__)\nprint('pd:', pd.__version__)\nprint('sklearn:', sklearn.__version__)\nprint('librosa:', librosa.__version__)\nprint('tf:', tf.__version__)\nprint('tfp:', tfp.__version__)\nprint('tfa:', tfa.__version__)\nprint('tfio:', tfio.__version__)\nprint('w&b:', wandb.__version__)","metadata":{"papermill":{"duration":0.155095,"end_time":"2022-03-08T03:18:14.939054","exception":false,"start_time":"2022-03-08T03:18:14.783959","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Configuration ⚙️","metadata":{"papermill":{"duration":0.066353,"end_time":"2022-03-08T03:18:18.099835","exception":false,"start_time":"2022-03-08T03:18:18.033482","status":"completed"},"tags":[]}},{"cell_type":"code","source":"class CFG:\n    \n    debug = False\n    \n    \n    verbose = 0\n    \n \n    training_plot = True\n    \n   \n    wandb = True\n     \n    _wandb_kernel = 'chi@2002'\n    \n   \n    exp_name = 'bird recognition model'\n    comment = 'EfficientNetB1'\n    \n    \n    \n    \n    device = 'TPU-VM'\n    seed = 42\n    img_size = [128, 384]\n    batch_size = 32\n    upsample_thr = 50  \n    cv_filter = True \n    duration = 10 \n    sample_rate = 32000\n    audio_len = duration*sample_rate\n    nfft = 2028\n    window = 2048\n    hop_length = audio_len // (img_size[1] - 1)\n    fmin = 20\n    fmax = 16000\n    normalize = True\n    infer_bs = 2\n    tta = 1\n    drop_remainder = True\n    epochs = 25\n    model_name = 'EfficientNetB1'\n    fsr = False \n    num_fold = 5\n    selected_folds = [0]\n    pretrain = 'imagenet'\n    neck_features = 0\n    final_act = 'softmax'\n    \n    # Learning rate, optimizer, and scheduler\n    lr = 1e-3\n    scheduler = 'cos'\n    optimizer = 'Adam' # AdamW, Adam\n    \n    # Loss function and label smoothing\n    loss = 'CCE' # BCE, CCE\n    label_smoothing = 0.05 # label smoothing\n    \n    # Data augmentation parameters\n    augment=True\n    \n    # Time Freq masking\n    freq_mask_prob=0.50\n    num_freq_masks=1\n    freq_mask_param=10\n    time_mask_prob=0.50\n    num_time_masks=2\n    time_mask_param=25\n    audio_augment_prob = 0.5\n    mixup_prob = 0.65\n    mixup_alpha = 0.5\n    cutmix_prob = 0.65\n    cutmix_alpha = 2.5\n    timeshift_prob = 0.0\n    gn_prob = 0.35\n    class_names = sorted(os.listdir('/kaggle/input/birdclef-2023/train_audio/'))\n    num_classes = len(class_names)\n    class_labels = list(range(num_classes))\n    label2name = dict(zip(class_labels, class_names))\n    name2label = {v:k for k,v in label2name.items()}\n    class_names2 = sorted(set(os.listdir('/kaggle/input/birdclef-2021/train_short_audio/')\n                       +os.listdir('/kaggle/input/birdclef-2022/train_audio/')\n                       +os.listdir('/kaggle/input/birdsong-recognition/train_audio/')))\n    num_classes2 = len(class_names2)\n    class_labels2 = list(range(num_classes2))\n    label2name2 = dict(zip(class_labels2, class_names2))\n    name2label2 = {v:k for k,v in label2name2.items()}\n\n   \n    target_col = ['target']\n    tab_cols = ['filename']\n    monitor = 'auc'","metadata":{"papermill":{"duration":0.156464,"end_time":"2022-03-08T03:18:18.322809","exception":false,"start_time":"2022-03-08T03:18:18.166345","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-02-06T10:35:48.188624Z","iopub.execute_input":"2024-02-06T10:35:48.189334Z","iopub.status.idle":"2024-02-06T10:35:48.204984Z","shell.execute_reply.started":"2024-02-06T10:35:48.189304Z","shell.execute_reply":"2024-02-06T10:35:48.203922Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tf.keras.utils.set_random_seed(CFG.seed)","metadata":{"papermill":{"duration":0.153451,"end_time":"2022-03-08T03:18:18.685056","exception":false,"start_time":"2022-03-08T03:18:18.531605","status":"completed"},"tags":[],"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-02-04T12:15:05.20953Z","iopub.execute_input":"2024-02-04T12:15:05.210397Z","iopub.status.idle":"2024-02-04T12:15:05.214763Z","shell.execute_reply.started":"2024-02-04T12:15:05.210364Z","shell.execute_reply":"2024-02-04T12:15:05.21383Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import wandb\n\ntry:\n    from kaggle_secrets import UserSecretsClient\n    user_secrets = UserSecretsClient()\n    api_key = user_secrets.get_secret(\"WANDB\")\n    \n    wandb.login(key=api_key)\n    \n    anonymous = None\nexcept:\n    \n    anonymous = 'must'\n    \n    wandb.login(anonymous=anonymous, relogin=True)","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-02-06T10:36:11.801359Z","iopub.execute_input":"2024-02-06T10:36:11.802102Z","iopub.status.idle":"2024-02-06T10:36:18.267513Z","shell.execute_reply.started":"2024-02-06T10:36:11.802072Z","shell.execute_reply":"2024-02-06T10:36:18.2666Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_device():\n    \"Detect and intializes GPU/TPU automatically\"\n    \n    tpu = 'local' if CFG.device=='TPU-VM' else None\n    try:\n        \n        tpu = tf.distribute.cluster_resolver.TPUClusterResolver.connect(tpu=tpu) \n        strategy = tf.distribute.TPUStrategy(tpu)\n        print(f'> Running on {CFG.device}', tpu.master(), end=' | ')\n        print('Num of TPUs: ', strategy.num_replicas_in_sync)\n        device=CFG.device\n    except:\n        \n        gpus = tf.config.list_logical_devices('GPU')\n        ngpu = len(gpus)\n         \n        if ngpu:\n            \n            strategy = tf.distribute.MirroredStrategy(gpus) # single-GPU or multi-GPU\n            \n            print(\"> Running on GPU\", end=' | ')\n            print(\"Num of GPUs: \", ngpu)\n            device='GPU'\n        else:\n            \n            print(\"> Running on CPU\")\n            strategy = tf.distribute.get_strategy()\n            device='CPU'\n    return strategy, device, tpu","metadata":{"_kg_hide-input":true,"papermill":{"duration":7.941725,"end_time":"2022-03-08T03:18:26.826553","exception":false,"start_time":"2022-03-08T03:18:18.884828","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-02-04T12:15:15.993298Z","iopub.execute_input":"2024-02-04T12:15:15.994309Z","iopub.status.idle":"2024-02-04T12:15:16.002467Z","shell.execute_reply.started":"2024-02-04T12:15:15.99427Z","shell.execute_reply":"2024-02-04T12:15:16.00154Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nstrategy, CFG.device, tpu = get_device()\nCFG.replicas = strategy.num_replicas_in_sync","metadata":{"execution":{"iopub.status.busy":"2024-02-04T12:15:20.894601Z","iopub.execute_input":"2024-02-04T12:15:20.895506Z","iopub.status.idle":"2024-02-04T12:15:21.34304Z","shell.execute_reply.started":"2024-02-04T12:15:20.895473Z","shell.execute_reply":"2024-02-04T12:15:21.342056Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## DATASET PATH","metadata":{}},{"cell_type":"code","source":"BASE_PATH0 = '/kaggle/input/birdsong-recognition'\nBASE_PATH1 = '/kaggle/input/birdclef-2021'\nBASE_PATH2 = '/kaggle/input/birdclef-2022'\nBASE_PATH3 = '/kaggle/input/birdclef-2023'\nBASE_PATH4 = '/kaggle/input/xeno-canto-bird-recordings-extended-a-m'\nBASE_PATH5 = '/kaggle/input/xeno-canto-bird-recordings-extended-n-z'\n\nif CFG.device==\"TPU\":\n    from kaggle_datasets import KaggleDatasets\n    GCS_PATH0 = KaggleDatasets().get_gcs_path(BASE_PATH0.split('/')[-1])\n    GCS_PATH1 = KaggleDatasets().get_gcs_path(BASE_PATH1.split('/')[-1])\n    GCS_PATH2 = KaggleDatasets().get_gcs_path(BASE_PATH2.split('/')[-1])\n    GCS_PATH3 = KaggleDatasets().get_gcs_path(BASE_PATH3.split('/')[-1])\n    GCS_PATH4 = KaggleDatasets().get_gcs_path(BASE_PATH4.split('/')[-1])\n    GCS_PATH5 = KaggleDatasets().get_gcs_path(BASE_PATH5.split('/')[-1])\nelse:\n    GCS_PATH0 = BASE_PATH0\n    GCS_PATH1 = BASE_PATH1\n    GCS_PATH2 = BASE_PATH2\n    GCS_PATH3 = BASE_PATH3\n    GCS_PATH4 = BASE_PATH4\n    GCS_PATH5 = BASE_PATH5","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-02-04T12:15:27.650168Z","iopub.execute_input":"2024-02-04T12:15:27.651058Z","iopub.status.idle":"2024-02-04T12:15:27.658544Z","shell.execute_reply.started":"2024-02-04T12:15:27.651013Z","shell.execute_reply":"2024-02-04T12:15:27.65763Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## BirdCLEF - 23","metadata":{}},{"cell_type":"code","source":"df_23 = pd.read_csv(f'{BASE_PATH3}/train_metadata.csv')\ndf_23['filepath'] = GCS_PATH3 + '/train_audio/' + df_23.filename\ndf_23['target'] = df_23.primary_label.map(CFG.name2label)\ndf_23['birdclef'] = '23'\ndf_23['filename'] = df_23.filepath.map(lambda x: x.split('/')[-1])\ndf_23['xc_id'] = df_23.filepath.map(lambda x: x.split('/')[-1].split('.')[0])\nassert tf.io.gfile.exists(df_23.filepath.iloc[0])\n\n# Display rwos\nprint(\"# Samples in BirdCLEF 23: {:,}\".format(len(df_23)))\ndf_23.head(2).style.set_caption(\"BirdCLEF - 23\").set_table_styles([{\n    'selector': 'caption',\n    'props': [\n        ('color', 'blue'),\n        ('font-size', '16px')\n    ]\n}])","metadata":{"papermill":{"duration":0.241649,"end_time":"2022-03-08T03:18:27.408813","exception":false,"start_time":"2022-03-08T03:18:27.167164","status":"completed"},"tags":[],"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-02-04T12:15:31.870258Z","iopub.execute_input":"2024-02-04T12:15:31.870957Z","iopub.status.idle":"2024-02-04T12:15:32.045843Z","shell.execute_reply.started":"2024-02-04T12:15:31.870922Z","shell.execute_reply":"2024-02-04T12:15:32.04492Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## BirdCLEF - 20, 21, 22 & Xeno-Canto Extend","metadata":{}},{"cell_type":"code","source":"# BirdCLEF-2020\ndf_20 = pd.read_csv(f'{BASE_PATH0}/train.csv')\ndf_20['primary_label'] = df_20['ebird_code']\ndf_20['filepath'] = GCS_PATH0 + '/train_audio/' + df_20.primary_label + '/' + df_20.filename\ndf_20['scientific_name'] = df_20['sci_name']\ndf_20['common_name'] = df_20['species']\ndf_20['target'] = df_20.primary_label.map(CFG.name2label2)\ndf_20['birdclef'] = '20'\nassert tf.io.gfile.exists(df_20.filepath.iloc[0])\n\n# Xeno-Canto Extend by @vopani\ndf_xam = pd.read_csv(f'{BASE_PATH4}/train_extended.csv')\ndf_xam['filepath'] = GCS_PATH4 + '/A-M/' + df_xam.ebird_code + '/' + df_xam.filename\ndf_xnz = pd.read_csv(f'{BASE_PATH5}/train_extended.csv')\ndf_xnz['filepath'] = GCS_PATH5 + '/N-Z/' + df_xnz.ebird_code + '/' + df_xnz.filename\ndf_xc = pd.concat([df_xam, df_xnz], axis=0, ignore_index=True)\ndf_xc['primary_label'] = df_xc['ebird_code']\ndf_xc['scientific_name'] = df_xc['sci_name']\ndf_xc['common_name'] = df_xc['species']\ndf_xc['target'] = df_xc.primary_label.map(CFG.name2label2)\ndf_xc['birdclef'] = 'xc'\nassert tf.io.gfile.exists(df_xc.filepath.iloc[0])\n\n# BirdCLEF-2021\ndf_21 = pd.read_csv(f'{BASE_PATH1}/train_metadata.csv')\ndf_21['filepath'] = GCS_PATH1 + '/train_short_audio/' + df_21.primary_label + '/' + df_21.filename\ndf_21['target'] = df_21.primary_label.map(CFG.name2label2)\ndf_21['birdclef'] = '21'\ncorrupt_paths = ['/kaggle/input/birdclef-2021/train_short_audio/houwre/XC590621.ogg',\n                 '/kaggle/input/birdclef-2021/train_short_audio/cogdov/XC579430.ogg']\ndf_21 = df_21[~df_21.filepath.isin(corrupt_paths)] # remove all zero audios\nassert tf.io.gfile.exists(df_21.filepath.iloc[0])\n\n# BirdCLEF-2022\ndf_22 = pd.read_csv(f'{BASE_PATH2}/train_metadata.csv')\ndf_22['filepath'] = GCS_PATH2 + '/train_audio/' + df_22.filename\ndf_22['target'] = df_22.primary_label.map(CFG.name2label2)\ndf_22['birdclef'] = '22'\nassert tf.io.gfile.exists(df_22.filepath.iloc[0])\n\n# Merge 2021 and 2022 for pretraining\ndf_pre = pd.concat([df_20, df_21, df_22, df_xc], axis=0, ignore_index=True)\ndf_pre['filename'] = df_pre.filepath.map(lambda x: x.split('/')[-1])\ndf_pre['xc_id'] = df_pre.filepath.map(lambda x: x.split('/')[-1].split('.')[0])\nnodup_idx = df_pre[['xc_id','primary_label','author']].drop_duplicates().index\ndf_pre = df_pre.loc[nodup_idx].reset_index(drop=True)\n\n# # Remove duplicates\ndf_pre = df_pre[~df_pre.xc_id.isin(df_23.xc_id)].reset_index(drop=True)\ncorrupt_mp3s = json.load(open('/kaggle/input/birdclef-corrupt-mp3-files-ds/corrupt_mp3_files.json','r'))\ndf_pre = df_pre[~df_pre.filepath.isin(corrupt_mp3s)]\ndf_pre = df_pre[['filename','filepath','primary_label','secondary_labels',\n                 'rating','author','file_type','xc_id','scientific_name',\n                'common_name','target','birdclef','bird_seen']]\n# Display rows\nprint(\"# Samples for Pre-Training: {:,}\".format(len(df_pre)))\ndf_pre.head(2).style.set_caption(\"Pre-Training Data\").set_table_styles([{\n    'selector': 'caption',\n    'props': [\n        ('color', 'blue'),\n        ('font-size', '16px')\n    ]\n}])\n\n# Show distribution\nplt.figure(figsize=(8, 4))\ndf_pre.birdclef.value_counts().plot.bar(color=[cmap(0.0),cmap(0.25), cmap(0.65), cmap(0.9)])\nplt.xlabel(\"Dataset\")\nplt.ylabel(\"Count\")\nplt.title(\"Dataset distribution for Pre-Training\")\nplt.show()","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-02-04T12:15:37.936854Z","iopub.execute_input":"2024-02-04T12:15:37.937543Z","iopub.status.idle":"2024-02-04T12:15:40.273961Z","shell.execute_reply.started":"2024-02-04T12:15:37.937508Z","shell.execute_reply":"2024-02-04T12:15:40.273072Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def load_audio(filepath):\n    audio, sr = librosa.load(filepath)\n    return audio, sr\n\ndef get_spectrogram(audio):\n    spec = librosa.feature.melspectrogram(y=audio, \n                                   sr=CFG.sample_rate, \n                                   n_mels=CFG.img_size[0],\n                                   n_fft=CFG.nfft,\n                                   hop_length=CFG.hop_length,\n                                   fmax=CFG.fmax,\n                                   fmin=CFG.fmin,\n                                   )\n    spec = librosa.power_to_db(spec, ref=1.0)\n    return spec\n\ndef display_audio(row):\n    \n    caption = f'Id: {row.filename} | Name: {row.common_name} | Sci.Name: {row.scientific_name} | Rating: {row.rating}'\n    \n    audio, sr = load_audio(row.filepath)\n    \n    audio = audio[:CFG.audio_len]\n    \n    spec = get_spectrogram(audio)\n    \n    print(\"# Audio:\")\n    display(ipd.Audio(audio, rate=CFG.sample_rate))\n\n    print('# Visualization:')\n    fig, ax = plt.subplots(2, 1, figsize=(12, 2*3), sharex=True, tight_layout=True)\n    fig.suptitle(caption)\n   \n    lid.waveshow(audio,\n                 sr=CFG.sample_rate,\n                 ax=ax[0],\n                color= cmap(0.1))\n    \n    lid.specshow(spec, \n                 sr = CFG.sample_rate, \n                 hop_length = CFG.hop_length,\n                 n_fft=CFG.nfft,\n                 fmin=CFG.fmin,\n                 fmax=CFG.fmax,\n                 x_axis = 'time', \n                 y_axis = 'mel',\n                 cmap = 'coolwarm',\n                 ax=ax[1])\n    ax[0].set_xlabel('');\n    fig.show()","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-02-04T12:15:45.425173Z","iopub.execute_input":"2024-02-04T12:15:45.425549Z","iopub.status.idle":"2024-02-04T12:15:45.436669Z","shell.execute_reply.started":"2024-02-04T12:15:45.425511Z","shell.execute_reply":"2024-02-04T12:15:45.435837Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## BirdCLEF - 20","metadata":{}},{"cell_type":"code","source":"BIRDCLEF = '20'\nprint(f\"# BirdCLEF - 20{BIRDCLEF}\")\ntmp = df_pre.query(\"birdclef==@BIRDCLEF\").sample(1)\ntmp.loc[:, 'filepath'] = tmp.filepath.str.replace(GCS_PATH0, BASE_PATH0)\nrow = tmp.squeeze()\n# Display audio\ndisplay_audio(row)","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-02-04T12:15:50.713588Z","iopub.execute_input":"2024-02-04T12:15:50.713953Z","iopub.status.idle":"2024-02-04T12:15:54.004267Z","shell.execute_reply.started":"2024-02-04T12:15:50.713921Z","shell.execute_reply":"2024-02-04T12:15:54.003324Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Xeno-Canto Extend","metadata":{}},{"cell_type":"code","source":"BIRDCLEF = 'xc'\nprint(f\"# Xeno-Canto - Extend\")\ntmp = df_pre.query(\"birdclef==@BIRDCLEF\").sample(1)\ntmp.loc[:, 'filepath'] = tmp.filepath.str.replace(GCS_PATH4, BASE_PATH4).replace(GCS_PATH5, BASE_PATH5)\nrow = tmp.squeeze()\n# Display audio\ndisplay_audio(row)","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-02-04T12:15:58.133996Z","iopub.execute_input":"2024-02-04T12:15:58.134707Z","iopub.status.idle":"2024-02-04T12:15:59.378634Z","shell.execute_reply.started":"2024-02-04T12:15:58.13467Z","shell.execute_reply":"2024-02-04T12:15:59.377699Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## BirdCLEF - 21","metadata":{}},{"cell_type":"code","source":"BIRDCLEF = '21'\nprint(f\"# BirdCLEF - 20{BIRDCLEF}\")\ntmp = df_pre.query(\"birdclef==@BIRDCLEF\").sample(1)\ntmp.loc[:, 'filepath'] = tmp.filepath.str.replace(GCS_PATH1, BASE_PATH1)\nrow = tmp.squeeze()\n# Display audio\ndisplay_audio(row)","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-02-04T12:16:01.979135Z","iopub.execute_input":"2024-02-04T12:16:01.979513Z","iopub.status.idle":"2024-02-04T12:16:03.258769Z","shell.execute_reply.started":"2024-02-04T12:16:01.979481Z","shell.execute_reply":"2024-02-04T12:16:03.257866Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## BirdCLEF - 22","metadata":{}},{"cell_type":"code","source":"BIRDCLEF = '22'\nprint(f\"# BirdCLEF - 20{BIRDCLEF}\")\ntmp = df_pre.query(\"birdclef==@BIRDCLEF\").sample(1)\ntmp.loc[:, 'filepath'] = tmp.filepath.str.replace(GCS_PATH2, BASE_PATH2)\nrow = tmp.squeeze()\n# Display audio\ndisplay_audio(row)","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-02-04T12:16:06.688021Z","iopub.execute_input":"2024-02-04T12:16:06.688389Z","iopub.status.idle":"2024-02-04T12:16:07.992532Z","shell.execute_reply.started":"2024-02-04T12:16:06.688357Z","shell.execute_reply":"2024-02-04T12:16:07.991624Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## BirdCLEF - 23","metadata":{}},{"cell_type":"code","source":"BIRDCLEF = '23'\nprint(f\"# BirdCLEF - 20{BIRDCLEF}\")\ntmp = df_23.query(\"birdclef==@BIRDCLEF\").sample(1)\ntmp.loc[:, 'filepath'] = tmp.filepath.str.replace(GCS_PATH3, BASE_PATH3)\nrow = tmp.squeeze()\n\n# Display audio\ndisplay_audio(row)","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-02-04T12:16:12.052102Z","iopub.execute_input":"2024-02-04T12:16:12.052764Z","iopub.status.idle":"2024-02-04T12:16:13.227891Z","shell.execute_reply.started":"2024-02-04T12:16:12.052729Z","shell.execute_reply":"2024-02-04T12:16:13.226869Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Splitting Data  ","metadata":{"papermill":{"duration":0.09524,"end_time":"2022-03-08T03:18:34.861029","exception":false,"start_time":"2022-03-08T03:18:34.765789","status":"completed"},"tags":[]}},{"cell_type":"code","source":"\nfrom sklearn.model_selection import StratifiedKFold\n\n\nskf1 = StratifiedKFold(n_splits=25, shuffle=True, random_state=CFG.seed)\nskf2 = StratifiedKFold(n_splits=CFG.num_fold, shuffle=True, random_state=CFG.seed)\n\n\ndf_pre = df_pre.reset_index(drop=True)\ndf_23 = df_23.reset_index(drop=True)\n\n\ndf_pre[\"fold\"] = -1\ndf_23[\"fold\"] = -1\n\n# BirdCLEF - 21 & 22\nfor fold, (train_idx, val_idx) in enumerate(skf1.split(df_pre, df_pre['primary_label'])):\n    df_pre.loc[val_idx, 'fold'] = fold\n    \n# IBirdCLEF - 23\nfor fold, (train_idx, val_idx) in enumerate(skf2.split(df_23, df_23['primary_label'])):\n    df_23.loc[val_idx, 'fold'] = fold","metadata":{"papermill":{"duration":0.386301,"end_time":"2022-03-08T03:18:35.325064","exception":false,"start_time":"2022-03-08T03:18:34.938763","status":"completed"},"tags":[],"_kg_hide-input":true,"_kg_hide-output":true,"execution":{"iopub.status.busy":"2024-02-04T12:28:22.640738Z","iopub.execute_input":"2024-02-04T12:28:22.641697Z","iopub.status.idle":"2024-02-04T12:28:22.858063Z","shell.execute_reply.started":"2024-02-04T12:28:22.641636Z","shell.execute_reply":"2024-02-04T12:28:22.85705Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Filter & Upsampling\n\n\n","metadata":{}},{"cell_type":"code","source":"def filter_data(df, thr=5):\n   \n    counts = df.primary_label.value_counts()\n\n   \n    cond = df.primary_label.isin(counts[counts<thr].index.tolist())\n\n    \n    df['cv'] = True\n\n   \n    df.loc[cond, 'cv'] = False\n\n    \n    return df\n    \ndef upsample_data(df, thr=20):\n    \n    class_dist = df['primary_label'].value_counts()\n\n    \n    down_classes = class_dist[class_dist < thr].index.tolist()\n\n    \n    up_dfs = []\n\n    \n    for c in down_classes:\n        \n        class_df = df.query(\"primary_label==@c\")\n        \n        num_up = thr - class_df.shape[0]\n        \n        class_df = class_df.sample(n=num_up, replace=True, random_state=CFG.seed)\n        \n        up_dfs.append(class_df)\n\n    \n    up_df = pd.concat([df] + up_dfs, axis=0, ignore_index=True)\n    \n    return up_df\n\ndef downsample_data(df, thr=500):\n\n    class_dist = df['primary_label'].value_counts()\n    \n    \n    up_classes = class_dist[class_dist > thr].index.tolist()\n\n    \n    down_dfs = []\n\n    \n    for c in up_classes:\n        \n        class_df = df.query(\"primary_label==@c\")\n        \n        df = df.query(\"primary_label!=@c\")\n        \n        class_df = class_df.sample(n=thr, replace=False, random_state=CFG.seed)\n        \n        down_dfs.append(class_df)\n\n    \n    down_df = pd.concat([df] + down_dfs, axis=0, ignore_index=True)\n    \n    return down_df","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-02-04T12:28:28.206728Z","iopub.execute_input":"2024-02-04T12:28:28.207585Z","iopub.status.idle":"2024-02-04T12:28:28.218689Z","shell.execute_reply.started":"2024-02-04T12:28:28.207551Z","shell.execute_reply":"2024-02-04T12:28:28.217687Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Filter Data","metadata":{}},{"cell_type":"code","source":"# Filter data\nf_df = filter_data(df_pre, thr=5)\n\nplt.figure(figsize=(10, 4))\nax1 = plt.subplot(1, 2, 1)\nf_df.cv.value_counts().plot.bar(legend=True, color=cmap(0.1))\nplt.yscale(\"log\")\nplt.title(\"BirdCLEF - 20, 21 & 22\")\nplt.legend([\"BirdCLEF - 20, 21 & 22\"])\n\nf_df = filter_data(df_23, thr=5)\nax2 = plt.subplot(1, 2, 2, sharey = ax1)\nf_df.cv.value_counts().plot.bar(legend=True, color=cmap(0.9))\nplt.yscale(\"log\")\nplt.title(\"BirdCLEF - 23\")\nplt.legend([\"BirdCLEF - 23\"])\n\nplt.show()","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-02-04T12:28:31.585212Z","iopub.execute_input":"2024-02-04T12:28:31.586075Z","iopub.status.idle":"2024-02-04T12:28:32.413671Z","shell.execute_reply.started":"2024-02-04T12:28:31.586027Z","shell.execute_reply":"2024-02-04T12:28:32.412806Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Upsample Data","metadata":{}},{"cell_type":"code","source":"# Upsample data\nup_thr = 100\ndn_df = downsample_data(df_pre, thr=400)\nup_df = upsample_data(dn_df, thr=up_thr)\nprint(\"# Pretraing Dataset\")\nprint(f'> Original: {len(df_pre)}')\nprint(f'> After Upsample: {len(up_df)}')\nprint(f'> After Downsample: {len(dn_df)}')\n\n\nplt.figure(figsize=(12*2, 6))\n\nax1 = plt.subplot(1, 2, 1)\ndf_pre.primary_label.value_counts()[:].plot.bar(color='blue', label='original')\nup_df.primary_label.value_counts()[:].plot.bar(color='green', label='w/ upsample')\ndn_df.primary_label.value_counts()[:].plot.bar(color='red', label='w/ dowsample')\nplt.xticks([])\nplt.axhline(y=up_thr, color='g', linestyle='--', label='up threshold')\nplt.axhline(y=400, color='r', linestyle='--', label='down threshold')\nplt.legend()\nplt.title(\"Upsample for Pre-Training\")\n\n# Upsample data\nup_thr = 50\nup_df = upsample_data(df_23, thr=up_thr)\nprint(\"\\n# BirdCLEF - 23\")\nprint(f'> Before Upsample: {len(df_23)}')\nprint(f'> After Upsample: {len(up_df)}')\n\n# Show effect of upsample\nax2 = plt.subplot(1, 2, 2, sharey=ax1)\nup_df.primary_label.value_counts()[:].plot.bar(color='green', label='w/ upsample')\ndf_23.primary_label.value_counts()[:].plot.bar(color='red', label='w/o upsample')\nplt.xticks([])\nplt.axhline(y=up_thr, color='g', linestyle='--', label='up threshold')\nplt.legend()\nplt.title(\"Upsample in BirdCLEF - 23\")\n\n# plt.tight_layout()\nplt.show()","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-02-04T12:28:35.830629Z","iopub.execute_input":"2024-02-04T12:28:35.831521Z","iopub.status.idle":"2024-02-04T12:28:45.646697Z","shell.execute_reply.started":"2024-02-04T12:28:35.831487Z","shell.execute_reply":"2024-02-04T12:28:45.645685Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Data Augmentation \n ","metadata":{"papermill":{"duration":0.151237,"end_time":"2022-03-08T03:18:47.959873","exception":false,"start_time":"2022-03-08T03:18:47.808636","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"## Utility","metadata":{}},{"cell_type":"code","source":"# Generates random integer\ndef random_int(shape=[], minval=0, maxval=1):\n    return tf.random.uniform(shape=shape, minval=minval, maxval=maxval, dtype=tf.int32)\n\n\n# Generats random float\ndef random_float(shape=[], minval=0.0, maxval=1.0):\n    rnd = tf.random.uniform(shape=shape, minval=minval, maxval=maxval, dtype=tf.float32)\n    return rnd","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-02-04T12:28:59.356442Z","iopub.execute_input":"2024-02-04T12:28:59.35718Z","iopub.status.idle":"2024-02-04T12:28:59.362861Z","shell.execute_reply.started":"2024-02-04T12:28:59.357142Z","shell.execute_reply":"2024-02-04T12:28:59.361876Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install tensorflow_extra\n","metadata":{"execution":{"iopub.status.busy":"2024-02-04T12:16:56.073967Z","iopub.execute_input":"2024-02-04T12:16:56.07471Z","iopub.status.idle":"2024-02-04T12:17:08.258951Z","shell.execute_reply.started":"2024-02-04T12:16:56.074677Z","shell.execute_reply":"2024-02-04T12:17:08.257806Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## AudioAug\nApplies augmentation directly to audio","metadata":{}},{"cell_type":"code","source":"\nimport tensorflow_extra as tfe\n\n\n@tf.function\ndef TimeShift(audio, prob=0.5):\n    # Randomly apply time shift with probability `prob`\n    if random_float() < prob:\n        # Calculate random shift value\n        shift = random_int(shape=[], minval=0, maxval=tf.shape(audio)[0])\n        # Randomly set the shift to be negative with 50% probability\n        if random_float() < 0.5:\n            shift = -shift\n        # Roll the audio signal by the shift value\n        audio = tf.roll(audio, shift, axis=0)\n    return audio\n\n\n@tf.function\ndef GaussianNoise(audio, std=[0.0025, 0.025], prob=0.5):\n    \n    std = random_float([], std[0], std[1])\n    \n    if random_float() < prob:\n       \n        GN = tf.keras.layers.GaussianNoise(stddev=std)\n        audio = GN(audio, training=True) # training=False don't apply noise to data\n    return audio\n\n\ndef AudioAug(audio):\n   \n    audio = TimeShift(audio, prob=CFG.timeshift_prob)\n    audio = GaussianNoise(audio, prob=CFG.gn_prob)\n    return audio\n\n\nmixup_layer = tfe.layers.MixUp(alpha=CFG.mixup_alpha, prob=CFG.mixup_prob)\ncutmix_layer = tfe.layers.CutMix(alpha=CFG.cutmix_alpha, prob=CFG.cutmix_prob)\n\ndef CutMixUp(audios, labels):\n    audios, labels = mixup_layer(audios, labels, training=True)\n    audios, labels = cutmix_layer(audios, labels, training=True)\n    return audios, labels","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-02-04T12:29:07.020608Z","iopub.execute_input":"2024-02-04T12:29:07.021411Z","iopub.status.idle":"2024-02-04T12:29:07.03429Z","shell.execute_reply.started":"2024-02-04T12:29:07.021374Z","shell.execute_reply":"2024-02-04T12:29:07.033269Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Decoders\n","metadata":{}},{"cell_type":"code","source":"\ndef audio_decoder(with_labels=True, dim=CFG.audio_len, \n                  take_first=False, num_classes=264, CFG=CFG):\n    def get_audio(filepath):\n        ftype = filepath[1]\n        filepath = filepath[0]\n        file_bytes = tf.io.read_file(filepath)\n        if ftype:\n            audio = tfio.audio.decode_vorbis(file_bytes)\n        else:\n            audio = tfio.audio.decode_mp3(file_bytes) \n        audio = tf.cast(audio, tf.float32)\n        if tf.shape(audio)[1]>1: \n            audio = audio[...,0:1]\n        audio = tf.squeeze(audio, axis=-1)\n        return audio\n    \n    def crop_or_pad(audio, target_len, pad_mode='constant', take_first=True):\n        audio_len = tf.shape(audio)[0]\n        diff_len = abs(target_len - audio_len)\n        if audio_len < target_len:\n            pad1 = tf.random.uniform([], maxval=diff_len, dtype=tf.int32)\n            pad2 = diff_len - pad1\n            audio = tf.pad(audio, paddings=[[pad1, pad2]], mode=pad_mode)\n        elif audio_len > target_len:\n            if take_first:\n                audio = audio[:target_len]\n            else:\n                idx = tf.random.uniform([], maxval=diff_len, dtype=tf.int32)\n                audio = audio[idx: (idx + target_len)]\n        return tf.reshape(audio, [target_len])\n\n    def get_target(target):          \n        target = tf.reshape(target, [1])\n        target = tf.cast(tf.one_hot(target, num_classes), tf.float32) \n        target = tf.reshape(target, [num_classes])\n        return target\n\n    def decode(path):\n        audio = get_audio(path)\n        audio = crop_or_pad(audio, dim) # crop or pad audio to keep a fixed length\n        audio = tf.reshape(audio, [dim])\n        return audio\n    \n    def decode_with_labels(path, label):\n        label = get_target(label)\n        return decode(path), label\n    \n    return decode_with_labels if with_labels else decode","metadata":{"papermill":{"duration":0.251237,"end_time":"2022-03-08T03:18:49.079346","exception":false,"start_time":"2022-03-08T03:18:48.828109","status":"completed"},"tags":[],"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-02-04T12:29:12.796942Z","iopub.execute_input":"2024-02-04T12:29:12.797604Z","iopub.status.idle":"2024-02-04T12:29:12.810453Z","shell.execute_reply.started":"2024-02-04T12:29:12.797569Z","shell.execute_reply":"2024-02-04T12:29:12.809405Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\ndef audio_augmenter(with_labels=True, dim=CFG.audio_len, CFG=CFG):\n    def augment(audio, dim=dim):\n        if random_float() <= CFG.audio_augment_prob:\n            audio = AudioAug(audio)\n        audio = tf.reshape(audio, [dim])\n        return audio\n    \n    def augment_with_labels(audio, label):    \n        return augment(audio), label\n    \n    return augment_with_labels if with_labels else augment","metadata":{"papermill":{"duration":0.250484,"end_time":"2022-03-08T03:18:49.79513","exception":false,"start_time":"2022-03-08T03:18:49.544646","status":"completed"},"tags":[],"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-02-04T12:29:16.780114Z","iopub.execute_input":"2024-02-04T12:29:16.780772Z","iopub.status.idle":"2024-02-04T12:29:16.786857Z","shell.execute_reply.started":"2024-02-04T12:29:16.780736Z","shell.execute_reply":"2024-02-04T12:29:16.785792Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Pipeline\n","metadata":{"papermill":{"duration":0.152217,"end_time":"2022-03-08T03:18:50.097623","exception":false,"start_time":"2022-03-08T03:18:49.945406","status":"completed"},"tags":[]}},{"cell_type":"code","source":"def build_dataset(paths, ftype, labels=None, batch_size=32, target_size=[128, 256], \n                  audio_decode_fn=None, audio_augment_fn=None,\n                  take_first=False, num_classes=264,\n                  cache=True, cache_dir=\"\",drop_remainder=False,\n                  augment=True, repeat=True, shuffle=1024):\n   \n    \n    if cache_dir != \"\" and cache is True:\n        os.makedirs(cache_dir, exist_ok=True)\n    \n    if audio_decode_fn is None:\n        audio_decode_fn = audio_decoder(labels is not None,\n                                        dim=CFG.audio_len, \n                                        take_first=take_first,\n                                        num_classes=num_classes,\n                                        CFG=CFG)\n   \n    if audio_augment_fn is None:\n        audio_augment_fn = audio_augmenter(labels is not None, \n                                           dim=CFG.audio_len, CFG=CFG)\n        \n   \n    AUTO = tf.data.experimental.AUTOTUNE\n   \n    slices = ((paths, ftype),) if labels is None else ((paths, ftype), labels)\n    \n    ds = tf.data.Dataset.from_tensor_slices(slices)\n   \n    ds = ds.map(audio_decode_fn, num_parallel_calls=AUTO)\n    \n    ds = ds.cache(cache_dir) if cache else ds\n    \n    ds = ds.repeat() if repeat else ds\n    \n    opt = tf.data.Options()\n    \n    if shuffle: \n        ds = ds.shuffle(shuffle, seed=CFG.seed)\n        opt.experimental_deterministic = False\n    if CFG.device=='GPU':\n        \n        opt.experimental_distribute.auto_shard_policy = tf.data.experimental.AutoShardPolicy.OFF\n    \n    ds = ds.with_options(opt)\n    \n    ds = ds.map(audio_augment_fn, num_parallel_calls=AUTO) if augment else ds\n    \n    ds = ds.batch(batch_size, drop_remainder=drop_remainder)\n   \n    if augment and labels is not None:\n        ds = ds.map(CutMixUp,num_parallel_calls=AUTO)\n    \n    return ds","metadata":{"papermill":{"duration":0.240881,"end_time":"2022-03-08T03:18:50.489717","exception":false,"start_time":"2022-03-08T03:18:50.248836","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-02-04T12:29:23.187142Z","iopub.execute_input":"2024-02-04T12:29:23.187493Z","iopub.status.idle":"2024-02-04T12:29:23.201175Z","shell.execute_reply.started":"2024-02-04T12:29:23.187465Z","shell.execute_reply":"2024-02-04T12:29:23.200032Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualization 🔭\n","metadata":{}},{"cell_type":"code","source":"import random\n\ndef random_float():\n    return random.random()\n\n# Now you can use the random_float function\nvalue = random_float()\nprint(value)\n","metadata":{"execution":{"iopub.status.busy":"2024-02-04T12:17:35.408962Z","iopub.execute_input":"2024-02-04T12:17:35.409837Z","iopub.status.idle":"2024-02-04T12:17:35.414924Z","shell.execute_reply.started":"2024-02-04T12:17:35.409802Z","shell.execute_reply":"2024-02-04T12:17:35.413826Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def plot_batch(batch, row=3, col=3, label2name=None,):\n    \"\"\"Plot one batch data\"\"\"\n    if isinstance(batch, tuple) or isinstance(batch, list):\n        audios, tars = batch\n    else:\n        audios = batch\n        tars = None\n    plt.figure(figsize=(col*5, row*3))\n    for idx in range(row*col):\n        ax = plt.subplot(row, col, idx+1)\n        plt.plot(audios[idx].numpy(), color=cmap(0.1))\n        if tars is not None:\n            label = tars[idx].numpy().argmax()\n            name = label2name[label]\n            plt.title(name)\n    plt.tight_layout()\n    plt.show()\n    \n    \ndef plot_history(history):\n    \"\"\"Plot trainign history, credit: @cdeotte\"\"\"\n    epochs = len(history.history['auc'])\n    plt.figure(figsize=(15,5))\n    plt.plot(np.arange(epochs),history.history['auc'],'-o',label='Train AUC',color='#ff7f0e')\n    plt.plot(np.arange(epochs),history.history['val_auc'],'-o',label='Val AUC',color='#1f77b4')\n    x = np.argmax( history.history['val_auc'] ); y = np.max( history.history['val_auc'] )\n    xdist = plt.xlim()[1] - plt.xlim()[0]; ydist = plt.ylim()[1] - plt.ylim()[0]\n    plt.scatter(x,y,s=200,color='#1f77b4'); plt.text(x-0.03*xdist,y-0.13*ydist,'max auc\\n%.2f'%y,size=14)\n    plt.ylabel('AUC (PR)',size=14); plt.xlabel('Epoch',size=14)\n    plt.legend(loc=2)\n    plt2 = plt.gca().twinx()\n    plt2.plot(np.arange(epochs),history.history['loss'],'-o',label='Train Loss',color='#2ca02c')\n    plt2.plot(np.arange(epochs),history.history['val_loss'],'-o',label='Val Loss',color='#d62728')\n    x = np.argmin( history.history['val_loss'] ); y = np.min( history.history['val_loss'] )\n    ydist = plt.ylim()[1] - plt.ylim()[0]\n    plt.scatter(x,y,s=200,color='#d62728'); plt.text(x-0.03*xdist,y+0.05*ydist,'min loss',size=14)\n    plt.ylabel('Loss',size=14)\n    plt.title('Fold %i - Training Plot'%(fold+1),size=18)\n    plt.legend(loc=3)\n    plt.show()  ","metadata":{"papermill":{"duration":0.328513,"end_time":"2022-03-08T03:19:59.512224","exception":false,"start_time":"2022-03-08T03:19:59.183711","status":"completed"},"tags":[],"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-02-04T12:29:36.65128Z","iopub.execute_input":"2024-02-04T12:29:36.651626Z","iopub.status.idle":"2024-02-04T12:29:36.667179Z","shell.execute_reply.started":"2024-02-04T12:29:36.6516Z","shell.execute_reply":"2024-02-04T12:29:36.666197Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## BirdCLEF - 20","metadata":{}},{"cell_type":"code","source":"check_df = df_pre.query(\"birdclef=='20'\").sample(50)\nds = build_dataset(check_df.filepath.tolist(),\n                   check_df.filepath.str.contains('.ogg').tolist(),\n                   check_df.target.tolist(), \n                   num_classes=CFG.num_classes2,\n                   augment=True, cache=False)\nds = ds.take(32)\naudios, labels = next(iter(ds))\nplot_batch((audios, labels), label2name=CFG.label2name2)","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-02-04T12:29:41.520051Z","iopub.execute_input":"2024-02-04T12:29:41.520432Z","iopub.status.idle":"2024-02-04T12:31:17.044629Z","shell.execute_reply.started":"2024-02-04T12:29:41.520401Z","shell.execute_reply":"2024-02-04T12:31:17.043694Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Xeno-Canto Extend","metadata":{}},{"cell_type":"code","source":"check_df = df_pre.query(\"birdclef=='xc'\").sample(50)\nds = build_dataset(check_df.filepath.tolist(),\n                   check_df.filepath.str.contains('.ogg').tolist(),\n                   check_df.target.tolist(), \n                   num_classes=CFG.num_classes2,\n                   augment=True, cache=False)\nds = ds.take(32)\naudios, labels = next(iter(ds))\nplot_batch((audios, labels), label2name=CFG.label2name2)","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-02-04T12:31:33.940869Z","iopub.execute_input":"2024-02-04T12:31:33.941802Z","iopub.status.idle":"2024-02-04T12:32:48.443926Z","shell.execute_reply.started":"2024-02-04T12:31:33.941762Z","shell.execute_reply":"2024-02-04T12:32:48.442953Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## BirdCLEF - 21","metadata":{}},{"cell_type":"code","source":"check_df = df_pre.query(\"birdclef=='21'\").sample(50)\nds = build_dataset(check_df.filepath.tolist(),\n                   check_df.filepath.str.contains('.ogg').tolist(),\n                   check_df.target.tolist(), \n                   num_classes=CFG.num_classes2,\n                   augment=True, cache=False)\nds = ds.take(32)\naudios, labels = next(iter(ds))\nplot_batch((audios, labels), label2name=CFG.label2name2)","metadata":{"papermill":{"duration":3.299334,"end_time":"2022-03-08T03:20:02.987986","exception":false,"start_time":"2022-03-08T03:19:59.688652","status":"completed"},"tags":[],"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-02-04T12:33:00.365603Z","iopub.execute_input":"2024-02-04T12:33:00.365999Z","iopub.status.idle":"2024-02-04T12:37:31.483361Z","shell.execute_reply.started":"2024-02-04T12:33:00.365967Z","shell.execute_reply":"2024-02-04T12:37:31.482391Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## BirdCLEF - 22","metadata":{}},{"cell_type":"code","source":"check_df = df_pre.query(\"birdclef=='22'\").sample(50)\nds = build_dataset(check_df.filepath.tolist(),\n                   check_df.filepath.str.contains('.ogg').tolist(),\n                   check_df.target.tolist(), \n                   num_classes=CFG.num_classes2,\n                   augment=True, cache=False)\nds = ds.take(32)\naudios, labels = next(iter(ds))\nplot_batch((audios, labels), label2name=CFG.label2name2)","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-02-04T12:37:36.665742Z","iopub.execute_input":"2024-02-04T12:37:36.666656Z","iopub.status.idle":"2024-02-04T12:42:52.643243Z","shell.execute_reply.started":"2024-02-04T12:37:36.666605Z","shell.execute_reply":"2024-02-04T12:42:52.642099Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## BirdCLEF - 23","metadata":{}},{"cell_type":"code","source":"check_df = df_23.sample(50)\nds = build_dataset(check_df.filepath.tolist(),\n                   check_df.filepath.str.contains('.ogg').tolist(),\n                   check_df.target.tolist(), \n                   num_classes=CFG.num_classes2,\n                   augment=True, cache=False)\nds = ds.take(32)\naudios, labels = next(iter(ds))\nplot_batch((audios, labels), label2name=CFG.label2name)","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-02-04T12:43:17.805554Z","iopub.execute_input":"2024-02-04T12:43:17.805958Z","iopub.status.idle":"2024-02-04T12:45:29.320212Z","shell.execute_reply.started":"2024-02-04T12:43:17.805923Z","shell.execute_reply":"2024-02-04T12:45:29.319223Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## MelSpectrogram\n","metadata":{}},{"cell_type":"code","source":"melspec_layer = tfe.layers.MelSpectrogram(n_fft=CFG.nfft, \n                                          hop_length=CFG.hop_length, \n                                          sr=CFG.sample_rate, \n                                          ref=1.0,\n                                          fmin=500,\n                                          fmax=15000,\n                                          out_channels=3)\nspecs = melspec_layer(audios)\n\nfig, ax = plt.subplots(2, 1, sharex=True, figsize=(12, 5))\nlid.waveshow(audios[0].numpy(), sr=CFG.sample_rate, ax=ax[0], axis=None)\n\nlid.specshow(specs[0, ..., 0].numpy(), \n             n_fft=CFG.nfft, \n             hop_length=CFG.hop_length, \n             sr=CFG.sample_rate,\n             x_axis='time',\n             y_axis='mel',\n             cmap='coolwarm',\n              ax=ax[1])\nplt.show()","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-02-04T12:45:38.249952Z","iopub.execute_input":"2024-02-04T12:45:38.25089Z","iopub.status.idle":"2024-02-04T12:45:40.533461Z","shell.execute_reply.started":"2024-02-04T12:45:38.250851Z","shell.execute_reply":"2024-02-04T12:45:40.532534Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## SpecAug - Time Frequency Masking\n","metadata":{}},{"cell_type":"code","source":"tfm_layer = tfe.layers.TimeFreqMask(freq_mask_prob=0.65,\n                                  num_freq_masks=2,\n                                  freq_mask_param=10,\n                                  time_mask_prob=0.65,\n                                  num_time_masks=3,\n                                  time_mask_param=25,\n                                  time_last=True,)\nspecs2 = tfm_layer(specs, training=True)\n\nplt.figure(figsize=(12,3))\nlid.specshow(specs2[0, ..., 0].numpy(), \n             n_fft=CFG.nfft, \n             hop_length=CFG.hop_length, \n             sr=CFG.sample_rate,\n            x_axis='time',\n            y_axis='mel',\n            cmap='coolwarm')\nplt.show()","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-02-04T12:45:59.020261Z","iopub.execute_input":"2024-02-04T12:45:59.020664Z","iopub.status.idle":"2024-02-04T12:46:01.349141Z","shell.execute_reply.started":"2024-02-04T12:45:59.020615Z","shell.execute_reply":"2024-02-04T12:46:01.348215Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Normalization\nThis layer first Standardize the data using mean ans std then rescales the data to [0, 1]","metadata":{}},{"cell_type":"code","source":"norm_layer = tfe.layers.ZScoreMinMax()\nspecs3 = norm_layer(specs2)\n\nplt.figure(figsize=(8,3))\nplt.hist(specs2.numpy().ravel(), alpha=0.8, color=cmap(0.1))\nplt.hist(specs3.numpy().ravel(), alpha=0.8, color=cmap(0.9))\nplt.legend([\"w/o normalize\", \"w/ normalize\"])\nplt.semilogx()\nplt.title(\"Effect of Normalization\")\nplt.xlabel(\"Pixel Value\")\nplt.ylabel(\"Count\")\nplt.show()","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-02-04T12:46:14.741551Z","iopub.execute_input":"2024-02-04T12:46:14.742483Z","iopub.status.idle":"2024-02-04T12:46:16.001688Z","shell.execute_reply.started":"2024-02-04T12:46:14.742447Z","shell.execute_reply":"2024-02-04T12:46:16.000734Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Loss, Metric & Optmizer \n\n.","metadata":{"papermill":{"duration":0.184301,"end_time":"2022-03-08T03:20:04.031695","exception":false,"start_time":"2022-03-08T03:20:03.847394","status":"completed"},"tags":[]}},{"cell_type":"code","source":"import sklearn.metrics\n\ndef get_metrics():\n\n    auc = tf.keras.metrics.AUC(curve='PR', name='auc', multi_label=False) # auc on prcision-recall curve\n    acc = tf.keras.metrics.CategoricalAccuracy(name='acc')\n    return [acc, auc]\n\ndef padded_cmap(y_true, y_pred, padding_factor=5):\n    num_classes = y_true.shape[1]\n    pad_rows = np.array([[1]*num_classes]*padding_factor)\n    y_true = np.concatenate([y_true, pad_rows])\n    y_pred = np.concatenate([y_pred, pad_rows])\n    score = sklearn.metrics.average_precision_score(y_true, y_pred, average='macro',)\n    return score\n\ndef get_loss():\n    if CFG.loss==\"CCE\":\n        loss = tf.keras.losses.CategoricalCrossentropy(label_smoothing=CFG.label_smoothing)\n    elif CFG.loss==\"BCE\":\n        loss = tf.keras.losses.BinaryCrossentropy(label_smoothing=CFG.label_smoothing)\n    else:\n        raise ValueError(\"Loss not found\")\n    return loss\n    \ndef get_optimizer():\n    if CFG.optimizer == \"Adam\":\n        opt = tf.keras.optimizers.Adam(learning_rate=CFG.lr)\n    else:\n        raise ValueError(\"Optmizer not found\")\n    return opt","metadata":{"papermill":{"duration":0.28125,"end_time":"2022-03-08T03:20:04.498883","exception":false,"start_time":"2022-03-08T03:20:04.217633","status":"completed"},"tags":[],"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-02-04T12:46:23.190347Z","iopub.execute_input":"2024-02-04T12:46:23.191019Z","iopub.status.idle":"2024-02-04T12:46:23.201763Z","shell.execute_reply.started":"2024-02-04T12:46:23.190983Z","shell.execute_reply":"2024-02-04T12:46:23.200492Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install efficientnet","metadata":{"execution":{"iopub.status.busy":"2024-02-04T12:46:39.470437Z","iopub.execute_input":"2024-02-04T12:46:39.470887Z","iopub.status.idle":"2024-02-04T12:46:52.085702Z","shell.execute_reply.started":"2024-02-04T12:46:39.470842Z","shell.execute_reply":"2024-02-04T12:46:52.084392Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Modeling ","metadata":{"papermill":{"duration":0.182769,"end_time":"2022-03-08T03:20:04.861966","exception":false,"start_time":"2022-03-08T03:20:04.679197","status":"completed"},"tags":[]}},{"cell_type":"code","source":"import efficientnet.tfkeras as efn\nimport tensorflow_extra as tfe\n\n# Will download and load pretrained imagenet weights.\ndef build_model(CFG, model_name=None, num_classes=264, compile_model=True):\n    \"\"\"\n    Builds and returns a model based on the specified configuration.\n    \"\"\"\n    # Create an input layer for the model\n    inp = tf.keras.layers.Input(shape=(None,))\n    # Spectrogram\n    out = tfe.layers.MelSpectrogram(n_mels=CFG.img_size[0],\n                                    n_fft=CFG.nfft,\n                                    hop_length=CFG.hop_length, \n                                    sr=CFG.sample_rate,\n                                    ref=1.0,\n                                    out_channels=3)(inp)\n    # Normalize\n    out = tfe.layers.ZScoreMinMax()(out)\n    # TimeFreqMask\n    out = tfe.layers.TimeFreqMask(freq_mask_prob=0.5,\n                                  num_freq_masks=1,\n                                  freq_mask_param=10,\n                                  time_mask_prob=0.5,\n                                  num_time_masks=2,\n                                  time_mask_param=25,\n                                  time_last=False,)(out)\n    # Load backbone model\n  # Load backbone model\n    base = getattr(efn, model_name)(input_shape=(None, None, 3),\n                                include_top=0,\n                                weights=CFG.pretrain)\n    # Pass the input through the base model\n    out = base(out)\n    out = tf.keras.layers.GlobalAveragePooling2D()(out)\n    out = tf.keras.layers.Dense(num_classes, activation='softmax')(out)\n    model = tf.keras.models.Model(inputs=inp, outputs=out)\n    if compile_model:\n        \n        opt = get_optimizer()\n   \n        loss = get_loss()\n        \n        metrics = get_metrics()\n       \n        model.compile(optimizer=opt, loss=loss, metrics=metrics)\n    return model","metadata":{"papermill":{"duration":1.239321,"end_time":"2022-03-08T03:20:06.281118","exception":false,"start_time":"2022-03-08T03:20:05.041797","status":"completed"},"tags":[],"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-02-04T12:46:58.867877Z","iopub.execute_input":"2024-02-04T12:46:58.868336Z","iopub.status.idle":"2024-02-04T12:46:58.944401Z","shell.execute_reply.started":"2024-02-04T12:46:58.868287Z","shell.execute_reply":"2024-02-04T12:46:58.943595Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = build_model(CFG, model_name=CFG.model_name)\nmodel.summary()","metadata":{"papermill":{"duration":37.756883,"end_time":"2022-03-08T03:20:44.226871","exception":false,"start_time":"2022-03-08T03:20:06.469988","status":"completed"},"tags":[],"_kg_hide-input":false,"execution":{"iopub.status.busy":"2024-02-04T12:47:08.135205Z","iopub.execute_input":"2024-02-04T12:47:08.137576Z","iopub.status.idle":"2024-02-04T12:47:13.687126Z","shell.execute_reply.started":"2024-02-04T12:47:08.137539Z","shell.execute_reply":"2024-02-04T12:47:13.686211Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Check Model O/P","metadata":{}},{"cell_type":"code","source":"audios = tf.random.uniform((1, CFG.audio_len))\nwith strategy.scope():\n    out = model(audios, training=False)\nprint(out.shape)","metadata":{"_kg_hide-input":true,"_kg_hide-output":true,"execution":{"iopub.status.busy":"2024-02-04T12:47:20.17092Z","iopub.execute_input":"2024-02-04T12:47:20.171832Z","iopub.status.idle":"2024-02-04T12:47:21.523705Z","shell.execute_reply.started":"2024-02-04T12:47:20.171795Z","shell.execute_reply":"2024-02-04T12:47:21.522719Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# LR ","metadata":{}},{"cell_type":"code","source":"import math\n\ndef get_lr_callback(batch_size=8, mode='cos', epochs=CFG.epochs, plot=False):\n    \"\"\"\n    Returns a learning rate scheduler callback for a given batch size, mode, and number of epochs.\n    \"\"\"\n    # Define the learning rate schedule.\n    lr_start   = 0.000005\n    lr_max     = 0.00000140 * batch_size\n    lr_min     = 0.000001\n    lr_ramp_ep = 5\n    lr_sus_ep  = 0\n    lr_decay   = 0.8\n   \n    # Function to update the lr\n    def lrfn(epoch):\n        if epoch < lr_ramp_ep:\n            lr = (lr_max - lr_start) / lr_ramp_ep * epoch + lr_start\n\n        elif epoch < lr_ramp_ep + lr_sus_ep:\n            lr = lr_max\n\n        elif CFG.scheduler == 'exp':\n            lr = (lr_max - lr_min) * lr_decay**(epoch - \\\n                  lr_ramp_ep - lr_sus_ep) + lr_min\n\n        elif CFG.scheduler == 'step':\n            lr = lr_max * lr_decay**((epoch - lr_ramp_ep - lr_sus_ep) // 2)\n\n        elif CFG.scheduler == 'cos':\n            decay_total_epochs = epochs - lr_ramp_ep - lr_sus_ep + 3\n            decay_epoch_index = epoch - lr_ramp_ep - lr_sus_ep\n            phase = math.pi * decay_epoch_index / decay_total_epochs\n            cosine_decay = 0.5 * (1 + math.cos(phase))\n            lr = (lr_max - lr_min) * cosine_decay + lr_min\n        return lr\n    \n   \n    if plot:\n        plt.figure(figsize=(10,5))\n        plt.plot(np.arange(epochs), [lrfn(epoch) for epoch in np.arange(epochs)], marker='o')\n        plt.xlabel('epoch'); plt.ylabel('learnig rate')\n        plt.title('Learning Rate Scheduler')\n        plt.show()\n        \n    \n    lr_callback = tf.keras.callbacks.LearningRateScheduler(lrfn, verbose=False)\n    return lr_callback","metadata":{"_kg_hide-input":true,"papermill":{"duration":0.510014,"end_time":"2022-03-08T03:20:45.290695","exception":false,"start_time":"2022-03-08T03:20:44.780681","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-02-04T12:47:44.630203Z","iopub.execute_input":"2024-02-04T12:47:44.63091Z","iopub.status.idle":"2024-02-04T12:47:44.641937Z","shell.execute_reply.started":"2024-02-04T12:47:44.630875Z","shell.execute_reply":"2024-02-04T12:47:44.640658Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install --upgrade efficientnet\n","metadata":{"execution":{"iopub.status.busy":"2024-02-04T12:47:49.295501Z","iopub.execute_input":"2024-02-04T12:47:49.296268Z","iopub.status.idle":"2024-02-04T12:48:01.683837Z","shell.execute_reply.started":"2024-02-04T12:47:49.296233Z","shell.execute_reply":"2024-02-04T12:48:01.682571Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"_=get_lr_callback(CFG.batch_size*CFG.replicas, plot=True)","metadata":{"execution":{"iopub.status.busy":"2024-02-04T12:48:11.311414Z","iopub.execute_input":"2024-02-04T12:48:11.312276Z","iopub.status.idle":"2024-02-04T12:48:11.555586Z","shell.execute_reply.started":"2024-02-04T12:48:11.312234Z","shell.execute_reply":"2024-02-04T12:48:11.554678Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import yaml\n\ndef wandb_init(fold):\n    \"\"\"\n    Initializes the W&B run by creating a config file and initializing a W&B run.\n    \"\"\"\n    \n    config = {k:v for k,v in dict(vars(CFG)).items() if '__' not in k}\n    config.update({\"fold\":int(fold)}) # int is to convert numpy.int -> int\n    # Dump the configuration dictionary to a YAML file\n    yaml.dump(config, open(f'/kaggle/working/config fold-{fold}.yaml', 'w'),)\n    # Load the configuration dictionary from the YAML file\n    config = yaml.load(open(f'/kaggle/working/config fold-{fold}.yaml', 'r'), Loader=yaml.FullLoader)\n    # Initialize a W&B run with the given configuration parameters\n    run = wandb.init(project=\"birdclef-2023-public\",\n                     name=f\"fold-{fold}|dim-{CFG.img_size[1]}x{CFG.img_size[0]}|model-{CFG.model_name}\",\n                     config=config,\n                     group=CFG.comment,\n                     save_code=True,)\n    return run\n\n    \ndef log_wandb(valid_df):\n    \"\"\"Log and save validation results with missclassified examples as audio in W&B\"\"\"\n   \n    save_df = valid_df.query(\"miss==True\")\n    \n    save_df.loc[:, 'pred_name'] = save_df.pred.map(CFG.label2name)\n    save_df.loc[:, 'target_name'] = save_df.target.map(CFG.label2name)\n    \n    if CFG.debug:\n        save_df = save_df.iloc[:CFG.replicas*CFG.batch_size*CFG.infer_bs]\n   \n    noimg_cols = [*CFG.tab_cols, 'target', 'pred', 'target_name','pred_name']\n   \n    save_df = save_df.loc[:, noimg_cols]\n\n    data = []\n   \n    for idx, row in tqdm(save_df.iterrows(), total=len(save_df), desc='wandb ', position=0, leave=True):\n        filepath = '/kaggle/input/birdclef-2023/train_audio/'+CFG.label2name[row.target]+'/'+row.filename\n        audio, sr = librosa.load(filepath, sr=None)\n        \n        data+=[[*row.tolist(), wandb.Audio(audio, caption=row.filename, sample_rate=sr)]]\n    \n    wandb_table = wandb.Table(data=data, columns=[*noimg_cols, 'audio'])\n    \n    scores_wb = {f'best.{k}': v for k,v in scores.items()}\n    \n    wandb.log({**scores_wb,\n               'table': wandb_table,\n               })\n    \n# get wandb callbacks\ndef get_wb_callbacks(fold):\n    wb_ckpt = wandb.keras.WandbModelCheckpoint(filepath='fold-%i.h5'%fold, \n                                               monitor='val_auc',\n                                               verbose=CFG.verbose,\n                                               save_best_only=True,\n                                               save_weights_only=False,\n                                               mode='max',)\n    wb_metr = wandb.keras.WandbMetricsLogger()\n    return [wb_ckpt, wb_metr]","metadata":{"_kg_hide-input":true,"papermill":{"duration":0.288344,"end_time":"2022-03-08T03:20:47.977099","exception":false,"start_time":"2022-03-08T03:20:47.688755","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-02-04T12:48:21.396723Z","iopub.execute_input":"2024-02-04T12:48:21.397609Z","iopub.status.idle":"2024-02-04T12:48:21.411795Z","shell.execute_reply.started":"2024-02-04T12:48:21.397571Z","shell.execute_reply":"2024-02-04T12:48:21.410859Z"},"trusted":true},"execution_count":null,"outputs":[]}]}