{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceType":"competition","sourceId":8900,"databundleVersionId":862232},{"sourceType":"modelInstanceVersion","sourceId":2645,"databundleVersionId":4910542,"modelInstanceId":1911}],"dockerImageVersionId":31193,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"Загрузка данных с Kaggle","metadata":{}},{"cell_type":"code","source":"import kagglehub\n\naudio_dataset_path = kagglehub.competition_download(\"freesound-audio-tagging\")\nefficientnet_weights_path = kagglehub.model_download(\n    \"tensorflow/efficientnet/TensorFlow2/b0-classification/1\"\n)\n\nprint(\"Источники успешно загружены.\")","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-11-07T15:51:56.338609Z","iopub.execute_input":"2025-11-07T15:51:56.338858Z","iopub.status.idle":"2025-11-07T15:54:01.716593Z","shell.execute_reply.started":"2025-11-07T15:51:56.338838Z","shell.execute_reply":"2025-11-07T15:54:01.715836Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Импорт необходимых библиотек","metadata":{}},{"cell_type":"code","source":"\n\nimport os\nimport cv2\nimport numpy as np\nimport pandas as pd\n\nimport librosa\nimport librosa.display\n\nfrom sklearn.model_selection import train_test_split\n\nimport torch\nfrom torch import nn\nfrom torch.utils.data import Dataset, DataLoader\nfrom torchvision import models","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-07T15:54:01.717976Z","iopub.execute_input":"2025-11-07T15:54:01.718223Z","iopub.status.idle":"2025-11-07T15:54:09.681556Z","shell.execute_reply.started":"2025-11-07T15:54:01.718199Z","shell.execute_reply":"2025-11-07T15:54:09.680981Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Настройка устройства","metadata":{}},{"cell_type":"code","source":"\n\ndevice = \"cuda:0\" if torch.cuda.is_available() else \"cpu\"\nprint(f\"Используемое устройство: {device}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-07T15:54:09.682138Z","iopub.execute_input":"2025-11-07T15:54:09.682442Z","iopub.status.idle":"2025-11-07T15:54:09.773002Z","shell.execute_reply.started":"2025-11-07T15:54:09.682425Z","shell.execute_reply":"2025-11-07T15:54:09.772198Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Чтение исходной информации","metadata":{}},{"cell_type":"code","source":"\n\nmeta = pd.read_csv(\"../input/freesound-audio-tagging/train.csv\")\n\n# Формируем словарь классов\nunique_tags = sorted(meta[\"label\"].unique())\ntag_to_id = {tag: idx for idx, tag in enumerate(unique_tags)}\nprint(f\"Количество классов: {len(unique_tags)}\")\n\n# Пути к данным\nTRAIN_AUDIO = \"../input/freesound-audio-tagging/audio_train/\"\nTEST_AUDIO = \"../input/freesound-audio-tagging/audio_test/\"","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-07T15:54:09.773874Z","iopub.execute_input":"2025-11-07T15:54:09.774100Z","iopub.status.idle":"2025-11-07T15:54:09.825453Z","shell.execute_reply.started":"2025-11-07T15:54:09.774084Z","shell.execute_reply":"2025-11-07T15:54:09.824759Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Пользовательский датасет","metadata":{}},{"cell_type":"code","source":"\n\nclass FSDataset(Dataset):\n    def __init__(self, df, is_test=False):\n        self.df = df\n        self.test = is_test\n\n    def __len__(self):\n        return len(self.df)\n\n    def __getitem__(self, idx):\n        row = self.df.iloc[idx]\n        filename = row[\"fname\"]\n        label = row[\"label\"]\n\n        filepath = (TEST_AUDIO if self.test else TRAIN_AUDIO) + filename\n\n        try:\n            wave, _ = librosa.load(filepath)\n            mel = librosa.feature.melspectrogram(y=wave)\n            mel = librosa.power_to_db(mel, ref=np.max)\n\n            img = cv2.resize(mel, (128, 128))\n        except Exception:\n            img = np.zeros((128, 128))\n\n        tensor = torch.tensor(np.repeat(img[None], 3, axis=0), dtype=torch.float32)\n\n        if self.test:\n            return tensor\n\n        return tensor, tag_to_id[label]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-07T15:54:09.827149Z","iopub.execute_input":"2025-11-07T15:54:09.827429Z","iopub.status.idle":"2025-11-07T15:54:09.833416Z","shell.execute_reply.started":"2025-11-07T15:54:09.827406Z","shell.execute_reply":"2025-11-07T15:54:09.832685Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Подготовка выборок","metadata":{}},{"cell_type":"code","source":"\n\nBATCH = 64\nEPOCHS = 10\n\ntrain_df, val_df = train_test_split(\n    meta, test_size=0.2, shuffle=True, random_state=5\n)\n\ntrain_data = FSDataset(train_df)\nval_data = FSDataset(val_df)\n\ntrain_loader = DataLoader(train_data, batch_size=BATCH, shuffle=True)\nval_loader   = DataLoader(val_data, batch_size=BATCH, shuffle=True)\n\nprint(f\"Тренировочных примеров: {len(train_df)}\")\nprint(f\"Валидационных примеров: {len(val_df)}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-07T15:54:09.834237Z","iopub.execute_input":"2025-11-07T15:54:09.834504Z","iopub.status.idle":"2025-11-07T15:54:09.853575Z","shell.execute_reply.started":"2025-11-07T15:54:09.834480Z","shell.execute_reply":"2025-11-07T15:54:09.852772Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Модель EfficientNet","metadata":{}},{"cell_type":"code","source":"\n\nmodel = models.efficientnet_b0(weights=models.EfficientNet_B0_Weights.DEFAULT)\nmodel.classifier[1] = nn.Linear(1280, len(unique_tags))\nmodel = model.to(device)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-07T15:54:09.854281Z","iopub.execute_input":"2025-11-07T15:54:09.854479Z","iopub.status.idle":"2025-11-07T15:54:10.478524Z","shell.execute_reply.started":"2025-11-07T15:54:09.854457Z","shell.execute_reply":"2025-11-07T15:54:10.477945Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Оптимизатор и функция потерь","metadata":{}},{"cell_type":"code","source":"\n\ncriterion = nn.CrossEntropyLoss()\noptimizer = torch.optim.AdamW(model.parameters(), lr=1e-3)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-07T15:54:10.479267Z","iopub.execute_input":"2025-11-07T15:54:10.479530Z","iopub.status.idle":"2025-11-07T15:54:10.484671Z","shell.execute_reply.started":"2025-11-07T15:54:10.479502Z","shell.execute_reply":"2025-11-07T15:54:10.484053Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Обучение модели","metadata":{}},{"cell_type":"code","source":"\n\nfor epoch in range(EPOCHS):\n    model.train()\n    total_train_loss = 0\n    total_train_correct = 0\n\n    for batch_x, batch_y in train_loader:\n        batch_x, batch_y = batch_x.to(device), batch_y.to(device)\n\n        optimizer.zero_grad()\n        logits = model(batch_x)\n        loss = criterion(logits, batch_y)\n\n        loss.backward()\n        optimizer.step()\n\n        total_train_loss += loss.item()\n        total_train_correct += (logits.argmax(1) == batch_y).sum().item()\n\n    # --- Оценка ---\n    model.eval()\n    total_val_loss = 0\n    total_val_correct = 0\n\n    with torch.no_grad():\n        for batch_x, batch_y in val_loader:\n            batch_x, batch_y = batch_x.to(device), batch_y.to(device)\n\n            logits = model(batch_x)\n            loss = criterion(logits, batch_y)\n\n            total_val_loss += loss.item()\n            total_val_correct += (logits.argmax(1) == batch_y).sum().item()\n\n    print(\n        f\"Epoch {epoch}: \"\n        f\"train_loss={total_train_loss/len(train_loader):.4f}, \"\n        f\"val_loss={total_val_loss/len(val_loader):.4f}, \"\n        f\"train_acc={total_train_correct/len(train_df):.4f}, \"\n        f\"val_acc={total_val_correct/len(val_df):.4f}\"\n    )","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-07T15:54:10.485408Z","iopub.execute_input":"2025-11-07T15:54:10.485634Z","iopub.status.idle":"2025-11-07T16:24:07.830532Z","shell.execute_reply.started":"2025-11-07T15:54:10.485618Z","shell.execute_reply":"2025-11-07T16:24:07.829854Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Предсказание для теста","metadata":{}},{"cell_type":"code","source":"\n\ntest_csv = pd.read_csv(\"../input/freesound-audio-tagging/sample_submission.csv\")\ntest_dataset = FSDataset(test_csv, is_test=True)\ntest_loader  = DataLoader(test_dataset, batch_size=BATCH, shuffle=False)\n\nmodel.eval()\nraw_preds = []\n\nwith torch.no_grad():\n    for batch in test_loader:\n        batch = batch.to(device)\n        out = model(batch)\n        raw_preds.append(out.cpu())\n\nraw_preds = torch.cat(raw_preds)\nprobs = torch.softmax(raw_preds, dim=1).numpy()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-07T16:24:07.831259Z","iopub.execute_input":"2025-11-07T16:24:07.831712Z","iopub.status.idle":"2025-11-07T16:29:28.181706Z","shell.execute_reply.started":"2025-11-07T16:24:07.831692Z","shell.execute_reply":"2025-11-07T16:29:28.180831Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Создание submission","metadata":{}},{"cell_type":"code","source":"\n\nsubmission = test_csv.copy()\n\nfor i in range(len(submission)):\n    pred_class = unique_tags[np.argmax(probs[i])]\n    submission.loc[i, \"label\"] = pred_class\n\nsubmission.to_csv(\"submission_final.csv\", index=False)\n\nsubmission.head()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-07T16:29:28.182501Z","iopub.execute_input":"2025-11-07T16:29:28.182744Z","iopub.status.idle":"2025-11-07T16:29:28.751663Z","shell.execute_reply.started":"2025-11-07T16:29:28.182718Z","shell.execute_reply":"2025-11-07T16:29:28.751084Z"}},"outputs":[],"execution_count":null}]}