{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":8900,"databundleVersionId":862232,"sourceType":"competition"}],"dockerImageVersionId":30587,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import torch\nimport cv2 as cv\nimport numpy as np\nimport pandas as pd\nimport librosa \nimport torchvision\n\nfrom torch.utils.data.dataset import Dataset\nfrom torch.utils.data import DataLoader\nfrom sklearn.model_selection import train_test_split","metadata":{"execution":{"iopub.status.busy":"2023-11-28T06:45:02.841931Z","iopub.execute_input":"2023-11-28T06:45:02.842457Z","iopub.status.idle":"2023-11-28T06:45:02.850335Z","shell.execute_reply.started":"2023-11-28T06:45:02.842410Z","shell.execute_reply":"2023-11-28T06:45:02.848953Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nprint(device)","metadata":{"execution":{"iopub.status.busy":"2023-11-28T06:45:02.852694Z","iopub.execute_input":"2023-11-28T06:45:02.853430Z","iopub.status.idle":"2023-11-28T06:45:02.878973Z","shell.execute_reply.started":"2023-11-28T06:45:02.853394Z","shell.execute_reply":"2023-11-28T06:45:02.877658Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dataset_dir = '/kaggle/input/freesound-audio-tagging/audio_train/'\ntrain_csv = '/kaggle/input/freesound-audio-tagging//train.csv'\ntest_dataset_dir = '/kaggle/input/freesound-audio-tagging//audio_test/'\ntest_csv = '/kaggle/input/freesound-audio-tagging//sample_submission.csv'","metadata":{"execution":{"iopub.status.busy":"2023-11-28T06:45:02.880576Z","iopub.execute_input":"2023-11-28T06:45:02.881693Z","iopub.status.idle":"2023-11-28T06:45:02.893106Z","shell.execute_reply.started":"2023-11-28T06:45:02.881633Z","shell.execute_reply":"2023-11-28T06:45:02.891742Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = pd.read_csv(train_csv)\ntest = pd.read_csv(test_csv)","metadata":{"execution":{"iopub.status.busy":"2023-11-28T06:45:02.894861Z","iopub.execute_input":"2023-11-28T06:45:02.895886Z","iopub.status.idle":"2023-11-28T06:45:02.939536Z","shell.execute_reply.started":"2023-11-28T06:45:02.895838Z","shell.execute_reply":"2023-11-28T06:45:02.938571Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labels = np.unique(train.label.values)\nlabel_encoder = {label:i for i, label in enumerate(labels)}","metadata":{"execution":{"iopub.status.busy":"2023-11-28T06:45:02.942585Z","iopub.execute_input":"2023-11-28T06:45:02.943298Z","iopub.status.idle":"2023-11-28T06:45:02.958784Z","shell.execute_reply.started":"2023-11-28T06:45:02.943258Z","shell.execute_reply":"2023-11-28T06:45:02.957528Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class AudioDataset(Dataset):\n    def __init__(self, data, path, test=False):\n        self.data = data\n        self.path = path\n        self.test = test\n\n    def __len__(self):\n        return len(self.data.fname)\n\n    def __getitem__(self, idx): \n        filename = self.path + self.data.fname.values[idx]\n        label = self.data.label.values[idx]\n        \n        signal_length_s = 4\n        size = (128, 128)\n        \n        signal, sr = librosa.load(filename)\n        signal, _ = librosa.effects.trim(signal)\n        if len(signal) > sr * signal_length_s:\n            signal = signal[0: sr * signal_length_s]\n        signal = librosa.feature.melspectrogram(y=signal)    \n        signal = librosa.power_to_db(signal, ref=np.max)\n        \n        signal = cv.resize(signal, size)\n        try:\n            signal = cv.resize(signal, size)\n        except Exception as e:\n            signal = np.zeros(shape=(signal[1], signal[0]))\n        \n        x = np.zeros(shape=(3, size[1], size[0]))\n        for j in range(3):\n            x[j,:,:] = signal\n        xt = torch.tensor(x, dtype=torch.float)\n        \n        if self.test == False:\n            return xt, label_encoder[label]\n        else:\n            return xt","metadata":{"execution":{"iopub.status.busy":"2023-11-28T06:45:02.960413Z","iopub.execute_input":"2023-11-28T06:45:02.960811Z","iopub.status.idle":"2023-11-28T06:45:02.973709Z","shell.execute_reply.started":"2023-11-28T06:45:02.960748Z","shell.execute_reply":"2023-11-28T06:45:02.972658Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"batch_size = 64\n\nx_train, x_validation, y_train, y_validation = train_test_split(train, train, test_size=0.2, shuffle=True, random_state=5)\n\ntrain_set = AudioDataset(x_train, train_dataset_dir)\nvalidation_set = AudioDataset(x_validation, train_dataset_dir)\ntrain_loader = DataLoader(train_set, batch_size=batch_size, shuffle=True)\nvalidation_loader = DataLoader(validation_set , batch_size=batch_size, shuffle=True)","metadata":{"execution":{"iopub.status.busy":"2023-11-28T06:45:02.975255Z","iopub.execute_input":"2023-11-28T06:45:02.976582Z","iopub.status.idle":"2023-11-28T06:45:02.999004Z","shell.execute_reply.started":"2023-11-28T06:45:02.976543Z","shell.execute_reply":"2023-11-28T06:45:02.997555Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# model = torchvision.models.mobilenet_v3_large(weights=torchvision.models.MobileNet_V3_Large_Weights.DEFAULT)\nmodel = torchvision.models.resnet18()\nmodel.fc = torch.nn.Linear(512, 41)\nmodel.to(device);","metadata":{"execution":{"iopub.status.busy":"2023-11-28T06:45:03.000723Z","iopub.execute_input":"2023-11-28T06:45:03.001402Z","iopub.status.idle":"2023-11-28T06:45:03.253107Z","shell.execute_reply.started":"2023-11-28T06:45:03.001367Z","shell.execute_reply":"2023-11-28T06:45:03.252093Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"epochs = 16\noptimizer = torch.optim.Adam(model.parameters(), lr=0.001)\ncost = torch.nn.CrossEntropyLoss()","metadata":{"execution":{"iopub.status.busy":"2023-11-28T06:45:03.254826Z","iopub.execute_input":"2023-11-28T06:45:03.255512Z","iopub.status.idle":"2023-11-28T06:45:03.262724Z","shell.execute_reply.started":"2023-11-28T06:45:03.255476Z","shell.execute_reply":"2023-11-28T06:45:03.261895Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for epoch in range(epochs):\n    train_loss = 0\n    val_loss = 0\n    train_correct = 0\n    val_correct = 0\n    \n    model.train()\n    for x, y in train_loader:\n        optimizer.zero_grad()\n        x,y = x.to(device),y.to(device)\n        pred = model(x)\n        loss = cost(pred, y)\n        train_loss += cost(pred, y).item()\n        train_correct += (pred.argmax(1) == y).type(torch.float).sum().item()\n        loss.backward()\n        optimizer.step()\n\n    model.eval()\n    with torch.no_grad():\n        for x, y in validation_loader:\n            x,y = x.to(device),y.to(device)\n            pred = model(x)\n            loss = cost(pred, y)\n            val_loss += cost(pred, y).item()\n            val_correct += (pred.argmax(1) == y).type(torch.float).sum().item()\n            \n    train_loss = train_loss/len(train_loader)\n    val_loss = val_loss/len(validation_loader)\n    train_accuracy = train_correct / len(x_train)\n    val_accuracy = val_correct / len(x_validation)\n    \n    print(\"epoch = %d, train_loss = %.5f, val_loss = %.5f, train_accuracy = %.5f, val_accuracy = %.5f\" % (epoch, train_loss, val_loss, train_accuracy, val_accuracy))","metadata":{"execution":{"iopub.status.busy":"2023-11-28T06:45:03.264145Z","iopub.execute_input":"2023-11-28T06:45:03.264681Z","iopub.status.idle":"2023-11-28T06:45:11.947326Z","shell.execute_reply.started":"2023-11-28T06:45:03.264649Z","shell.execute_reply":"2023-11-28T06:45:11.944915Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_dataset = AudioDataset(test, test_dataset_dir, test=True)\ntest_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)\npredictions = torch.tensor([])\n\nmodel.eval()\nfor x in test_loader:\n    x = x.to(device)\n    with torch.no_grad():\n        y_hat = model(x)\n    predictions = torch.cat([predictions, y_hat.cpu()])","metadata":{"execution":{"iopub.status.busy":"2023-11-28T06:45:11.948567Z","iopub.status.idle":"2023-11-28T06:45:11.949209Z","shell.execute_reply.started":"2023-11-28T06:45:11.948906Z","shell.execute_reply":"2023-11-28T06:45:11.948936Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions = torch.nn.functional.softmax(predictions, dim=1).detach().numpy()","metadata":{"execution":{"iopub.status.busy":"2023-11-28T06:45:11.951275Z","iopub.status.idle":"2023-11-28T06:45:11.952176Z","shell.execute_reply.started":"2023-11-28T06:45:11.951905Z","shell.execute_reply":"2023-11-28T06:45:11.951933Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission_top1 = test.copy()\n\nN = len(test)\nfor i in range(N):\n    p = predictions[i, :]\n    idx = np.argmax(p)\n    submission_top1.label[i] = labels[idx]\n\nsubmission_top1.to_csv('submission.csv', index=False, header=True)","metadata":{"execution":{"iopub.status.busy":"2023-11-28T06:45:11.953919Z","iopub.status.idle":"2023-11-28T06:45:11.954378Z","shell.execute_reply.started":"2023-11-28T06:45:11.954171Z","shell.execute_reply":"2023-11-28T06:45:11.954191Z"},"trusted":true},"execution_count":null,"outputs":[]}]}