{"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 os\nimport cv2\nimport pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport matplotlib.image as mpimg\nimport math\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\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":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","papermill":{"duration":5.121975,"end_time":"2023-10-01T14:48:02.965756","exception":false,"start_time":"2023-10-01T14:47:57.843781","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-11-09T18:32:15.689579Z","iopub.execute_input":"2023-11-09T18:32:15.690015Z","iopub.status.idle":"2023-11-09T18:32:15.699106Z","shell.execute_reply.started":"2023-11-09T18:32:15.689981Z","shell.execute_reply":"2023-11-09T18:32:15.697609Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = 'cuda' if torch.cuda.is_available() else 'cpu'\nprint(device)","metadata":{"papermill":{"duration":0.080006,"end_time":"2023-10-01T14:48:03.049487","exception":false,"start_time":"2023-10-01T14:48:02.969481","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-11-09T18:32:15.701715Z","iopub.execute_input":"2023-11-09T18:32:15.702613Z","iopub.status.idle":"2023-11-09T18:32:15.717545Z","shell.execute_reply.started":"2023-11-09T18:32:15.702572Z","shell.execute_reply":"2023-11-09T18:32:15.716094Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_path = '../input/freesound-audio-tagging/audio_train/'\ntrain = pd.read_csv(\"../input/freesound-audio-tagging/train.csv\")\ntrain.head()","metadata":{"papermill":{"duration":0.048624,"end_time":"2023-10-01T14:48:03.101101","exception":false,"start_time":"2023-10-01T14:48:03.052477","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-11-09T18:32:15.719238Z","iopub.execute_input":"2023-11-09T18:32:15.719783Z","iopub.status.idle":"2023-11-09T18:32:15.751320Z","shell.execute_reply.started":"2023-11-09T18:32:15.719749Z","shell.execute_reply":"2023-11-09T18:32:15.750047Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"num_labels = len(train.label.unique())\nprint(num_labels)\nprint(train.label.unique())","metadata":{"papermill":{"duration":0.015931,"end_time":"2023-10-01T14:48:03.120124","exception":false,"start_time":"2023-10-01T14:48:03.104193","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-11-09T18:32:15.754628Z","iopub.execute_input":"2023-11-09T18:32:15.755677Z","iopub.status.idle":"2023-11-09T18:32:15.764752Z","shell.execute_reply.started":"2023-11-09T18:32:15.755633Z","shell.execute_reply":"2023-11-09T18:32:15.763327Z"},"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":{"papermill":{"duration":0.015139,"end_time":"2023-10-01T14:48:03.138227","exception":false,"start_time":"2023-10-01T14:48:03.123088","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-11-09T18:32:15.766394Z","iopub.execute_input":"2023-11-09T18:32:15.766836Z","iopub.status.idle":"2023-11-09T18:32:15.785979Z","shell.execute_reply.started":"2023-11-09T18:32:15.766799Z","shell.execute_reply":"2023-11-09T18:32:15.784800Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img_size = (128, 128)\nTRAIN_PATH = '../input/freesound-audio-tagging/audio_train/'\nTEST_PATH = '../input/freesound-audio-tagging/audio_test/'\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,img_size[0], img_size[1]))\n        FILE = self.dataframe.fname.values[index]\n        LABEL = self.dataframe.label.values[index]\n        \n        path = (TEST_PATH if self.test else TRAIN_PATH) + 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, (img_size[1], img_size[0]))\n        except Exception as e:\n            print(path)\n            print(str(e))\n            resized = np.zeros(shape=(img_size[1], img_size[0]))\n        \n        for j in range(3):\n                X[j,:,:] = resized\n\n        if self.test == False:\n            y = label_encoder[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]","metadata":{"papermill":{"duration":0.01358,"end_time":"2023-10-01T14:48:03.155000","exception":false,"start_time":"2023-10-01T14:48:03.141420","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-11-09T18:32:15.788019Z","iopub.execute_input":"2023-11-09T18:32:15.788413Z","iopub.status.idle":"2023-11-09T18:32:15.801358Z","shell.execute_reply.started":"2023-11-09T18:32:15.788383Z","shell.execute_reply":"2023-11-09T18:32:15.800284Z"},"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)\ntrain_set = Dataset(x_train)\nval_set = Dataset(x_validation)\ntrain_loader = DataLoader(train_set, batch_size=batch_size, shuffle=True)\nval_loader = DataLoader(val_set , batch_size=batch_size, shuffle=True)\n\nprint('Train set size: {}, Validation set size: {}'.format(x_train.shape[0], x_validation.shape[0]))","metadata":{"papermill":{"duration":0.018161,"end_time":"2023-10-01T14:48:03.176108","exception":false,"start_time":"2023-10-01T14:48:03.157947","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-11-09T18:32:15.802990Z","iopub.execute_input":"2023-11-09T18:32:15.803422Z","iopub.status.idle":"2023-11-09T18:32:15.823475Z","shell.execute_reply.started":"2023-11-09T18:32:15.803387Z","shell.execute_reply":"2023-11-09T18:32:15.821916Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from torchvision.models import resnet101\n\nmodel = resnet101(pretrained=True)\nnum_ftrs = model.fc.in_features\nmodel.fc = torch.nn.Linear(num_ftrs, num_labels)\nmodel = model.to(device)\nmodel.to(device);","metadata":{"papermill":{"duration":6.536644,"end_time":"2023-10-01T14:48:09.715648","exception":false,"start_time":"2023-10-01T14:48:03.179004","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-11-09T18:32:15.824772Z","iopub.execute_input":"2023-11-09T18:32:15.825134Z","iopub.status.idle":"2023-11-09T18:32:19.979658Z","shell.execute_reply.started":"2023-11-09T18:32:15.825106Z","shell.execute_reply":"2023-11-09T18:32:19.978695Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"epochs = 10\noptimizer = torch.optim.AdamW(model.parameters(), lr=0.001)\ncost = torch.nn.CrossEntropyLoss()","metadata":{"papermill":{"duration":0.011173,"end_time":"2023-10-01T14:48:09.745042","exception":false,"start_time":"2023-10-01T14:48:09.733869","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-11-09T18:32:19.988421Z","iopub.execute_input":"2023-11-09T18:32:19.988737Z","iopub.status.idle":"2023-11-09T18:32:20.004863Z","shell.execute_reply.started":"2023-11-09T18:32:19.988712Z","shell.execute_reply":"2023-11-09T18:32:20.003786Z"},"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    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 val_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    train_loss = train_loss/len(train_loader)\n    val_loss = val_loss/len(val_loader)\n    train_accuracy = train_correct / len(x_train)\n    val_accuracy = val_correct / len(x_validation)\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":{"papermill":{"duration":3105.633078,"end_time":"2023-10-01T15:39:55.381772","exception":false,"start_time":"2023-10-01T14:48:09.748694","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-11-09T18:32:20.006271Z","iopub.execute_input":"2023-11-09T18:32:20.006609Z","iopub.status.idle":"2023-11-09T18:33:32.537216Z","shell.execute_reply.started":"2023-11-09T18:32:20.006562Z","shell.execute_reply":"2023-11-09T18:33:32.535644Z"},"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()\n\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":{"papermill":{"duration":470.259752,"end_time":"2023-10-01T15:47:45.653704","exception":false,"start_time":"2023-10-01T15:39:55.393952","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-11-09T18:33:32.538295Z","iopub.status.idle":"2023-11-09T18:33:32.538739Z","shell.execute_reply.started":"2023-11-09T18:33:32.538535Z","shell.execute_reply":"2023-11-09T18:33:32.538554Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions = F.softmax(predictions, dim=1).detach().numpy()\n\nsubmission_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_final.csv', index=False, header=True)\nsubmission_top1.head()","metadata":{"papermill":{"duration":0.946567,"end_time":"2023-10-01T15:47:46.634609","exception":false,"start_time":"2023-10-01T15:47:45.688042","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-11-09T18:33:32.542692Z","iopub.status.idle":"2023-11-09T18:33:32.543066Z","shell.execute_reply.started":"2023-11-09T18:33:32.542875Z","shell.execute_reply":"2023-11-09T18:33:32.542891Z"},"trusted":true},"execution_count":null,"outputs":[]}]}