{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport matplotlib.image as mpimg\nimport math\nimport os\nimport cv2\nimport IPython.display as ipd \nimport librosa \nimport librosa.display\nimport torch\nimport numpy as np\nimport torch.nn.functional as F\nimport torchvision\n#import torchsummary\n\nfrom sklearn.preprocessing import LabelEncoder\nfrom sklearn.model_selection import train_test_split\nfrom torch.utils.data.dataset import Dataset\nfrom torch.utils.data import DataLoader\nfrom torchvision import transforms","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-10-19T15:59:50.971035Z","iopub.execute_input":"2023-10-19T15:59:50.971393Z","iopub.status.idle":"2023-10-19T15:59:50.978350Z","shell.execute_reply.started":"2023-10-19T15:59:50.971365Z","shell.execute_reply":"2023-10-19T15:59:50.977404Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = 'cuda:0' if torch.cuda.is_available() else 'cpu'\nprint(device)","metadata":{"execution":{"iopub.status.busy":"2023-10-19T15:59:50.980255Z","iopub.execute_input":"2023-10-19T15:59:50.981037Z","iopub.status.idle":"2023-10-19T15:59:50.997361Z","shell.execute_reply.started":"2023-10-19T15:59:50.981000Z","shell.execute_reply":"2023-10-19T15:59:50.996498Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"trainPath = '/kaggle/input/freesound-audio-tagging/audio_train/'\ntrainData = pd.read_csv('/kaggle/input/freesound-audio-tagging/train.csv')\ntrainData.head()","metadata":{"execution":{"iopub.status.busy":"2023-10-19T15:59:50.998832Z","iopub.execute_input":"2023-10-19T15:59:50.999132Z","iopub.status.idle":"2023-10-19T15:59:51.032594Z","shell.execute_reply.started":"2023-10-19T15:59:50.999108Z","shell.execute_reply":"2023-10-19T15:59:51.031711Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(len(trainData.label.unique()))\nprint(trainData.label.unique())","metadata":{"execution":{"iopub.status.busy":"2023-10-19T15:59:51.033560Z","iopub.execute_input":"2023-10-19T15:59:51.033812Z","iopub.status.idle":"2023-10-19T15:59:51.040292Z","shell.execute_reply.started":"2023-10-19T15:59:51.033790Z","shell.execute_reply":"2023-10-19T15:59:51.039321Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataLabels = np.unique(trainData.label.values)\ndataLabelsEncoder = {dataLabel:i for i, dataLabel in enumerate(dataLabels)}\n\nprint(dataLabelsEncoder['Cello'])\nprint(dataLabelsEncoder['Gunshot_or_gunfire'])","metadata":{"execution":{"iopub.status.busy":"2023-10-19T15:59:51.042090Z","iopub.execute_input":"2023-10-19T15:59:51.042333Z","iopub.status.idle":"2023-10-19T15:59:51.058492Z","shell.execute_reply.started":"2023-10-19T15:59:51.042306Z","shell.execute_reply":"2023-10-19T15:59:51.057488Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"processingImgSize = (128,128)\ntestPath = '/kaggle/input/freesound-audio-tagging/audio_test/'\n\n\nclass Dataset(Dataset):\n    def __init__(self, dataframe, test=False):\n        self.dataframe = dataframe\n        self.test = test\n        \n    def __getitem__(self, index):\n\n        X = np.zeros(shape=(3,processingImgSize[0], processingImgSize[1]))\n        file = self.dataframe.fname.values[index]\n        label = self.dataframe.label.values[index]\n        \n        path = (testPath if self.test else trainPath) + file\n        signal, _ = librosa.load(path)\n        signal = librosa.feature.melspectrogram(y=signal)    \n        signal = librosa.power_to_db(signal, ref=np.max) \n        \n        try:\n            resized = cv2.resize(signal, (processingImgSize[1], processingImgSize[0]))\n        except Exception as e:\n            print(path)\n            print(str(e))\n            resized = np.zeros(shape=(processingImgSize[1], processingImgSize[0]))\n        \n        for j in range(3):\n                X[j,:,:] = resized\n\n        if self.test == False:\n            y = dataLabelsEncoder[label]\n            return torch.tensor(X, dtype=torch.float), y\n        else:\n             return torch.tensor(X, dtype=torch.float)\n        \n    def __len__(self):\n        return self.dataframe.shape[0]\n\n","metadata":{"execution":{"iopub.status.busy":"2023-10-19T15:59:51.059619Z","iopub.execute_input":"2023-10-19T15:59:51.059870Z","iopub.status.idle":"2023-10-19T15:59:51.073713Z","shell.execute_reply.started":"2023-10-19T15:59:51.059849Z","shell.execute_reply":"2023-10-19T15:59:51.072929Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"batch_size = 64\n\nxTrain, xVal, yTrain, yVal = train_test_split(trainData, trainData, test_size=0.2, shuffle=True, random_state=5)\n\n# Create dataloaders form datasets\ntrainSet = Dataset(xTrain)\nvalSet = Dataset(xVal)\ntrainLoader = DataLoader(trainSet, batch_size=batch_size, shuffle=True)\nvalLoader = DataLoader(valSet , batch_size=batch_size, shuffle=True)\n\nprint('Training set: {}, Validation set: {}'.format(xTrain.shape[0], xVal.shape[0]))","metadata":{"execution":{"iopub.status.busy":"2023-10-19T15:59:51.075177Z","iopub.execute_input":"2023-10-19T15:59:51.075529Z","iopub.status.idle":"2023-10-19T15:59:51.095375Z","shell.execute_reply.started":"2023-10-19T15:59:51.075497Z","shell.execute_reply":"2023-10-19T15:59:51.094262Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install torchsummary\nimport torch.optim as optim\nimport torchsummary\n#model = torchvision.models.resnext50_32x4d(pretrained=True)\nmodel = torchvision.models.efficientnet_b0(pretrained=True)\ncriterion = torch.nn.CrossEntropyLoss()\noptimizer = optim.Adam(model.parameters(), lr=0.001)\ntorchsummary.summary(model.cuda(), (3, processingImgSize[0], processingImgSize[1]))\nmodel.classifier[1] = torch.nn.Linear(1280, 41)\nprint(device)\nmodel.to(device);","metadata":{"execution":{"iopub.status.busy":"2023-10-19T18:43:46.459457Z","iopub.execute_input":"2023-10-19T18:43:46.460274Z","iopub.status.idle":"2023-10-19T18:43:55.290363Z","shell.execute_reply.started":"2023-10-19T18:43:46.460247Z","shell.execute_reply":"2023-10-19T18:43:55.289210Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from time import time \nstart_time = time()\n\nepochs = 10\noptimizer = torch.optim.Adam(model.parameters(), lr=0.001)\ncost = torch.nn.CrossEntropyLoss()\nfor epoch in range(epochs):\n    train_loss = 0\n    val_loss = 0\n    train_correct = 0\n    val_correct = 0\n    model.train()\n    for x, y in trainLoader:\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 valLoader:\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    train_loss = train_loss/len(trainLoader)\n    val_loss = val_loss/len(valLoader)\n    train_accuracy = train_correct / len(xTrain)\n    val_accuracy = val_correct / len(xVal)\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))\n    \n\n# Вывод времени обучения\nend_time = time()\ntotal_time = end_time - start_time\nprint(f'Total Training Time: {total_time:.2f} seconds')","metadata":{"execution":{"iopub.status.busy":"2023-10-19T17:17:42.202790Z","iopub.execute_input":"2023-10-19T17:17:42.203132Z","iopub.status.idle":"2023-10-19T18:17:39.348203Z","shell.execute_reply.started":"2023-10-19T17:17:42.203103Z","shell.execute_reply":"2023-10-19T18:17:39.346948Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test = pd.read_csv('../input/freesound-audio-tagging/sample_submission.csv')\n\ntest_dataset = Dataset(test, test=True)\ntest_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)\npredictions = torch.tensor([])\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-10-19T18:20:33.244467Z","iopub.execute_input":"2023-10-19T18:20:33.245182Z","iopub.status.idle":"2023-10-19T18:28:17.460573Z","shell.execute_reply.started":"2023-10-19T18:20:33.245134Z","shell.execute_reply":"2023-10-19T18:28:17.459757Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions = F.softmax(predictions, dim=1).detach().numpy()","metadata":{},"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] = dataLabels[idx]\n\nsubmission_top1.to_csv('submission_final.csv', index=False, header=True)\n\nsubmission_top1.head()","metadata":{"execution":{"iopub.status.busy":"2023-10-19T18:35:57.432316Z","iopub.execute_input":"2023-10-19T18:35:57.433026Z","iopub.status.idle":"2023-10-19T18:35:59.157926Z","shell.execute_reply.started":"2023-10-19T18:35:57.432995Z","shell.execute_reply":"2023-10-19T18:35:59.156934Z"},"trusted":true},"execution_count":null,"outputs":[]}]}