{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.7.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":44224,"databundleVersionId":5188730,"sourceType":"competition"},{"sourceId":5351998,"sourceType":"datasetVersion","datasetId":3001872},{"sourceId":5356868,"sourceType":"datasetVersion","datasetId":3001974},{"sourceId":8722380,"sourceType":"datasetVersion","datasetId":5234151},{"sourceId":8723462,"sourceType":"datasetVersion","datasetId":5234965},{"sourceId":121811216,"sourceType":"kernelVersion"}],"dockerImageVersionId":30408,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip install -q torchtoolbox timm","metadata":{"_uuid":"cda14587-1efc-4233-b378-b8be6611c74e","_cell_guid":"efdf4d3e-df7d-42e2-96bf-66270c54f0f0","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-06-18T22:58:59.208527Z","iopub.execute_input":"2024-06-18T22:58:59.209319Z","iopub.status.idle":"2024-06-18T22:59:12.762411Z","shell.execute_reply.started":"2024-06-18T22:58:59.209276Z","shell.execute_reply":"2024-06-18T22:59:12.761124Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport random\nimport pandas as pd\nfrom torchmetrics import AUROC\nimport matplotlib.pyplot as plt\nimport torch\nimport os\nimport pytorch_lightning as pl\nfrom torch.utils.data import Dataset, DataLoader\nfrom sklearn import model_selection\nimport torchvision.transforms as transforms\nimport torchvision.io \nimport librosa\nfrom PIL import Image\nimport albumentations as alb\nimport torch.multiprocessing as mp\nimport warnings\nfrom pytorch_lightning.callbacks import ModelCheckpoint, BackboneFinetuning, EarlyStopping\nfrom torchmetrics import AUROC\nfrom torchtoolbox.tools import mixup_data, mixup_criterion\nimport torch.nn as nn\nfrom torch.nn.functional import cross_entropy\nimport torchmetrics\nimport timm\nimport torch.nn.functional as F\nfrom torchmetrics import Accuracy\nfrom  soundfile import SoundFile\nimport soundfile as sf\n\nfrom tqdm.notebook import tqdm\nimport math\nimport cv2\nwarnings.filterwarnings('ignore')\n\nfrom torchvision.transforms import ToTensor\nimport glob","metadata":{"_uuid":"86068199-908c-426a-8c0a-64825bb73b0f","_cell_guid":"6364ced2-ee87-4cd9-9332-05117d3a9b8c","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-06-18T22:59:12.764838Z","iopub.execute_input":"2024-06-18T22:59:12.765184Z","iopub.status.idle":"2024-06-18T22:59:27.424476Z","shell.execute_reply.started":"2024-06-18T22:59:12.765149Z","shell.execute_reply":"2024-06-18T22:59:27.423256Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import glob\nlabel_dict_train={}\nall_labels=glob.glob('/kaggle/input/tau-nigens20mic-unsliced/metadata_dev/*')\nfor label_path in all_labels:\n    df=pd.read_csv(label_path,header=None)\n    class_names=df[1].unique()\n    audio_name=label_path.split('/')[-1].split('.')[0]\n    label_dict_train[audio_name]=class_names","metadata":{"_uuid":"6ec279d6-03fe-44d9-8d53-79f5896d21c9","_cell_guid":"f2f62df1-c3aa-4052-9280-a964ec06e871","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-06-18T22:59:27.426029Z","iopub.execute_input":"2024-06-18T22:59:27.426333Z","iopub.status.idle":"2024-06-18T22:59:30.042665Z","shell.execute_reply.started":"2024-06-18T22:59:27.426302Z","shell.execute_reply":"2024-06-18T22:59:30.041775Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"label_dict_val={}\nall_labels=glob.glob('/kaggle/input/tau-nigens20mic-unsliced/metadata_eval/metadata_eval/*')\nfor label_path in all_labels:\n    df=pd.read_csv(label_path,header=None)\n    class_names=df[1].unique()\n    audio_name=label_path.split('/')[-1].split('.')[0]\n    label_dict_val[audio_name]=class_names","metadata":{"_uuid":"ad46a897-000e-4c30-8260-9e3f68297e33","_cell_guid":"5ec76b30-ab4e-43b3-abfb-d65100a74aa7","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-06-18T22:59:30.046005Z","iopub.execute_input":"2024-06-18T22:59:30.046585Z","iopub.status.idle":"2024-06-18T22:59:30.912560Z","shell.execute_reply.started":"2024-06-18T22:59:30.046549Z","shell.execute_reply":"2024-06-18T22:59:30.911697Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = pd.DataFrame(list(label_dict_train.items()), columns=['filename', 'labels'])\nval_df = pd.DataFrame(list(label_dict_val.items()), columns=['filename', 'labels'])","metadata":{"_uuid":"d4cef283-efab-41c6-b7e7-0092aa08154e","_cell_guid":"40dc87b8-1e08-4718-b8ca-2edcb1085ac8","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-06-18T22:59:30.913704Z","iopub.execute_input":"2024-06-18T22:59:30.914003Z","iopub.status.idle":"2024-06-18T22:59:30.921642Z","shell.execute_reply.started":"2024-06-18T22:59:30.913975Z","shell.execute_reply":"2024-06-18T22:59:30.920773Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df","metadata":{"execution":{"iopub.status.busy":"2024-06-18T22:59:30.923107Z","iopub.execute_input":"2024-06-18T22:59:30.923764Z","iopub.status.idle":"2024-06-18T22:59:30.948450Z","shell.execute_reply.started":"2024-06-18T22:59:30.923711Z","shell.execute_reply":"2024-06-18T22:59:30.947492Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Data Split","metadata":{"_uuid":"47756213-501a-4846-afb2-5b46fcac4dea","_cell_guid":"95895c47-4bef-4aed-bd4b-200d53c511f8","trusted":true}},{"cell_type":"code","source":"class Config:\n    folds=5\n    cv_filter=True\n    use_aug = False\n    num_classes = 14\n    batch_size = 64\n    epochs = 20\n    warmup=10\n    PRECISION = 16    \n    PATIENCE = 20   \n    seed = 2023\n#     model = \"tf_efficientnet_b0_ns\"\n    model='tf_efficientnet_b4_ns'\n    pretrained = True            \n    weight_decay = 1e-3\n    use_mixup = True\n    mixup_alpha = 0.2   \n    DEVICE = torch.device('cuda' if torch.cuda.is_available() else 'cpu')    \n\n    data_root = \"/kaggle/input/melspec/spec/\"\n    images_paths = \"/kaggle/input/melspec/spec/\"\n\n    train_path = \"/kaggle/input/birdcall-csvs/train_df.csv\"\n    valid_path = \"/kaggle/input/birdcall-csvs/valid_df.csv\"\n    debug=False\n    \n    \n    SR = 32000\n    DURATION = 5\n    MAX_READ_SAMPLES = 5\n    LR = 5e-4\n\npl.seed_everything(Config.seed, workers=True)\n    \ndef config_to_dict(cfg):\n    return dict((name, getattr(cfg, name)) for name in dir(cfg) if not name.startswith('__'))","metadata":{"_uuid":"d6117fc4-0245-45b3-9f2c-202141ef1518","_cell_guid":"530e1b27-c102-4246-8686-414311d78875","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-06-18T22:59:30.949753Z","iopub.execute_input":"2024-06-18T22:59:30.950107Z","iopub.status.idle":"2024-06-18T22:59:31.011463Z","shell.execute_reply.started":"2024-06-18T22:59:30.950068Z","shell.execute_reply":"2024-06-18T22:59:31.010428Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Config.num_classes = len(df.primary_label.unique())\n# # df_train = pd.concat([df_train, pd.get_dummies(df_train['primary_label'])], axis=1)\n# # df_valid = pd.concat([df_valid, pd.get_dummies(df_valid['primary_label'])], axis=1)\n# birds = list(df.primary_label.unique())\n\n# birds.sort()\n# print(len(birds))\n# bird_dict={bird:i for i,bird in enumerate(birds)}\n# df['num_label']=df['primary_label'].map(bird_dict)","metadata":{"_uuid":"09768b2d-8998-46e1-b3b5-a330820f3dfd","_cell_guid":"0d0c6010-acc8-4752-becb-55e98cb041d7","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-06-18T22:59:31.012786Z","iopub.execute_input":"2024-06-18T22:59:31.013779Z","iopub.status.idle":"2024-06-18T22:59:31.020078Z","shell.execute_reply.started":"2024-06-18T22:59:31.013738Z","shell.execute_reply":"2024-06-18T22:59:31.019128Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class RandomPad:\n    \"\"\"\n    Randomly pads a (128, x) shaped numpy array with zeros to make it (128, 313) shaped.\n    \"\"\"\n    def __init__(self, validation=False):\n        self.validaiton=validation\n\n        \n    def __call__(self, input_array):\n        _, x = input_array.shape\n\n        if self.validaiton:\n            if x >= 313:\n                output_array = input_array[:, :313].copy()\n            else:\n                output_array = np.zeros((128, 313))\n                output_array[:, :x] = input_array.copy()\n        else:\n            if x > 313:\n                start_index = np.random.randint(0, x - 313)\n                output_array = input_array[:, start_index:start_index + 313].copy()\n            else:\n                output_array = np.zeros((128, 313))\n                output_array[:, :x] = input_array.copy()\n\n        return output_array\n\n    \n\nclass StretchAndPad:\n    \"\"\"\n    Stretches a (h, x) shaped numpy array in the x direction by a certain factor, and pads with zeros to make it (h, 313) shaped.\n    \"\"\"\n    def __init__(self, factor=1.5, p=0.5):\n        self.factor = factor\n        self.prob = p\n\n    def __call__(self, input_array):\n        if np.random.rand() < self.prob:\n            h, x = input_array.shape\n\n            resized_img = cv2.resize(input_array, (int(x*self.factor), h), interpolation=cv2.INTER_CUBIC)\n            \n            if x*self.factor >= 313:\n                start_index = np.random.randint(0, int(x*self.factor) - 313)\n                output_array = resized_img[:, start_index:start_index + 313].copy()\n            else:\n                output_array = np.zeros((h, 313))\n                output_array[:, :int(x*self.factor)] = resized_img.copy()\n\n            return output_array\n        else:\n            return input_array\n\n\nclass TimeMask:\n    def __init__(self, p=0.5, max_time_mask=10, num_masks=1, replace_with_zero=False):\n        self.p = p\n        self.max_time_mask = max_time_mask\n        self.num_masks = num_masks\n        self.replace_with_zero = replace_with_zero\n\n    def __call__(self, spec):\n        if np.random.uniform() < self.p:\n            _, length = spec.shape\n            spec = spec.copy()\n\n            for i in range(self.num_masks):\n                time_mask = np.random.randint(self.max_time_mask-5, self.max_time_mask)\n                time_mask_start = np.random.randint(0, length - time_mask)\n\n                if self.replace_with_zero:\n                    spec[:, time_mask_start:time_mask_start+time_mask] = 0\n                else:\n                    mask_value = np.random.uniform(low=spec.min(), high=spec.max())\n                    spec[:, time_mask_start:time_mask_start+time_mask] = mask_value\n\n        return spec\n\n\nclass FreqMask:\n    def __init__(self, p=0.5, max_freq_mask=5, num_masks=1, replace_with_zero=False):\n        self.p = p\n        self.max_freq_mask = max_freq_mask\n        self.num_masks = num_masks\n        self.replace_with_zero = replace_with_zero\n\n    def __call__(self, spec):\n        if np.random.uniform() < self.p:\n            length, _ = spec.shape\n            spec = spec.copy()\n\n            for i in range(self.num_masks):\n                time_mask = np.random.randint(self.max_freq_mask-5, self.max_freq_mask)\n                time_mask_start = np.random.randint(0, length - time_mask)\n\n                if self.replace_with_zero:\n                    spec[time_mask_start:time_mask_start+time_mask, :] = 0\n                else:\n                    mask_value = np.random.uniform(low=spec.min(), high=spec.max())\n                    spec[time_mask_start:time_mask_start+time_mask, :] = mask_value\n        return spec\n\n\n    \n    \ntrain_transforms = transforms.Compose([\n    RandomPad(),\n    transforms.RandomChoice([\n        TimeMask(p=.5, max_time_mask=20, num_masks=1, replace_with_zero=True),\n        FreqMask(p=.5, max_freq_mask=10, num_masks=1, replace_with_zero=True)\n    ]),\n    transforms.RandomChoice([\n        StretchAndPad(p=.5, factor=1.1),\n        StretchAndPad(p=0.5, factor=.9)\n    ])\n\n])\n\nval_transforms = transforms.Compose([\n    RandomPad(validation=True)\n\n])","metadata":{"_uuid":"8d69a6db-c133-4e9f-86f6-73f7e1ea85aa","_cell_guid":"ea508671-1758-47ff-9725-b4bcd2016bb2","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-06-18T22:59:31.021491Z","iopub.execute_input":"2024-06-18T22:59:31.021841Z","iopub.status.idle":"2024-06-18T22:59:31.049759Z","shell.execute_reply.started":"2024-06-18T22:59:31.021811Z","shell.execute_reply":"2024-06-18T22:59:31.048778Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch\nimport torch.nn.functional as F\n\n# Define the target labels\nlabels = [2, 3]\n\n# Convert the labels to a tensor\nlabels_tensor = torch.tensor(labels) - 1  # Adjusting the labels to 0-based index (0 for 1, 1 for 2, 2 for 3)\n\n# Define the number of classes\nnum_classes = 3\n\n# One-hot encode the labels\none_hot_encoded = F.one_hot(labels_tensor, num_classes=num_classes)\n\n# Sum the one-hot encoded vectors along the batch dimension\ntarget_vector = one_hot_encoded.sum(dim=0)\n\n# Convert the target vector to a binary format\ntarget_vector[target_vector > 0] = 1\n\nprint(target_vector)","metadata":{"_uuid":"778b6927-0360-402e-999a-b95312be4bbe","_cell_guid":"59819790-21d0-4389-acbd-b146c00809b7","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-06-18T22:59:31.053844Z","iopub.execute_input":"2024-06-18T22:59:31.054463Z","iopub.status.idle":"2024-06-18T22:59:31.110820Z","shell.execute_reply.started":"2024-06-18T22:59:31.054432Z","shell.execute_reply":"2024-06-18T22:59:31.109912Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class BirdDataset(torch.utils.data.Dataset):\n\n    def __init__(self, df,augmentations = None, data_dir='/kaggle/input/melspec/spec/train/'):\n\n        self.df = df    \n        self.augmentations = augmentations\n        self.img_dir = Config.images_paths\n        self.data_dir=data_dir\n\n        \n        \n    \n    def __len__(self):\n        return len(self.df)\n    \n    \n\n\n    def load_spec(self,path: str):\n        return np.load(path)\n        \n\n\n\n\n    def __getitem__(self, idx):\n\n        row = self.df.iloc[idx]\n        spec=self.load_spec(self.data_dir+row.filename+'.npy')\n        if self.augmentations:\n            spec=self.augmentations(spec)\n        num_label=torch.tensor(row.labels)\n        encoded_label=F.one_hot(num_label,14).float()\n        encoded_label = encoded_label.sum(dim=0)\n        spec = torch.tensor(spec/255.0, dtype=torch.float32).unsqueeze(0)\n        \n        spec=torch.cat([spec, spec, spec], dim=0)\n\n        return spec,encoded_label,row.filename","metadata":{"_uuid":"e1d8cae5-55cb-41e8-83e3-be75633894aa","_cell_guid":"8b7fc187-be37-43a8-96aa-a94704a09117","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-06-18T23:01:20.517475Z","iopub.execute_input":"2024-06-18T23:01:20.518083Z","iopub.status.idle":"2024-06-18T23:01:20.530347Z","shell.execute_reply.started":"2024-06-18T23:01:20.518034Z","shell.execute_reply":"2024-06-18T23:01:20.529304Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dataset=BirdDataset(train_df)\nval_dataset=BirdDataset(val_df,data_dir='/kaggle/input/melspec/spec/val/')","metadata":{"_uuid":"1e1f04b3-a1b0-40f9-ade0-67c9b6fbf2a6","_cell_guid":"5c47787c-edf5-405e-9ce8-127952c51ead","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-06-18T23:01:21.096388Z","iopub.execute_input":"2024-06-18T23:01:21.096794Z","iopub.status.idle":"2024-06-18T23:01:21.102060Z","shell.execute_reply.started":"2024-06-18T23:01:21.096756Z","shell.execute_reply":"2024-06-18T23:01:21.100885Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_loader=DataLoader(train_dataset, batch_size=2, shuffle=True, num_workers=4)\nval_loader=DataLoader(val_dataset, batch_size=2, shuffle=False, num_workers=4)","metadata":{"_uuid":"741b6bc4-8099-4d1c-aabf-819c2d9ead19","_cell_guid":"3cd8de6f-7ca2-4b21-8e02-bc50feca8888","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-06-18T23:01:21.520082Z","iopub.execute_input":"2024-06-18T23:01:21.520752Z","iopub.status.idle":"2024-06-18T23:01:21.526489Z","shell.execute_reply.started":"2024-06-18T23:01:21.520700Z","shell.execute_reply":"2024-06-18T23:01:21.525419Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# for data in train_loader:\n#     break","metadata":{"_uuid":"4150a519-30be-44c2-86d7-2978f3a19671","_cell_guid":"27699db0-4f29-49e5-9b5e-f11f7e13c082","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-06-18T23:01:21.880237Z","iopub.execute_input":"2024-06-18T23:01:21.880660Z","iopub.status.idle":"2024-06-18T23:01:21.885225Z","shell.execute_reply.started":"2024-06-18T23:01:21.880623Z","shell.execute_reply":"2024-06-18T23:01:21.883940Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# image, target,_ = data","metadata":{"_uuid":"e1a76df7-022f-4d52-a8e8-f47f9bc407d7","_cell_guid":"cf95dec5-12a0-4beb-9c5d-4dd2e88aa745","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-06-18T23:01:22.240402Z","iopub.execute_input":"2024-06-18T23:01:22.241223Z","iopub.status.idle":"2024-06-18T23:01:22.245905Z","shell.execute_reply.started":"2024-06-18T23:01:22.241183Z","shell.execute_reply":"2024-06-18T23:01:22.244652Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# effnet=Effnet()\n# loss_function = nn.BCEWithLogitsLoss()","metadata":{"_uuid":"4c8667de-b450-4a3f-9b25-cf92e7559c3f","_cell_guid":"e2bf8a15-20ef-44ce-936d-4340ad5d095d","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-06-18T23:01:22.663302Z","iopub.execute_input":"2024-06-18T23:01:22.664344Z","iopub.status.idle":"2024-06-18T23:01:22.668393Z","shell.execute_reply.started":"2024-06-18T23:01:22.664301Z","shell.execute_reply":"2024-06-18T23:01:22.667304Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# model_out=effnet(image)","metadata":{"_uuid":"fc21ed40-14aa-4cd0-a1ab-e562bb664872","_cell_guid":"9c3111a0-64e6-4742-bf09-73bc2ecffdc9","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-06-18T22:59:31.169790Z","iopub.execute_input":"2024-06-18T22:59:31.170545Z","iopub.status.idle":"2024-06-18T22:59:31.177866Z","shell.execute_reply.started":"2024-06-18T22:59:31.170506Z","shell.execute_reply":"2024-06-18T22:59:31.176768Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# loss_function(model_out,target)","metadata":{"_uuid":"0737e506-14bb-4642-849e-980e340aa1cf","_cell_guid":"4e363f69-5f1e-45b9-983e-658ff09b1a45","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-06-18T22:59:31.179005Z","iopub.execute_input":"2024-06-18T22:59:31.179359Z","iopub.status.idle":"2024-06-18T22:59:31.186550Z","shell.execute_reply.started":"2024-06-18T22:59:31.179319Z","shell.execute_reply":"2024-06-18T22:59:31.185706Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n# sigmoid = nn.Sigmoid()","metadata":{"_uuid":"d44a1153-9a8d-46dc-a5e2-95bb6e204151","_cell_guid":"d6292244-77e7-4229-b763-8b5acf98b6ee","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-06-18T22:59:31.188435Z","iopub.execute_input":"2024-06-18T22:59:31.189230Z","iopub.status.idle":"2024-06-18T22:59:31.198634Z","shell.execute_reply.started":"2024-06-18T22:59:31.189191Z","shell.execute_reply":"2024-06-18T22:59:31.197772Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# model_out","metadata":{"_uuid":"83f88e86-2ce8-4dac-9d4a-aec40f1211df","_cell_guid":"a5e57434-b840-487d-9ea3-f915c49dda49","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-06-18T22:59:31.199784Z","iopub.execute_input":"2024-06-18T22:59:31.200107Z","iopub.status.idle":"2024-06-18T22:59:31.208275Z","shell.execute_reply.started":"2024-06-18T22:59:31.200066Z","shell.execute_reply":"2024-06-18T22:59:31.207411Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# sigmoid(model_out)","metadata":{"_uuid":"b5fe89fb-bb4a-46b9-8b80-a974eafc01a0","_cell_guid":"a3b909eb-82c0-4d6e-86af-c1c53e027281","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-06-18T22:59:31.209269Z","iopub.execute_input":"2024-06-18T22:59:31.209594Z","iopub.status.idle":"2024-06-18T22:59:31.218410Z","shell.execute_reply.started":"2024-06-18T22:59:31.209567Z","shell.execute_reply":"2024-06-18T22:59:31.217405Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# out_num=(out[0]>.5)*1.0\n# acc=(out_num==target).sum()/len(out_num)","metadata":{"_uuid":"3a4069d4-d664-4976-a2b8-023c22180268","_cell_guid":"a540cc35-45bf-4b89-acdf-82e9e758d0bc","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-06-18T22:59:31.219584Z","iopub.execute_input":"2024-06-18T22:59:31.220190Z","iopub.status.idle":"2024-06-18T22:59:31.226835Z","shell.execute_reply.started":"2024-06-18T22:59:31.220151Z","shell.execute_reply":"2024-06-18T22:59:31.225988Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"_uuid":"72a9a38c-eb48-40bc-97ac-7a47dd34c45a","_cell_guid":"ac907b0a-ffdb-474d-8759-7fd4980991c1","collapsed":false,"jupyter":{"outputs_hidden":false},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def show_batch(img_ds, num_items, num_rows, num_cols, predict_arr=None):\n    fig = plt.figure(figsize=(12, 6))    \n    img_index = np.random.randint(0, len(img_ds)-1, num_items)\n    for index, img_index in enumerate(img_index):  # list first 9 images\n\n        img, lb,_ = img_ds[img_index]\n\n        ax = fig.add_subplot(num_rows, num_cols, index + 1, xticks=[], yticks=[])\n        if isinstance(img, torch.Tensor):\n            img = img.detach().numpy()\n        if isinstance(img, np.ndarray):\n            img = img.transpose(1, 2, 0)\n            ax.imshow(img)        \n            \n        title = f\"Spec\"\n        ax.set_title(title)  \n        \n\nshow_batch(val_dataset, 8, 2, 4)","metadata":{"_uuid":"440866ca-1983-4a35-90cf-1ee8cd6a98a8","_cell_guid":"6a9fd035-b4cf-456e-8a84-c262db157763","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-06-18T23:01:24.827020Z","iopub.execute_input":"2024-06-18T23:01:24.827426Z","iopub.status.idle":"2024-06-18T23:01:28.746616Z","shell.execute_reply.started":"2024-06-18T23:01:24.827391Z","shell.execute_reply":"2024-06-18T23:01:28.745587Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from torch.optim.lr_scheduler import CosineAnnealingLR, CosineAnnealingWarmRestarts, ReduceLROnPlateau, OneCycleLR\n\ndef get_optimizer(lr, params):\n    model_optimizer = torch.optim.Adam(\n            filter(lambda p: p.requires_grad, params), \n            lr=lr,\n            weight_decay=Config.weight_decay\n        )\n    interval = \"epoch\"\n    \n    lr_scheduler = CosineAnnealingWarmRestarts(\n                            model_optimizer, \n                            T_0=Config.epochs, \n                            T_mult=1, \n                            eta_min=1e-6, \n                            last_epoch=-1\n                        )\n\n    return model_optimizer, lr_scheduler","metadata":{"_uuid":"b42d563e-06c1-44e4-b301-da3152c1a8df","_cell_guid":"9b520fb0-cd1f-4e55-9477-087b7912f5b7","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-06-18T23:01:28.748864Z","iopub.execute_input":"2024-06-18T23:01:28.749351Z","iopub.status.idle":"2024-06-18T23:01:28.756777Z","shell.execute_reply.started":"2024-06-18T23:01:28.749306Z","shell.execute_reply":"2024-06-18T23:01:28.755706Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nclass Effnet(nn.Module):\n    def __init__(self, model_name=Config.model, num_classes = Config.num_classes, pretrained=True):\n        super(Effnet, self).__init__()\n        self.backbone = timm.create_model(model_name, pretrained=pretrained)\n        self.in_features = self.backbone.classifier.in_features\n        self.backbone.classifier = nn.Sequential(\n                nn.Linear(self.in_features, num_classes)\n            )\n        \n\n    def forward(self, images):\n        out=self.backbone(images)\n        return out","metadata":{"_uuid":"8912d85a-22b3-423b-9ae4-1105563ede96","_cell_guid":"1287921a-1b44-4c55-a834-d1889cdb8004","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-06-18T23:01:28.758103Z","iopub.execute_input":"2024-06-18T23:01:28.758404Z","iopub.status.idle":"2024-06-18T23:01:28.768299Z","shell.execute_reply.started":"2024-06-18T23:01:28.758374Z","shell.execute_reply":"2024-06-18T23:01:28.767257Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch\n\ndef compute_multilabel_accuracy(target, ground_truth):\n    \"\"\"\n    Computes accuracy for multilabel classification task.\n    \n    Args:\n    - target (torch.Tensor): Predicted tensor of shape (batch_size, num_classes).\n    - ground_truth (torch.Tensor): Ground truth tensor of shape (batch_size, num_classes).\n    \n    Returns:\n    - float: Accuracy value between 0 and 1.\n    \"\"\"\n    # Convert tensors to numpy arrays for easier comparison\n    target_np = target.numpy()\n    ground_truth_np = ground_truth.numpy()\n    \n    # Calculate accuracy for each instance in the batch\n    correct_instances = 0\n    total_instances = target.size(0)\n    for i in range(total_instances):\n        if (target_np[i] == ground_truth_np[i]).all():\n            correct_instances += 1\n    \n    # Compute overall accuracy\n    accuracy = correct_instances / total_instances\n    \n    return accuracy\n\n# Example usage with your provided tensors\ntarget = torch.tensor([[0., 0., 0., .7, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n                       [0., 1., 0., 0., .9, 1., 0., 1., 0., 0., 0., 0., 1., 0.]])\nground_truth = torch.tensor([[0., 0., 0., .7, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n                             [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])\n\naccuracy = compute_multilabel_accuracy(target, ground_truth)\nprint(accuracy)","metadata":{"_uuid":"d436ab59-3dff-43e8-a7e6-53a0682c493f","_cell_guid":"af978a58-94e0-40a8-b905-3103076f3045","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-06-18T23:01:28.771191Z","iopub.execute_input":"2024-06-18T23:01:28.771658Z","iopub.status.idle":"2024-06-18T23:01:28.782866Z","shell.execute_reply.started":"2024-06-18T23:01:28.771616Z","shell.execute_reply":"2024-06-18T23:01:28.781932Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport pytorch_lightning as pl\n\nclass BirdClefModel(pl.LightningModule):\n    def __init__(self, model):\n        super().__init__()\n        self.backbone = model\n        self.loss_function = nn.BCEWithLogitsLoss() \n        self.sigmoid = nn.Sigmoid()  # Specify dim=1 for multilabel classification\n\n    def forward(self, images):\n        logits = self.backbone(images)\n        \n        return logits\n\n    def configure_optimizers(self):\n        optimizer, scheduler = get_optimizer(lr=Config.LR, params=self.backbone.parameters())\n        self.optimizer = optimizer\n        self.scheduler = scheduler\n        return [optimizer], [scheduler]\n\n    def training_step(self, batch, batch_idx):\n        image, target, _ = batch        \n        y_pred = self.backbone(image)\n        loss = self.loss_function(y_pred, target)\n        train_acc = compute_multilabel_accuracy((self.sigmoid(y_pred).detach().cpu()>.5)*1.0, target.cpu())\n        logs = {'train_loss': loss, 'lr': self.optimizer.param_groups[0]['lr'], 'train_acc': train_acc}\n        \n        self.log_dict(logs, on_step=True, prog_bar=True, logger=True)\n        return loss        \n\n    def validation_step(self, batch, batch_idx):\n        image, target, _ = batch     \n        y_pred = self(image)\n        val_loss = self.loss_function(y_pred, target)\n        val_acc = compute_multilabel_accuracy((self.sigmoid(y_pred).detach().cpu()>.5)*1.0, target.cpu())\n        \n        logs = {'valid_loss': val_loss, 'val_acc': val_acc}\n        self.log_dict(logs,prog_bar=True)\n        \n        return {\"val_loss\": val_loss,'val_acc': val_acc, \"logits\": y_pred, \"targets\": target}","metadata":{"_uuid":"5c7cda6e-42c3-4ad1-8d9d-0071f0402407","_cell_guid":"90cfe073-5e25-4ab4-9fc6-3e243b70fc05","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-06-18T23:01:28.784026Z","iopub.execute_input":"2024-06-18T23:01:28.784348Z","iopub.status.idle":"2024-06-18T23:01:28.800120Z","shell.execute_reply.started":"2024-06-18T23:01:28.784320Z","shell.execute_reply":"2024-06-18T23:01:28.799219Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Config.LR=5e-3\nConfig.debug=False\nConfig.epochs=30\nConfig.warmup=15\nConfig.PATIENCE=5\nConfig.wandblog=True","metadata":{"_uuid":"4212aa82-f071-4bf4-91f0-f1309be3c184","_cell_guid":"98049999-2f86-40e0-90d5-f044e37f6749","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-06-18T23:01:28.801244Z","iopub.execute_input":"2024-06-18T23:01:28.801533Z","iopub.status.idle":"2024-06-18T23:01:28.814588Z","shell.execute_reply.started":"2024-06-18T23:01:28.801505Z","shell.execute_reply":"2024-06-18T23:01:28.813564Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = Effnet()","metadata":{"_uuid":"574eb0dd-cac2-4589-869f-6a6da191ab95","_cell_guid":"1f9477e8-448a-40ed-a549-1fdebe424984","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-06-18T23:01:28.815761Z","iopub.execute_input":"2024-06-18T23:01:28.816064Z","iopub.status.idle":"2024-06-18T23:01:29.345052Z","shell.execute_reply.started":"2024-06-18T23:01:28.816023Z","shell.execute_reply":"2024-06-18T23:01:29.343784Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n        \n\naudio_model = BirdClefModel(model)\ntrainer = pl.Trainer(\n    gpus=1,\n    deterministic=True,\n    max_epochs=Config.epochs,\n    auto_lr_find=False,    \n    precision=Config.PRECISION, accelerator=\"gpu\" \n)\n\nprint(\"Running trainer.fit\")\ntrainer.fit(audio_model, train_dataloaders = train_loader, val_dataloaders = val_loader)","metadata":{"_uuid":"d8afd41f-9362-430b-982c-34e0b564fd2a","_cell_guid":"98ae7cd8-28df-4a30-924f-07722b05fe33","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-06-18T23:01:29.346682Z","iopub.execute_input":"2024-06-18T23:01:29.347088Z","iopub.status.idle":"2024-06-18T23:04:51.175497Z","shell.execute_reply.started":"2024-06-18T23:01:29.347044Z","shell.execute_reply":"2024-06-18T23:04:51.173841Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"torch.save(model.state_dict(), 'b4eights.pth')","metadata":{"execution":{"iopub.status.busy":"2024-06-18T23:04:59.777169Z","iopub.execute_input":"2024-06-18T23:04:59.777941Z","iopub.status.idle":"2024-06-18T23:04:59.972577Z","shell.execute_reply.started":"2024-06-18T23:04:59.777904Z","shell.execute_reply":"2024-06-18T23:04:59.971468Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}