{"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":2},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython2","version":"2.7.6"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":8900,"databundleVersionId":862232,"sourceType":"competition"}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"## Установка и импорт библиотек","metadata":{}},{"cell_type":"code","source":"pip install pandas numpy matplotlib torchsummary scikit-learn librosa","metadata":{"ExecuteTime":{"end_time":"2024-10-19T09:23:18.671373Z","start_time":"2024-10-19T09:23:15.777760Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Fix ImportError: Numba needs NumPy 2.0 or less. Got NumPy 2.1.\npip install numba --upgrade","metadata":{"ExecuteTime":{"end_time":"2024-10-19T09:36:34.974318Z","start_time":"2024-10-19T09:36:34.961671Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118","metadata":{"ExecuteTime":{"end_time":"2024-10-19T09:30:32.641099Z","start_time":"2024-10-19T09:26:08.353825Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\n%matplotlib inline\n\nimport warnings\nwarnings.filterwarnings(\"ignore\")\nimport librosa \nimport librosa.display\n\nimport torch\nimport torch.optim as optim\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom torch.utils.data.dataset import Dataset\nfrom torch.utils.data import DataLoader\nimport torchvision\nimport torchsummary\nfrom sklearn.model_selection import train_test_split\nfrom PIL import Image\nfrom time import time \n\ndevice = 'cuda:0' if torch.cuda.is_available() else 'cpu'\nprint(device)","metadata":{"ExecuteTime":{"end_time":"2024-10-20T10:42:25.820892Z","start_time":"2024-10-20T10:42:22.446195Z"},"collapsed":true,"jupyter":{"outputs_hidden":true}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"trainPathWav = 'freesound-audio-tagging/audio_train/'\ntrainPathCsv = 'freesound-audio-tagging/train.csv'\n\ntestPathWav = 'freesound-audio-tagging/audio_test/'\ntestPathCsv = 'freesound-audio-tagging/sample_submission.csv'\n\ntrainData = pd.read_csv(trainPathCsv)\ntestData = pd.read_csv(testPathCsv)\ntrainData.head()","metadata":{"ExecuteTime":{"end_time":"2024-10-20T10:42:36.945959Z","start_time":"2024-10-20T10:42:36.911500Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"unique_labels = trainData['label'].unique()\n\ntable = pd.DataFrame({\n    'Unique Labels': unique_labels\n})\n\nprint(f\"Number of unique labels: {len(unique_labels)}\")\nprint(table)","metadata":{"ExecuteTime":{"end_time":"2024-10-20T10:42:38.553578Z","start_time":"2024-10-20T10:42:38.543661Z"}},"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['Tambourine'])\nprint(dataLabelsEncoder['Acoustic_guitar'])","metadata":{"ExecuteTime":{"end_time":"2024-10-20T10:42:39.818160Z","start_time":"2024-10-20T10:42:39.797916Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"processingImgSize = (224,224)\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        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 = (testPathWav if self.test else trainPathWav) + 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        resized = Image.fromarray(signal)\n        resized = resized.resize((processingImgSize[1], processingImgSize[0]))\n        resized = np.array(resized)\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]","metadata":{"ExecuteTime":{"end_time":"2024-10-20T10:45:39.386057Z","start_time":"2024-10-20T10:45:39.378454Z"}},"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\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":{"ExecuteTime":{"end_time":"2024-10-20T10:42:44.793568Z","start_time":"2024-10-20T10:42:44.773557Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = torchvision.models.efficientnet_b0(pretrained=True)\ncriterion = torch.nn.CrossEntropyLoss()\noptimizer = optim.Adam(model.parameters(), lr=0.001)\ntorchsummary.summary(model.cpu(), (3, processingImgSize[0], processingImgSize[1]))\nmodel.classifier[1] = torch.nn.Linear(1280, 41)\nmodel.to(device);","metadata":{"ExecuteTime":{"end_time":"2024-10-19T09:42:49.731973Z","start_time":"2024-10-19T09:42:49.356831Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"start_time = time()\n\nepochs = 1\noptimizer = torch.optim.Adam(model.parameters(), lr=0.001)\ncost = torch.nn.CrossEntropyLoss()\n\nfor 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 trainLoader:\n        optimizer.zero_grad()\n        x,y = x.to(device),y.to(device)\n        \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        \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            \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\nend_time = time()\ntotal_time = end_time - start_time\nprint(f'Total Training Time: {total_time:.2f} seconds')","metadata":{"ExecuteTime":{"end_time":"2024-10-19T09:48:20.278902Z","start_time":"2024-10-19T09:42:51.220452Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_dataset = Dataset(testData, 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":{"ExecuteTime":{"end_time":"2024-10-19T09:52:31.672926Z","start_time":"2024-10-19T09:49:46.469568Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions = F.softmax(predictions, dim=1).detach().numpy()","metadata":{"ExecuteTime":{"end_time":"2024-10-19T09:52:31.687266Z","start_time":"2024-10-19T09:52:31.673946Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission_top1 = testData.copy()\n\nN = len(testData)\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('predictions.csv', index=False, header=True)\n\nsubmission_top1.head()","metadata":{"ExecuteTime":{"end_time":"2024-10-19T09:52:32.469450Z","start_time":"2024-10-19T09:52:31.688280Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Трансформеры","metadata":{}},{"cell_type":"code","source":"import timm","metadata":{"ExecuteTime":{"end_time":"2024-10-20T10:41:01.428287Z","start_time":"2024-10-20T10:40:53.658013Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class AudioClassifier(nn.Module):\n    def __init__(self, num_classes):\n        super(AudioClassifier, self).__init__()\n        # Используем предобученную ViT модель\n        self.model = timm.create_model('vit_base_patch16_224', pretrained=True)\n        self.model.head = nn.Linear(self.model.head.in_features, num_classes)\n    \n    def forward(self, x):\n        return self.model(x)","metadata":{"ExecuteTime":{"end_time":"2024-10-20T10:42:56.051587Z","start_time":"2024-10-20T10:42:56.032977Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"num_classes = len(unique_labels)\nmodel = AudioClassifier(num_classes)","metadata":{"ExecuteTime":{"end_time":"2024-10-20T10:44:24.247677Z","start_time":"2024-10-20T10:43:05.556046Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\nmodel = model.to(device)\noptimizer = optim.Adam(model.parameters(), lr=1e-4)\ncriterion = nn.CrossEntropyLoss()\nnum_epochs = 1","metadata":{"ExecuteTime":{"end_time":"2024-10-20T10:44:26.376900Z","start_time":"2024-10-20T10:44:26.351071Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for epoch in range(num_epochs):\n    model.train()\n    running_loss = 0.0\n    for i, (inputs, labels) in enumerate(trainLoader):\n        inputs, labels = inputs.to(device), labels.to(device)\n\n        optimizer.zero_grad()\n\n        # Прямой проход\n        outputs = model(inputs)\n        loss = criterion(outputs, labels)\n\n        # Обратный проход и оптимизация\n        loss.backward()\n        optimizer.step()\n\n        running_loss += loss.item()\n\n    print(f'Epoch {epoch+1}/{num_epochs}, Loss: {running_loss/len(trainLoader)}')","metadata":{"jupyter":{"is_executing":true},"ExecuteTime":{"start_time":"2024-10-20T10:45:48.269892Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pip install transformers datasets torchaudio","metadata":{"ExecuteTime":{"end_time":"2024-10-19T10:13:43.205738Z","start_time":"2024-10-19T10:11:17.168093Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from transformers import Wav2Vec2ForSequenceClassification, Wav2Vec2Processor","metadata":{"ExecuteTime":{"end_time":"2024-10-19T10:25:34.533946Z","start_time":"2024-10-19T10:25:33.641089Z"}},"execution_count":null,"outputs":[]}]}