diff --git a/week06/hw/spotter_Borisova.ipynb b/week06/hw/spotter_Borisova.ipynb new file mode 100644 index 0000000..1cb48c5 --- /dev/null +++ b/week06/hw/spotter_Borisova.ipynb @@ -0,0 +1,3082 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "DLqUa76aAHIg", + "outputId": "7596d41d-ad15-4f14-852f-0181c1a2aa7b" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading package lists... Done\n", + "Building dependency tree \n", + "Reading state information... Done\n", + "The following additional packages will be installed:\n", + " libmagic-mgc libmagic1 libopencore-amrnb0 libopencore-amrwb0 libsox-fmt-alsa\n", + " libsox-fmt-base libsox3\n", + "Suggested packages:\n", + " file libsox-fmt-all\n", + "The following NEW packages will be installed:\n", + " libmagic-mgc libmagic1 libopencore-amrnb0 libopencore-amrwb0 libsox-fmt-alsa\n", + " libsox-fmt-base libsox3 sox\n", + "0 upgraded, 8 newly installed, 0 to remove and 37 not upgraded.\n", + "Need to get 760 kB of archives.\n", + "After this operation, 6,717 kB of additional disk space will be used.\n", + "Get:1 http://archive.ubuntu.com/ubuntu bionic/universe amd64 libopencore-amrnb0 amd64 0.1.3-2.1 [92.0 kB]\n", + "Get:2 http://archive.ubuntu.com/ubuntu bionic/universe amd64 libopencore-amrwb0 amd64 0.1.3-2.1 [45.8 kB]\n", + "Get:3 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libmagic-mgc amd64 1:5.32-2ubuntu0.4 [184 kB]\n", + "Get:4 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libmagic1 amd64 1:5.32-2ubuntu0.4 [68.6 kB]\n", + "Get:5 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 libsox3 amd64 14.4.2-3ubuntu0.18.04.1 [226 kB]\n", + "Get:6 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 libsox-fmt-alsa amd64 14.4.2-3ubuntu0.18.04.1 [10.6 kB]\n", + "Get:7 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 libsox-fmt-base amd64 14.4.2-3ubuntu0.18.04.1 [32.1 kB]\n", + "Get:8 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 sox amd64 14.4.2-3ubuntu0.18.04.1 [101 kB]\n", + "Fetched 760 kB in 1s (727 kB/s)\n", + "Selecting previously unselected package libopencore-amrnb0:amd64.\n", + "(Reading database ... 155047 files and directories currently installed.)\n", + "Preparing to unpack .../0-libopencore-amrnb0_0.1.3-2.1_amd64.deb ...\n", + "Unpacking libopencore-amrnb0:amd64 (0.1.3-2.1) ...\n", + "Selecting previously unselected package libopencore-amrwb0:amd64.\n", + "Preparing to unpack .../1-libopencore-amrwb0_0.1.3-2.1_amd64.deb ...\n", + "Unpacking libopencore-amrwb0:amd64 (0.1.3-2.1) ...\n", + "Selecting previously unselected package libmagic-mgc.\n", + "Preparing to unpack .../2-libmagic-mgc_1%3a5.32-2ubuntu0.4_amd64.deb ...\n", + "Unpacking libmagic-mgc (1:5.32-2ubuntu0.4) ...\n", + "Selecting previously unselected package libmagic1:amd64.\n", + "Preparing to unpack .../3-libmagic1_1%3a5.32-2ubuntu0.4_amd64.deb ...\n", + "Unpacking libmagic1:amd64 (1:5.32-2ubuntu0.4) ...\n", + "Selecting previously unselected package libsox3:amd64.\n", + "Preparing to unpack .../4-libsox3_14.4.2-3ubuntu0.18.04.1_amd64.deb ...\n", + "Unpacking libsox3:amd64 (14.4.2-3ubuntu0.18.04.1) ...\n", + "Selecting previously unselected package libsox-fmt-alsa:amd64.\n", + "Preparing to unpack .../5-libsox-fmt-alsa_14.4.2-3ubuntu0.18.04.1_amd64.deb ...\n", + "Unpacking libsox-fmt-alsa:amd64 (14.4.2-3ubuntu0.18.04.1) ...\n", + "Selecting previously unselected package libsox-fmt-base:amd64.\n", + "Preparing to unpack .../6-libsox-fmt-base_14.4.2-3ubuntu0.18.04.1_amd64.deb ...\n", + "Unpacking libsox-fmt-base:amd64 (14.4.2-3ubuntu0.18.04.1) ...\n", + "Selecting previously unselected package sox.\n", + "Preparing to unpack .../7-sox_14.4.2-3ubuntu0.18.04.1_amd64.deb ...\n", + "Unpacking sox (14.4.2-3ubuntu0.18.04.1) ...\n", + "Setting up libmagic-mgc (1:5.32-2ubuntu0.4) ...\n", + "Setting up libmagic1:amd64 (1:5.32-2ubuntu0.4) ...\n", + "Setting up libopencore-amrnb0:amd64 (0.1.3-2.1) ...\n", + "Setting up libopencore-amrwb0:amd64 (0.1.3-2.1) ...\n", + "Setting up libsox3:amd64 (14.4.2-3ubuntu0.18.04.1) ...\n", + "Setting up libsox-fmt-base:amd64 (14.4.2-3ubuntu0.18.04.1) ...\n", + "Setting up libsox-fmt-alsa:amd64 (14.4.2-3ubuntu0.18.04.1) ...\n", + "Setting up sox (14.4.2-3ubuntu0.18.04.1) ...\n", + "Processing triggers for libc-bin (2.27-3ubuntu1.3) ...\n", + "/sbin/ldconfig.real: /usr/local/lib/python3.7/dist-packages/ideep4py/lib/libmkldnn.so.0 is not a symbolic link\n", + "\n", + "Processing triggers for man-db (2.8.3-2ubuntu0.1) ...\n", + "Processing triggers for mime-support (3.60ubuntu1) ...\n" + ] + } + ], + "source": [ + "!apt install sox" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "eX_UvnL9FOB2" + }, + "source": [ + "### Baseline commands recognition (2-5 points)\n", + "\n", + "We're now going to train a classifier to recognize voice. More specifically, we'll use the [Speech Commands Dataset] that contains around 30 different words with a few thousand voice records each." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "kgdP8SO2xeot" + }, + "outputs": [], + "source": [ + "import os\n", + "from IPython.display import display, Audio\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "import numpy as np\n", + "import pickle\n", + "import librosa\n", + "import torch\n", + "from torch.utils.data import TensorDataset, DataLoader\n", + "import torch.optim as optim\n", + "import torchvision.transforms as T\n", + "from scipy.io import wavfile\n", + "import IPython.display as ipd\n", + "\n", + "device = 'cuda'" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "FvHkw2rfY9k7", + "outputId": "75bbe48d-f8e8-485d-ab8e-7541feeebc72" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--2021-10-24 14:31:22-- http://download.tensorflow.org/data/speech_commands_v0.01.tar.gz\n", + "Resolving download.tensorflow.org (download.tensorflow.org)... 142.250.13.128, 2a00:1450:400c:c03::80\n", + "Connecting to download.tensorflow.org (download.tensorflow.org)|142.250.13.128|:80... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 1489096277 (1.4G) [application/gzip]\n", + "Saving to: ‘speech_commands_v0.01.tar.gz’\n", + "\n", + "speech_commands_v0. 100%[===================>] 1.39G 88.0MB/s in 18s \n", + "\n", + "2021-10-24 14:31:41 (76.8 MB/s) - ‘speech_commands_v0.01.tar.gz’ saved [1489096277/1489096277]\n", + "\n", + "Classes: bed, bird, cat, dog, down, eight, five, four, go, happy, house, left, marvin, nine, no, off, on, one, right, seven, sheila, six, stop, three, tree, two, up, wow, yes, zero\n" + ] + } + ], + "source": [ + "datadir = \"speech_commands\"\n", + "\n", + "!wget http://download.tensorflow.org/data/speech_commands_v0.01.tar.gz -O speech_commands_v0.01.tar.gz\n", + "# alternative url: https://www.dropbox.com/s/j95n278g48bcbta/speech_commands_v0.01.tar.gz?dl=1\n", + "!mkdir {datadir} && tar -C {datadir} -xvzf speech_commands_v0.01.tar.gz 1> log\n", + "\n", + "samples_by_target = {\n", + " cls: [os.path.join(datadir, cls, name) for name in os.listdir(\"./speech_commands/{}\".format(cls))]\n", + " for cls in os.listdir(datadir)\n", + " if os.path.isdir(os.path.join(datadir, cls))\n", + "}\n", + "print('Classes:', ', '.join(sorted(samples_by_target.keys())[1:]))" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ME4cVShQ916w", + "outputId": "7c3169dc-b7f1-4238-d550-374432f7bd78" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Input File : 'speech_commands/bed/00176480_nohash_0.wav'\n", + "Channels : 1\n", + "Sample Rate : 16000\n", + "Precision : 16-bit\n", + "Duration : 00:00:01.00 = 16000 samples ~ 75 CDDA sectors\n", + "File Size : 32.0k\n", + "Bit Rate : 256k\n", + "Sample Encoding: 16-bit Signed Integer PCM\n", + "\n" + ] + } + ], + "source": [ + "!sox --info speech_commands/bed/00176480_nohash_0.wav" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "JF87vTlRs5qv" + }, + "source": [ + "### Нарисуем спектрограмму для файлика с комнадой \"right\"" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "id": "zBb8LEcRs35y" + }, + "outputs": [], + "source": [ + "def show_spectrogram(wav_path):\n", + "\n", + " # Read the wav file (mono)\n", + " samplingFrequency, signalData = wavfile.read(wav_path)\n", + "\n", + " plt.subplot(211)\n", + " plt.title('Spectrogram of a wav file')\n", + "\n", + " plt.plot(signalData)\n", + " plt.xlabel('Sample')\n", + " plt.ylabel('Amplitude') \n", + "\n", + " plt.subplot(212)\n", + " plt.specgram(signalData,Fs=samplingFrequency)\n", + " plt.xlabel('Time')\n", + " plt.ylabel('Frequency')\n", + "\n", + " plt.show()\n", + " return ipd.Audio(wav_path)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 353 + }, + "id": "MTBuaYpktJVB", + "outputId": "b24bca1d-f3f8-418e-ab92-7e642351b510" + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "show_spectrogram('/content/speech_commands/right/00b01445_nohash_0.wav')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "L_LYOd_TtM6B" + }, + "source": [ + "### Подготовка данных" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "cvF5l-PCyd8z", + "outputId": "e118fd1a-8dca-4fdc-9320-bbf7b4657c06" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 11834/11834 [07:32<00:00, 26.13it/s]\n" + ] + } + ], + "source": [ + "from sklearn.model_selection import train_test_split\n", + "from itertools import chain\n", + "from tqdm import tqdm\n", + "import joblib as jl\n", + "\n", + "classes = (\"left\", \"right\", \"up\", \"down\", \"stop\")\n", + "\n", + "def preprocess_sample(filepath, max_length=150):\n", + " amplitudes, sr = librosa.core.load(filepath)\n", + " spectrogram = librosa.feature.melspectrogram(amplitudes, sr=sr)[:, :max_length]\n", + " spectrogram = np.pad(spectrogram, [[0, 0], [0, max(0, max_length - spectrogram.shape[1])]], mode='constant')\n", + " target = classes.index(filepath.split(os.sep)[-2])\n", + " return np.float32(spectrogram), np.int64(target)\n", + "\n", + "all_files = chain(*(samples_by_target[cls] for cls in classes))\n", + "spectrograms_and_targets = jl.Parallel(n_jobs=-1)(tqdm(list(map(jl.delayed(preprocess_sample), all_files))))\n", + "X, y = map(np.stack, zip(*spectrograms_and_targets))\n", + "X = X.transpose([0, 2, 1]) # to [batch, time, channels]\n", + "# X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5JSAwXkemEj4" + }, + "source": [ + "### Модель с 2d-свертками\n", + "* __Подготовка данных:__ поскольку модель на 2d-свертки, то нужно добавить количество каналов(1) в шейп тензора данных;\n", + "* __Подготовка выборки:__ разделим данные на трейн и тест и объявим даталоудеры\n", + "* __Batch size:__ Возьмем batch_size = 16" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "QHb3RCvSjxWt", + "outputId": "2a5fd7d1-eb7f-4566-be86-4bb7736eaccd" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(11834, 1, 150, 128)" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# X.shape\n", + "X_r = X[:,None,:,:]\n", + "X_r.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "id": "B0BhnljvkZWN" + }, + "outputs": [], + "source": [ + "X_train, X_test, y_train, y_test = train_test_split(X_r, y, random_state=42)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "id": "7Ol6sywTG_Y9" + }, + "outputs": [], + "source": [ + "batch_size = 16\n", + "\n", + "tensor_x = torch.Tensor(X_train)\n", + "tensor_y = torch.LongTensor(y_train)\n", + "\n", + "train_dataset = TensorDataset(tensor_x, tensor_y)\n", + "\n", + "tensor_x = torch.Tensor(X_test) # transform to torch tensor\n", + "tensor_y = torch.LongTensor(y_test)\n", + "\n", + "test_dataset = TensorDataset(tensor_x, tensor_y)\n", + "\n", + "\n", + "trainloader = DataLoader(train_dataset, batch_size=batch_size,\n", + " shuffle=True, num_workers=2)\n", + "testloader = DataLoader(test_dataset, batch_size=batch_size,\n", + " shuffle=False, num_workers=2)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Sye_tt_jplnm" + }, + "source": [ + "### Модель\n", + "__Примечание:__ Был выбран оптимизатор Adam, поскольку с использованием SGD лосс почти не менялся даже при подборе разного шага (learning rate)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "id": "-qr8t6wCF8vT" + }, + "outputs": [], + "source": [ + "import torch.nn as nn\n", + "import torch.nn.functional as F\n", + "\n", + "\n", + "class Net2d(nn.Module):\n", + " def __init__(self):\n", + " super().__init__()\n", + " # TODO: define your layers here\n", + " self.conv1 = nn.Conv2d(1, 16, 5)\n", + " self.bn1 = nn.BatchNorm2d(16)\n", + " self.pool1 = nn.MaxPool2d(2, 2)\n", + " # self.bn1 = nn.BatchNorm2D(16)\n", + "\n", + " self.conv2 = nn.Conv2d(16, 32, 5)\n", + " self.bn2 = nn.BatchNorm2d(32)\n", + " self.pool2 = nn.MaxPool2d(4, 2)\n", + "\n", + " self.conv3 = nn.Conv2d(32, 64, 5)\n", + " self.bn3 = nn.BatchNorm2d(64)\n", + " self.pool3 = nn.MaxPool2d(6, 2)\n", + "\n", + " self.conv4 = nn.Conv2d(64, 128, 5)\n", + " self.bn4 = nn.BatchNorm2d(128)\n", + " self.pool4 = nn.MaxPool2d(6, 2)\n", + "\n", + "\n", + " self.flatten = nn.Flatten()\n", + " self.dense1 = nn.Linear(256, 64)\n", + " self.relu1 = nn.ReLU()\n", + " self.dense2 = nn.Linear(64, 5)\n", + "\n", + " def forward(self, x):\n", + " # TODO: apply your layers here\n", + " x = self.conv1(x)\n", + " x = self.bn1(x)\n", + " x = self.pool1(x)\n", + " x = self.conv2(x)\n", + " x = self.bn2(x)\n", + " x = self.pool2(x)\n", + " x = self.conv3(x)\n", + " x = self.bn3(x)\n", + " x = self.pool3(x)\n", + " x = self.conv4(x)\n", + " x = self.bn4(x)\n", + " x = self.pool4(x)\n", + " x = self.flatten(x)\n", + " x = self.dense1(x)\n", + " x = self.relu1(x)\n", + " x = self.dense2(x)\n", + " return F.softmax(x)\n", + "\n", + "\n", + "net2d = Net2d().to(device)\n", + "criterion = nn.CrossEntropyLoss()\n", + "optimizer = optim.Adam(net2d.parameters(), lr=0.003)#, momentum=0.9)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "DC4IeBurqOYI" + }, + "source": [ + "### Объявим функцию обучения модели\n", + "__Параметры:__\n", + "* модель\n", + "* данные для обучения\n", + "* количество эпох\n", + "\n", + "Функция возвращает лосс" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "id": "xR1uxQ-GGGLr" + }, + "outputs": [], + "source": [ + "def model_train(model, trainloader, epochs):\n", + " total_step = len(trainloader)\n", + " losses, epoch_losses = [], []\n", + " for epoch in range(epochs): # loop over the dataset multiple times\n", + " model.train()\n", + " running_loss = 0.0\n", + " epoch_loss = 0.0\n", + " for i, data in enumerate(trainloader, 0):\n", + " # get the inputs; data is a list of [inputs, labels]\n", + " inputs, labels = data\n", + " inputs = inputs.to(device)\n", + " labels = labels.to(device)\n", + "\n", + " # zero the parameter gradients\n", + " optimizer.zero_grad()\n", + "\n", + " # forward + backward + optimize\n", + " outputs = model(inputs)\n", + " loss = criterion(outputs, labels)\n", + " loss.backward() \n", + " optimizer.step()\n", + "\n", + " # print statistics\n", + " running_loss += loss.item()\n", + " epoch_loss += loss.item()\n", + " if (i+1) % 50 == 0: # print every 50 mini-batches\n", + " print('Epoch [{}/{}], Step [{}/{}], loss: {:.3f}'\n", + " .format(epoch, epochs, i+1, total_step, running_loss / 50))\n", + " running_loss = 0.0\n", + " epoch_losses.append(epoch_loss)\n", + "\n", + "\n", + " print('Finished Training')\n", + " return epoch_losses" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "-JQb7aZjqvoR" + }, + "source": [ + "### Предсказания на тестовых данных\n", + "\n", + "Посмотрим accuracy (в том числе и для каждого класса)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "id": "0UNsDwelBZVg" + }, + "outputs": [], + "source": [ + "def model_predict(model, testloader):\n", + " correct_pred = {classname: 0 for classname in classes}\n", + " total_pred = {classname: 0 for classname in classes}\n", + " correct = 0\n", + " total = 0\n", + "\n", + " # again no gradients needed\n", + " with torch.no_grad():\n", + " for data in testloader:\n", + " inputs, labels = data\n", + " inputs = inputs.to(device)\n", + " labels = labels.to(device)\n", + " outputs = model(inputs)\n", + " _, predictions = torch.max(outputs, 1)\n", + " total += labels.size(0)\n", + " correct += (predictions == labels).sum().item()\n", + " # collect the correct predictions for each class\n", + " for label, prediction in zip(labels, predictions):\n", + " if label == prediction:\n", + " correct_pred[classes[label]] += 1\n", + " total_pred[classes[label]] += 1\n", + "\n", + "\n", + " # print accuracy for each class\n", + " for classname, correct_count in correct_pred.items():\n", + " accuracy = 100 * float(correct_count) / total_pred[classname]\n", + " print(\"Accuracy for class {:5s} is: {:.1f} %\".format(classname,\n", + " accuracy))\n", + " print('Total accuracy: %d %%' % (\n", + " 100 * correct / total))\n", + " return" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "f4HNvZYNsTja", + "outputId": "42ac77bf-7cfb-4c7d-e86b-2a0cd9b983e5" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:50: UserWarning: Implicit dimension choice for softmax has been deprecated. Change the call to include dim=X as an argument.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch [0/20], Step [50/555], loss: 1.587\n", + "Epoch [0/20], Step [100/555], loss: 1.569\n", + "Epoch [0/20], Step [150/555], loss: 1.542\n", + "Epoch [0/20], Step [200/555], loss: 1.531\n", + "Epoch [0/20], Step [250/555], loss: 1.476\n", + "Epoch [0/20], Step [300/555], loss: 1.477\n", + "Epoch [0/20], Step [350/555], loss: 1.416\n", + "Epoch [0/20], Step [400/555], loss: 1.452\n", + "Epoch [0/20], Step [450/555], loss: 1.436\n", + "Epoch [0/20], Step [500/555], loss: 1.388\n", + "Epoch [0/20], Step [550/555], loss: 1.427\n", + "Epoch [1/20], Step [50/555], loss: 1.402\n", + "Epoch [1/20], Step [100/555], loss: 1.330\n", + "Epoch [1/20], Step [150/555], loss: 1.382\n", + "Epoch [1/20], Step [200/555], loss: 1.354\n", + "Epoch [1/20], Step [250/555], loss: 1.320\n", + "Epoch [1/20], Step [300/555], loss: 1.367\n", + "Epoch [1/20], Step [350/555], loss: 1.314\n", + "Epoch [1/20], Step [400/555], loss: 1.338\n", + "Epoch [1/20], Step [450/555], loss: 1.357\n", + "Epoch [1/20], Step [500/555], loss: 1.334\n", + "Epoch [1/20], Step [550/555], loss: 1.307\n", + "Epoch [2/20], Step [50/555], loss: 1.384\n", + "Epoch [2/20], Step [100/555], loss: 1.274\n", + "Epoch [2/20], Step [150/555], loss: 1.305\n", + "Epoch [2/20], Step [200/555], loss: 1.275\n", + "Epoch [2/20], Step [250/555], loss: 1.305\n", + "Epoch [2/20], Step [300/555], loss: 1.317\n", + "Epoch [2/20], Step [350/555], loss: 1.363\n", + "Epoch [2/20], Step [400/555], loss: 1.246\n", + "Epoch [2/20], Step [450/555], loss: 1.299\n", + "Epoch [2/20], Step [500/555], loss: 1.292\n", + "Epoch [2/20], Step [550/555], loss: 1.275\n", + "Epoch [3/20], Step [50/555], loss: 1.252\n", + "Epoch [3/20], Step [100/555], loss: 1.245\n", + "Epoch [3/20], Step [150/555], loss: 1.236\n", + "Epoch [3/20], Step [200/555], loss: 1.291\n", + "Epoch [3/20], Step [250/555], loss: 1.222\n", + "Epoch [3/20], Step [300/555], loss: 1.269\n", + "Epoch [3/20], Step [350/555], loss: 1.321\n", + "Epoch [3/20], Step [400/555], loss: 1.255\n", + "Epoch [3/20], Step [450/555], loss: 1.235\n", + "Epoch [3/20], Step [500/555], loss: 1.312\n", + "Epoch [3/20], Step [550/555], loss: 1.276\n", + "Epoch [4/20], Step [50/555], loss: 1.247\n", + "Epoch [4/20], Step [100/555], loss: 1.259\n", + "Epoch [4/20], Step [150/555], loss: 1.289\n", + "Epoch [4/20], Step [200/555], loss: 1.221\n", + "Epoch [4/20], Step [250/555], loss: 1.244\n", + "Epoch [4/20], Step [300/555], loss: 1.253\n", + "Epoch [4/20], Step [350/555], loss: 1.234\n", + "Epoch [4/20], Step [400/555], loss: 1.224\n", + "Epoch [4/20], Step [450/555], loss: 1.180\n", + "Epoch [4/20], Step [500/555], loss: 1.260\n", + "Epoch [4/20], Step [550/555], loss: 1.280\n", + "Epoch [5/20], Step [50/555], loss: 1.224\n", + "Epoch [5/20], Step [100/555], loss: 1.200\n", + "Epoch [5/20], Step [150/555], loss: 1.330\n", + "Epoch [5/20], Step [200/555], loss: 1.241\n", + "Epoch [5/20], Step [250/555], loss: 1.242\n", + "Epoch [5/20], Step [300/555], loss: 1.217\n", + "Epoch [5/20], Step [350/555], loss: 1.174\n", + "Epoch [5/20], Step [400/555], loss: 1.194\n", + "Epoch [5/20], Step [450/555], loss: 1.201\n", + "Epoch [5/20], Step [500/555], loss: 1.215\n", + "Epoch [5/20], Step [550/555], loss: 1.202\n", + "Epoch [6/20], Step [50/555], loss: 1.218\n", + "Epoch [6/20], Step [100/555], loss: 1.236\n", + "Epoch [6/20], Step [150/555], loss: 1.277\n", + "Epoch [6/20], Step [200/555], loss: 1.266\n", + "Epoch [6/20], Step [250/555], loss: 1.209\n", + "Epoch [6/20], Step [300/555], loss: 1.211\n", + "Epoch [6/20], Step [350/555], loss: 1.199\n", + "Epoch [6/20], Step [400/555], loss: 1.157\n", + "Epoch [6/20], Step [450/555], loss: 1.186\n", + "Epoch [6/20], Step [500/555], loss: 1.247\n", + "Epoch [6/20], Step [550/555], loss: 1.205\n", + "Epoch [7/20], Step [50/555], loss: 1.209\n", + "Epoch [7/20], Step [100/555], loss: 1.252\n", + "Epoch [7/20], Step [150/555], loss: 1.260\n", + "Epoch [7/20], Step [200/555], loss: 1.248\n", + "Epoch [7/20], Step [250/555], loss: 1.246\n", + "Epoch [7/20], Step [300/555], loss: 1.172\n", + "Epoch [7/20], Step [350/555], loss: 1.177\n", + "Epoch [7/20], Step [400/555], loss: 1.190\n", + "Epoch [7/20], Step [450/555], loss: 1.146\n", + "Epoch [7/20], Step [500/555], loss: 1.136\n", + "Epoch [7/20], Step [550/555], loss: 1.145\n", + "Epoch [8/20], Step [50/555], loss: 1.177\n", + "Epoch [8/20], Step [100/555], loss: 1.236\n", + "Epoch [8/20], Step [150/555], loss: 1.144\n", + "Epoch [8/20], Step [200/555], loss: 1.287\n", + "Epoch [8/20], Step [250/555], loss: 1.285\n", + "Epoch [8/20], Step [300/555], loss: 1.231\n", + "Epoch [8/20], Step [350/555], loss: 1.252\n", + "Epoch [8/20], Step [400/555], loss: 1.203\n", + "Epoch [8/20], Step [450/555], loss: 1.171\n", + "Epoch [8/20], Step [500/555], loss: 1.201\n", + "Epoch [8/20], Step [550/555], loss: 1.141\n", + "Epoch [9/20], Step [50/555], loss: 1.151\n", + "Epoch [9/20], Step [100/555], loss: 1.176\n", + "Epoch [9/20], Step [150/555], loss: 1.215\n", + "Epoch [9/20], Step [200/555], loss: 1.236\n", + "Epoch [9/20], Step [250/555], loss: 1.227\n", + "Epoch [9/20], Step [300/555], loss: 1.189\n", + "Epoch [9/20], Step [350/555], loss: 1.184\n", + "Epoch [9/20], Step [400/555], loss: 1.175\n", + "Epoch [9/20], Step [450/555], loss: 1.206\n", + "Epoch [9/20], Step [500/555], loss: 1.208\n", + "Epoch [9/20], Step [550/555], loss: 1.200\n", + "Epoch [10/20], Step [50/555], loss: 1.180\n", + "Epoch [10/20], Step [100/555], loss: 1.205\n", + "Epoch [10/20], Step [150/555], loss: 1.261\n", + "Epoch [10/20], Step [200/555], loss: 1.193\n", + "Epoch [10/20], Step [250/555], loss: 1.176\n", + "Epoch [10/20], Step [300/555], loss: 1.160\n", + "Epoch [10/20], Step [350/555], loss: 1.133\n", + "Epoch [10/20], Step [400/555], loss: 1.148\n", + "Epoch [10/20], Step [450/555], loss: 1.171\n", + "Epoch [10/20], Step [500/555], loss: 1.191\n", + "Epoch [10/20], Step [550/555], loss: 1.213\n", + "Epoch [11/20], Step [50/555], loss: 1.135\n", + "Epoch [11/20], Step [100/555], loss: 1.170\n", + "Epoch [11/20], Step [150/555], loss: 1.147\n", + "Epoch [11/20], Step [200/555], loss: 1.174\n", + "Epoch [11/20], Step [250/555], loss: 1.195\n", + "Epoch [11/20], Step [300/555], loss: 1.171\n", + "Epoch [11/20], Step [350/555], loss: 1.185\n", + "Epoch [11/20], Step [400/555], loss: 1.167\n", + "Epoch [11/20], Step [450/555], loss: 1.196\n", + "Epoch [11/20], Step [500/555], loss: 1.154\n", + "Epoch [11/20], Step [550/555], loss: 1.293\n", + "Epoch [12/20], Step [50/555], loss: 1.220\n", + "Epoch [12/20], Step [100/555], loss: 1.256\n", + "Epoch [12/20], Step [150/555], loss: 1.226\n", + "Epoch [12/20], Step [200/555], loss: 1.179\n", + "Epoch [12/20], Step [250/555], loss: 1.181\n", + "Epoch [12/20], Step [300/555], loss: 1.192\n", + "Epoch [12/20], Step [350/555], loss: 1.299\n", + "Epoch [12/20], Step [400/555], loss: 1.270\n", + "Epoch [12/20], Step [450/555], loss: 1.169\n", + "Epoch [12/20], Step [500/555], loss: 1.169\n", + "Epoch [12/20], Step [550/555], loss: 1.172\n", + "Epoch [13/20], Step [50/555], loss: 1.149\n", + "Epoch [13/20], Step [100/555], loss: 1.159\n", + "Epoch [13/20], Step [150/555], loss: 1.249\n", + "Epoch [13/20], Step [200/555], loss: 1.204\n", + "Epoch [13/20], Step [250/555], loss: 1.160\n", + "Epoch [13/20], Step [300/555], loss: 1.212\n", + "Epoch [13/20], Step [350/555], loss: 1.192\n", + "Epoch [13/20], Step [400/555], loss: 1.150\n", + "Epoch [13/20], Step [450/555], loss: 1.142\n", + "Epoch [13/20], Step [500/555], loss: 1.138\n", + "Epoch [13/20], Step [550/555], loss: 1.136\n", + "Epoch [14/20], Step [50/555], loss: 1.209\n", + "Epoch [14/20], Step [100/555], loss: 1.191\n", + "Epoch [14/20], Step [150/555], loss: 1.173\n", + "Epoch [14/20], Step [200/555], loss: 1.215\n", + "Epoch [14/20], Step [250/555], loss: 1.229\n", + "Epoch [14/20], Step [300/555], loss: 1.232\n", + "Epoch [14/20], Step [350/555], loss: 1.166\n", + "Epoch [14/20], Step [400/555], loss: 1.185\n", + "Epoch [14/20], Step [450/555], loss: 1.173\n", + "Epoch [14/20], Step [500/555], loss: 1.171\n", + "Epoch [14/20], Step [550/555], loss: 1.157\n", + "Epoch [15/20], Step [50/555], loss: 1.180\n", + "Epoch [15/20], Step [100/555], loss: 1.155\n", + "Epoch [15/20], Step [150/555], loss: 1.151\n", + "Epoch [15/20], Step [200/555], loss: 1.165\n", + "Epoch [15/20], Step [250/555], loss: 1.142\n", + "Epoch [15/20], Step [300/555], loss: 1.179\n", + "Epoch [15/20], Step [350/555], loss: 1.194\n", + "Epoch [15/20], Step [400/555], loss: 1.234\n", + "Epoch [15/20], Step [450/555], loss: 1.190\n", + "Epoch [15/20], Step [500/555], loss: 1.160\n", + "Epoch [15/20], Step [550/555], loss: 1.253\n", + "Epoch [16/20], Step [50/555], loss: 1.209\n", + "Epoch [16/20], Step [100/555], loss: 1.144\n", + "Epoch [16/20], Step [150/555], loss: 1.189\n", + "Epoch [16/20], Step [200/555], loss: 1.164\n", + "Epoch [16/20], Step [250/555], loss: 1.264\n", + "Epoch [16/20], Step [300/555], loss: 1.267\n", + "Epoch [16/20], Step [350/555], loss: 1.234\n", + "Epoch [16/20], Step [400/555], loss: 1.186\n", + "Epoch [16/20], Step [450/555], loss: 1.252\n", + "Epoch [16/20], Step [500/555], loss: 1.175\n", + "Epoch [16/20], Step [550/555], loss: 1.138\n", + "Epoch [17/20], Step [50/555], loss: 1.176\n", + "Epoch [17/20], Step [100/555], loss: 1.134\n", + "Epoch [17/20], Step [150/555], loss: 1.142\n", + "Epoch [17/20], Step [200/555], loss: 1.157\n", + "Epoch [17/20], Step [250/555], loss: 1.272\n", + "Epoch [17/20], Step [300/555], loss: 1.156\n", + "Epoch [17/20], Step [350/555], loss: 1.192\n", + "Epoch [17/20], Step [400/555], loss: 1.216\n", + "Epoch [17/20], Step [450/555], loss: 1.191\n", + "Epoch [17/20], Step [500/555], loss: 1.175\n", + "Epoch [17/20], Step [550/555], loss: 1.174\n", + "Epoch [18/20], Step [50/555], loss: 1.173\n", + "Epoch [18/20], Step [100/555], loss: 1.195\n", + "Epoch [18/20], Step [150/555], loss: 1.188\n", + "Epoch [18/20], Step [200/555], loss: 1.137\n", + "Epoch [18/20], Step [250/555], loss: 1.149\n", + "Epoch [18/20], Step [300/555], loss: 1.136\n", + "Epoch [18/20], Step [350/555], loss: 1.192\n", + "Epoch [18/20], Step [400/555], loss: 1.232\n", + "Epoch [18/20], Step [450/555], loss: 1.170\n", + "Epoch [18/20], Step [500/555], loss: 1.220\n", + "Epoch [18/20], Step [550/555], loss: 1.251\n", + "Epoch [19/20], Step [50/555], loss: 1.144\n", + "Epoch [19/20], Step [100/555], loss: 1.158\n", + "Epoch [19/20], Step [150/555], loss: 1.194\n", + "Epoch [19/20], Step [200/555], loss: 1.158\n", + "Epoch [19/20], Step [250/555], loss: 1.122\n", + "Epoch [19/20], Step [300/555], loss: 1.155\n", + "Epoch [19/20], Step [350/555], loss: 1.192\n", + "Epoch [19/20], Step [400/555], loss: 1.171\n", + "Epoch [19/20], Step [450/555], loss: 1.218\n", + "Epoch [19/20], Step [500/555], loss: 1.137\n", + "Epoch [19/20], Step [550/555], loss: 1.139\n", + "Finished Training\n" + ] + } + ], + "source": [ + "epoch_losses = model_train(net2d, trainloader, 20)" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 295 + }, + "id": "r3EZ6aklsYlQ", + "outputId": "0973cdf7-5c34-41b0-b6a7-f4b00e735e51" + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(epoch_losses, '-')\n", + "plt.xlabel('epoch')\n", + "plt.ylabel('loss')\n", + "plt.grid()\n", + "plt.title('Losses')" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "IwYQrrHtsd1r", + "outputId": "48667873-983f-4bf6-c218-18a6dff0555d" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:50: UserWarning: Implicit dimension choice for softmax has been deprecated. Change the call to include dim=X as an argument.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Accuracy for class left is: 78.9 %\n", + "Accuracy for class right is: 81.7 %\n", + "Accuracy for class up is: 78.6 %\n", + "Accuracy for class down is: 83.0 %\n", + "Accuracy for class stop is: 75.0 %\n", + "Total accuracy: 79 %\n" + ] + } + ], + "source": [ + "model_predict(net2d, testloader)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ZPd6LzrRl6oq" + }, + "source": [ + "## Построим модель на 1d-свертках" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "id": "a4P9kwAvlBt0" + }, + "outputs": [], + "source": [ + "X_train1d, X_test1d, y_train1d, y_test1d = train_test_split(X, y, random_state=42)" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "id": "lZaLeSM7HgbY" + }, + "outputs": [], + "source": [ + "batch_size = 16\n", + "\n", + "tensor_x1d = torch.Tensor(X_train1d)\n", + "tensor_y1d = torch.LongTensor(y_train1d)\n", + "\n", + "train_dataset1d = TensorDataset(tensor_x1d, tensor_y1d)\n", + "\n", + "tensor_x1d = torch.Tensor(X_test1d) # transform to torch tensor\n", + "tensor_y1d = torch.LongTensor(y_test1d)\n", + "\n", + "test_dataset1d = TensorDataset(tensor_x1d, tensor_y1d)\n", + "\n", + "\n", + "trainloader1d = DataLoader(train_dataset1d, batch_size=batch_size,\n", + " shuffle=True, num_workers=2)\n", + "testloader1d = DataLoader(test_dataset1d, batch_size=batch_size,\n", + " shuffle=False, num_workers=2)" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "iTmyelaQHstB", + "outputId": "c8e918ce-c56e-48a5-c10e-ecc4c4cef5f9" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(8875, 150, 128)" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train1d.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "id": "GJkhP4KZHOsX" + }, + "outputs": [], + "source": [ + "import torch.nn as nn\n", + "import torch.nn.functional as F\n", + "\n", + "\n", + "class Net1d(nn.Module):\n", + " def __init__(self):\n", + " super().__init__()\n", + " # TODO: define your layers here\n", + " self.conv1 = nn.Conv1d(150, 16, 5)\n", + " self.bn1 = nn.BatchNorm1d(16)\n", + " self.pool1 = nn.MaxPool1d(2, 2)\n", + " # self.bn1 = nn.BatchNorm2D(16)\n", + "\n", + " self.conv2 = nn.Conv1d(16, 32, 5)\n", + " self.bn2 = nn.BatchNorm1d(32)\n", + " self.pool2 = nn.MaxPool1d(4, 2)\n", + "\n", + " self.conv3 = nn.Conv1d(32, 64, 5)\n", + " self.bn3 = nn.BatchNorm1d(64)\n", + " self.pool3 = nn.MaxPool1d(6, 2)\n", + "\n", + " self.conv4 = nn.Conv1d(64, 128, 5)\n", + " self.bn4 = nn.BatchNorm1d(128)\n", + " self.pool4 = nn.MaxPool1d(6, 2)\n", + "\n", + "\n", + " self.flatten = nn.Flatten()\n", + " self.dense1 = nn.Linear(128, 64)\n", + " self.relu1 = nn.ReLU()\n", + " self.dense2 = nn.Linear(64, 5)\n", + " # self.relu2 = nn.ReLU()\n", + " # self.dense3 = nn.Linear(32, 5)\n", + "\n", + " def forward(self, x):\n", + " # TODO: apply your layers here\n", + " x = self.conv1(x)\n", + " x = self.bn1(x)\n", + " x = self.pool1(x)\n", + " x = self.conv2(x)\n", + " x = self.bn2(x)\n", + " x = self.pool2(x)\n", + " x = self.conv3(x)\n", + " x = self.bn3(x)\n", + " x = self.pool3(x)\n", + " x = self.conv4(x)\n", + " x = self.bn4(x)\n", + " x = self.pool4(x)\n", + " x = self.flatten(x)\n", + " x = self.dense1(x)\n", + " x = self.relu1(x)\n", + " x = self.dense2(x)\n", + " # x = self.relu2(x)\n", + " # x = self.dense3(x)\n", + " return F.softmax(x)\n", + "\n", + "\n", + "net1d = Net1d().to(device)\n", + "criterion = nn.CrossEntropyLoss()\n", + "optimizer = optim.Adam(net1d.parameters(), lr=0.003)#, momentum=0.9)" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "bzn4MZKnEhGF", + "outputId": "7d32e17d-0295-49cb-92f4-2ff0efc7ce3c" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:54: UserWarning: Implicit dimension choice for softmax has been deprecated. Change the call to include dim=X as an argument.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch [0/20], Step [50/555], loss: 1.610\n", + "Epoch [0/20], Step [100/555], loss: 1.599\n", + "Epoch [0/20], Step [150/555], loss: 1.602\n", + "Epoch [0/20], Step [200/555], loss: 1.596\n", + "Epoch [0/20], Step [250/555], loss: 1.573\n", + "Epoch [0/20], Step [300/555], loss: 1.576\n", + "Epoch [0/20], Step [350/555], loss: 1.549\n", + "Epoch [0/20], Step [400/555], loss: 1.539\n", + "Epoch [0/20], Step [450/555], loss: 1.554\n", + "Epoch [0/20], Step [500/555], loss: 1.536\n", + "Epoch [0/20], Step [550/555], loss: 1.542\n", + "Epoch [1/20], Step [50/555], loss: 1.535\n", + "Epoch [1/20], Step [100/555], loss: 1.528\n", + "Epoch [1/20], Step [150/555], loss: 1.539\n", + "Epoch [1/20], Step [200/555], loss: 1.500\n", + "Epoch [1/20], Step [250/555], loss: 1.541\n", + "Epoch [1/20], Step [300/555], loss: 1.514\n", + "Epoch [1/20], Step [350/555], loss: 1.530\n", + "Epoch [1/20], Step [400/555], loss: 1.500\n", + "Epoch [1/20], Step [450/555], loss: 1.522\n", + "Epoch [1/20], Step [500/555], loss: 1.502\n", + "Epoch [1/20], Step [550/555], loss: 1.512\n", + "Epoch [2/20], Step [50/555], loss: 1.499\n", + "Epoch [2/20], Step [100/555], loss: 1.529\n", + "Epoch [2/20], Step [150/555], loss: 1.509\n", + "Epoch [2/20], Step [200/555], loss: 1.531\n", + "Epoch [2/20], Step [250/555], loss: 1.519\n", + "Epoch [2/20], Step [300/555], loss: 1.520\n", + "Epoch [2/20], Step [350/555], loss: 1.494\n", + "Epoch [2/20], Step [400/555], loss: 1.501\n", + "Epoch [2/20], Step [450/555], loss: 1.503\n", + "Epoch [2/20], Step [500/555], loss: 1.513\n", + "Epoch [2/20], Step [550/555], loss: 1.473\n", + "Epoch [3/20], Step [50/555], loss: 1.496\n", + "Epoch [3/20], Step [100/555], loss: 1.504\n", + "Epoch [3/20], Step [150/555], loss: 1.479\n", + "Epoch [3/20], Step [200/555], loss: 1.491\n", + "Epoch [3/20], Step [250/555], loss: 1.451\n", + "Epoch [3/20], Step [300/555], loss: 1.481\n", + "Epoch [3/20], Step [350/555], loss: 1.469\n", + "Epoch [3/20], Step [400/555], loss: 1.503\n", + "Epoch [3/20], Step [450/555], loss: 1.494\n", + "Epoch [3/20], Step [500/555], loss: 1.479\n", + "Epoch [3/20], Step [550/555], loss: 1.464\n", + "Epoch [4/20], Step [50/555], loss: 1.475\n", + "Epoch [4/20], Step [100/555], loss: 1.458\n", + "Epoch [4/20], Step [150/555], loss: 1.466\n", + "Epoch [4/20], Step [200/555], loss: 1.476\n", + "Epoch [4/20], Step [250/555], loss: 1.454\n", + "Epoch [4/20], Step [300/555], loss: 1.448\n", + "Epoch [4/20], Step [350/555], loss: 1.446\n", + "Epoch [4/20], Step [400/555], loss: 1.482\n", + "Epoch [4/20], Step [450/555], loss: 1.466\n", + "Epoch [4/20], Step [500/555], loss: 1.454\n", + "Epoch [4/20], Step [550/555], loss: 1.445\n", + "Epoch [5/20], Step [50/555], loss: 1.424\n", + "Epoch [5/20], Step [100/555], loss: 1.450\n", + "Epoch [5/20], Step [150/555], loss: 1.464\n", + "Epoch [5/20], Step [200/555], loss: 1.468\n", + "Epoch [5/20], Step [250/555], loss: 1.489\n", + "Epoch [5/20], Step [300/555], loss: 1.471\n", + "Epoch [5/20], Step [350/555], loss: 1.440\n", + "Epoch [5/20], Step [400/555], loss: 1.462\n", + "Epoch [5/20], Step [450/555], loss: 1.466\n", + "Epoch [5/20], Step [500/555], loss: 1.440\n", + "Epoch [5/20], Step [550/555], loss: 1.455\n", + "Epoch [6/20], Step [50/555], loss: 1.434\n", + "Epoch [6/20], Step [100/555], loss: 1.437\n", + "Epoch [6/20], Step [150/555], loss: 1.435\n", + "Epoch [6/20], Step [200/555], loss: 1.440\n", + "Epoch [6/20], Step [250/555], loss: 1.406\n", + "Epoch [6/20], Step [300/555], loss: 1.482\n", + "Epoch [6/20], Step [350/555], loss: 1.429\n", + "Epoch [6/20], Step [400/555], loss: 1.441\n", + "Epoch [6/20], Step [450/555], loss: 1.407\n", + "Epoch [6/20], Step [500/555], loss: 1.426\n", + "Epoch [6/20], Step [550/555], loss: 1.421\n", + "Epoch [7/20], Step [50/555], loss: 1.461\n", + "Epoch [7/20], Step [100/555], loss: 1.403\n", + "Epoch [7/20], Step [150/555], loss: 1.418\n", + "Epoch [7/20], Step [200/555], loss: 1.440\n", + "Epoch [7/20], Step [250/555], loss: 1.410\n", + "Epoch [7/20], Step [300/555], loss: 1.400\n", + "Epoch [7/20], Step [350/555], loss: 1.432\n", + "Epoch [7/20], Step [400/555], loss: 1.472\n", + "Epoch [7/20], Step [450/555], loss: 1.432\n", + "Epoch [7/20], Step [500/555], loss: 1.435\n", + "Epoch [7/20], Step [550/555], loss: 1.445\n", + "Epoch [8/20], Step [50/555], loss: 1.434\n", + "Epoch [8/20], Step [100/555], loss: 1.433\n", + "Epoch [8/20], Step [150/555], loss: 1.425\n", + "Epoch [8/20], Step [200/555], loss: 1.435\n", + "Epoch [8/20], Step [250/555], loss: 1.410\n", + "Epoch [8/20], Step [300/555], loss: 1.437\n", + "Epoch [8/20], Step [350/555], loss: 1.405\n", + "Epoch [8/20], Step [400/555], loss: 1.385\n", + "Epoch [8/20], Step [450/555], loss: 1.419\n", + "Epoch [8/20], Step [500/555], loss: 1.436\n", + "Epoch [8/20], Step [550/555], loss: 1.428\n", + "Epoch [9/20], Step [50/555], loss: 1.393\n", + "Epoch [9/20], Step [100/555], loss: 1.422\n", + "Epoch [9/20], Step [150/555], loss: 1.421\n", + "Epoch [9/20], Step [200/555], loss: 1.428\n", + "Epoch [9/20], Step [250/555], loss: 1.405\n", + "Epoch [9/20], Step [300/555], loss: 1.426\n", + "Epoch [9/20], Step [350/555], loss: 1.381\n", + "Epoch [9/20], Step [400/555], loss: 1.411\n", + "Epoch [9/20], Step [450/555], loss: 1.416\n", + "Epoch [9/20], Step [500/555], loss: 1.462\n", + "Epoch [9/20], Step [550/555], loss: 1.394\n", + "Epoch [10/20], Step [50/555], loss: 1.395\n", + "Epoch [10/20], Step [100/555], loss: 1.389\n", + "Epoch [10/20], Step [150/555], loss: 1.407\n", + "Epoch [10/20], Step [200/555], loss: 1.421\n", + "Epoch [10/20], Step [250/555], loss: 1.405\n", + "Epoch [10/20], Step [300/555], loss: 1.395\n", + "Epoch [10/20], Step [350/555], loss: 1.400\n", + "Epoch [10/20], Step [400/555], loss: 1.403\n", + "Epoch [10/20], Step [450/555], loss: 1.371\n", + "Epoch [10/20], Step [500/555], loss: 1.400\n", + "Epoch [10/20], Step [550/555], loss: 1.427\n", + "Epoch [11/20], Step [50/555], loss: 1.413\n", + "Epoch [11/20], Step [100/555], loss: 1.377\n", + "Epoch [11/20], Step [150/555], loss: 1.406\n", + "Epoch [11/20], Step [200/555], loss: 1.418\n", + "Epoch [11/20], Step [250/555], loss: 1.419\n", + "Epoch [11/20], Step [300/555], loss: 1.394\n", + "Epoch [11/20], Step [350/555], loss: 1.417\n", + "Epoch [11/20], Step [400/555], loss: 1.368\n", + "Epoch [11/20], Step [450/555], loss: 1.406\n", + "Epoch [11/20], Step [500/555], loss: 1.406\n", + "Epoch [11/20], Step [550/555], loss: 1.399\n", + "Epoch [12/20], Step [50/555], loss: 1.380\n", + "Epoch [12/20], Step [100/555], loss: 1.397\n", + "Epoch [12/20], Step [150/555], loss: 1.448\n", + "Epoch [12/20], Step [200/555], loss: 1.391\n", + "Epoch [12/20], Step [250/555], loss: 1.399\n", + "Epoch [12/20], Step [300/555], loss: 1.450\n", + "Epoch [12/20], Step [350/555], loss: 1.390\n", + "Epoch [12/20], Step [400/555], loss: 1.397\n", + "Epoch [12/20], Step [450/555], loss: 1.392\n", + "Epoch [12/20], Step [500/555], loss: 1.408\n", + "Epoch [12/20], Step [550/555], loss: 1.382\n", + "Epoch [13/20], Step [50/555], loss: 1.401\n", + "Epoch [13/20], Step [100/555], loss: 1.397\n", + "Epoch [13/20], Step [150/555], loss: 1.393\n", + "Epoch [13/20], Step [200/555], loss: 1.383\n", + "Epoch [13/20], Step [250/555], loss: 1.387\n", + "Epoch [13/20], Step [300/555], loss: 1.403\n", + "Epoch [13/20], Step [350/555], loss: 1.361\n", + "Epoch [13/20], Step [400/555], loss: 1.367\n", + "Epoch [13/20], Step [450/555], loss: 1.370\n", + "Epoch [13/20], Step [500/555], loss: 1.402\n", + "Epoch [13/20], Step [550/555], loss: 1.401\n", + "Epoch [14/20], Step [50/555], loss: 1.374\n", + "Epoch [14/20], Step [100/555], loss: 1.373\n", + "Epoch [14/20], Step [150/555], loss: 1.403\n", + "Epoch [14/20], Step [200/555], loss: 1.387\n", + "Epoch [14/20], Step [250/555], loss: 1.400\n", + "Epoch [14/20], Step [300/555], loss: 1.417\n", + "Epoch [14/20], Step [350/555], loss: 1.368\n", + "Epoch [14/20], Step [400/555], loss: 1.410\n", + "Epoch [14/20], Step [450/555], loss: 1.400\n", + "Epoch [14/20], Step [500/555], loss: 1.388\n", + "Epoch [14/20], Step [550/555], loss: 1.431\n", + "Epoch [15/20], Step [50/555], loss: 1.392\n", + "Epoch [15/20], Step [100/555], loss: 1.386\n", + "Epoch [15/20], Step [150/555], loss: 1.373\n", + "Epoch [15/20], Step [200/555], loss: 1.354\n", + "Epoch [15/20], Step [250/555], loss: 1.377\n", + "Epoch [15/20], Step [300/555], loss: 1.369\n", + "Epoch [15/20], Step [350/555], loss: 1.380\n", + "Epoch [15/20], Step [400/555], loss: 1.389\n", + "Epoch [15/20], Step [450/555], loss: 1.383\n", + "Epoch [15/20], Step [500/555], loss: 1.407\n", + "Epoch [15/20], Step [550/555], loss: 1.380\n", + "Epoch [16/20], Step [50/555], loss: 1.386\n", + "Epoch [16/20], Step [100/555], loss: 1.347\n", + "Epoch [16/20], Step [150/555], loss: 1.398\n", + "Epoch [16/20], Step [200/555], loss: 1.378\n", + "Epoch [16/20], Step [250/555], loss: 1.377\n", + "Epoch [16/20], Step [300/555], loss: 1.366\n", + "Epoch [16/20], Step [350/555], loss: 1.383\n", + "Epoch [16/20], Step [400/555], loss: 1.379\n", + "Epoch [16/20], Step [450/555], loss: 1.367\n", + "Epoch [16/20], Step [500/555], loss: 1.383\n", + "Epoch [16/20], Step [550/555], loss: 1.402\n", + "Epoch [17/20], Step [50/555], loss: 1.382\n", + "Epoch [17/20], Step [100/555], loss: 1.398\n", + "Epoch [17/20], Step [150/555], loss: 1.381\n", + "Epoch [17/20], Step [200/555], loss: 1.366\n", + "Epoch [17/20], Step [250/555], loss: 1.390\n", + "Epoch [17/20], Step [300/555], loss: 1.406\n", + "Epoch [17/20], Step [350/555], loss: 1.378\n", + "Epoch [17/20], Step [400/555], loss: 1.336\n", + "Epoch [17/20], Step [450/555], loss: 1.369\n", + "Epoch [17/20], Step [500/555], loss: 1.379\n", + "Epoch [17/20], Step [550/555], loss: 1.369\n", + "Epoch [18/20], Step [50/555], loss: 1.375\n", + "Epoch [18/20], Step [100/555], loss: 1.388\n", + "Epoch [18/20], Step [150/555], loss: 1.371\n", + "Epoch [18/20], Step [200/555], loss: 1.378\n", + "Epoch [18/20], Step [250/555], loss: 1.380\n", + "Epoch [18/20], Step [300/555], loss: 1.394\n", + "Epoch [18/20], Step [350/555], loss: 1.360\n", + "Epoch [18/20], Step [400/555], loss: 1.383\n", + "Epoch [18/20], Step [450/555], loss: 1.390\n", + "Epoch [18/20], Step [500/555], loss: 1.425\n", + "Epoch [18/20], Step [550/555], loss: 1.400\n", + "Epoch [19/20], Step [50/555], loss: 1.378\n", + "Epoch [19/20], Step [100/555], loss: 1.359\n", + "Epoch [19/20], Step [150/555], loss: 1.368\n", + "Epoch [19/20], Step [200/555], loss: 1.358\n", + "Epoch [19/20], Step [250/555], loss: 1.392\n", + "Epoch [19/20], Step [300/555], loss: 1.367\n", + "Epoch [19/20], Step [350/555], loss: 1.369\n", + "Epoch [19/20], Step [400/555], loss: 1.385\n", + "Epoch [19/20], Step [450/555], loss: 1.358\n", + "Epoch [19/20], Step [500/555], loss: 1.378\n", + "Epoch [19/20], Step [550/555], loss: 1.370\n", + "Finished Training\n" + ] + } + ], + "source": [ + "epoch_losses1d = model_train(net1d, trainloader1d, 20)" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Z__ZvrLjgqg-", + "outputId": "4a81c456-30a3-4f31-8bc4-c250586fd66c" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:54: UserWarning: Implicit dimension choice for softmax has been deprecated. Change the call to include dim=X as an argument.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Accuracy for class left is: 70.9 %\n", + "Accuracy for class right is: 51.2 %\n", + "Accuracy for class up is: 50.2 %\n", + "Accuracy for class down is: 42.4 %\n", + "Accuracy for class stop is: 48.5 %\n", + "Total accuracy: 52 %\n" + ] + } + ], + "source": [ + "model_predict(net1d, testloader1d)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "JVs8tJMS1NN-" + }, + "source": [ + "### Сравнение лоссов\n", + "Модель с 2d-свертками побеждает" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 312 + }, + "id": "ocofSxBC07xZ", + "outputId": "f768310e-2968-45c7-9f1f-456f9946343e" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5, 1.0, 'Losses')" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(epoch_losses, '-', label='conv2d')\n", + "plt.plot(epoch_losses1d, '-', label='conv1d')\n", + "plt.xlabel('epoch')\n", + "plt.ylabel('loss')\n", + "plt.grid()\n", + "plt.legend()\n", + "plt.title('Losses')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5hiBQK6M1a7Y" + }, + "source": [ + "### Используем готовую модель: ResNet" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "_YgnzbI-zB99", + "outputId": "170e1d40-6f4e-49e2-b188-e6c38887108a" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ResNet(\n", + " (conv1): Conv2d(1, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)\n", + " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " (maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)\n", + " (layer1): Sequential(\n", + " (0): BasicBlock(\n", + " (conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (1): BasicBlock(\n", + " (conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (layer2): Sequential(\n", + " (0): BasicBlock(\n", + " (conv1): Conv2d(64, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (downsample): Sequential(\n", + " (0): Conv2d(64, 128, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", + " (1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (1): BasicBlock(\n", + " (conv1): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (layer3): Sequential(\n", + " (0): BasicBlock(\n", + " (conv1): Conv2d(128, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (downsample): Sequential(\n", + " (0): Conv2d(128, 256, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", + " (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (1): BasicBlock(\n", + " (conv1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (layer4): Sequential(\n", + " (0): BasicBlock(\n", + " (conv1): Conv2d(256, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (downsample): Sequential(\n", + " (0): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", + " (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (1): BasicBlock(\n", + " (conv1): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (avgpool): AdaptiveAvgPool2d(output_size=(1, 1))\n", + " (fc): Linear(in_features=512, out_features=1000, bias=True)\n", + ")\n" + ] + } + ], + "source": [ + "import torchvision.models as models\n", + "\n", + "resnet = models.resnet.resnet18()\n", + "resnet.conv1 = nn.Conv2d(1, 64, kernel_size=7, stride=2, padding=3, bias=False)\n", + "resnet = resnet.to(device)\n", + "print(resnet)" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": { + "id": "wE031kP0zEgt" + }, + "outputs": [], + "source": [ + "criterion = nn.CrossEntropyLoss()\n", + "optimizer = optim.Adam(resnet.parameters(), lr=0.003)#, momentum=0.9)" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "NZWdLn4hJSzY", + "outputId": "1f504bb1-f194-435a-f90a-3a3822a8aea2" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch [0/20], Step [50/555], loss: 2.114\n", + "Epoch [0/20], Step [100/555], loss: 1.685\n", + "Epoch [0/20], Step [150/555], loss: 1.682\n", + "Epoch [0/20], Step [200/555], loss: 1.511\n", + "Epoch [0/20], Step [250/555], loss: 1.433\n", + "Epoch [0/20], Step [300/555], loss: 1.306\n", + "Epoch [0/20], Step [350/555], loss: 1.250\n", + "Epoch [0/20], Step [400/555], loss: 1.116\n", + "Epoch [0/20], Step [450/555], loss: 0.958\n", + "Epoch [0/20], Step [500/555], loss: 0.810\n", + "Epoch [0/20], Step [550/555], loss: 0.718\n", + "Epoch [1/20], Step [50/555], loss: 0.624\n", + "Epoch [1/20], Step [100/555], loss: 0.580\n", + "Epoch [1/20], Step [150/555], loss: 0.515\n", + "Epoch [1/20], Step [200/555], loss: 0.598\n", + "Epoch [1/20], Step [250/555], loss: 0.475\n", + "Epoch [1/20], Step [300/555], loss: 0.420\n", + "Epoch [1/20], Step [350/555], loss: 0.465\n", + "Epoch [1/20], Step [400/555], loss: 0.371\n", + "Epoch [1/20], Step [450/555], loss: 0.375\n", + "Epoch [1/20], Step [500/555], loss: 0.344\n", + "Epoch [1/20], Step [550/555], loss: 0.324\n", + "Epoch [2/20], Step [50/555], loss: 0.311\n", + "Epoch [2/20], Step [100/555], loss: 0.300\n", + "Epoch [2/20], Step [150/555], loss: 0.341\n", + "Epoch [2/20], Step [200/555], loss: 0.362\n", + "Epoch [2/20], Step [250/555], loss: 0.311\n", + "Epoch [2/20], Step [300/555], loss: 0.314\n", + "Epoch [2/20], Step [350/555], loss: 0.241\n", + "Epoch [2/20], Step [400/555], loss: 0.306\n", + "Epoch [2/20], Step [450/555], loss: 0.297\n", + "Epoch [2/20], Step [500/555], loss: 0.298\n", + "Epoch [2/20], Step [550/555], loss: 0.276\n", + "Epoch [3/20], Step [50/555], loss: 0.296\n", + "Epoch [3/20], Step [100/555], loss: 0.285\n", + "Epoch [3/20], Step [150/555], loss: 0.179\n", + "Epoch [3/20], Step [200/555], loss: 0.252\n", + "Epoch [3/20], Step [250/555], loss: 0.320\n", + "Epoch [3/20], Step [300/555], loss: 0.228\n", + "Epoch [3/20], Step [350/555], loss: 0.260\n", + "Epoch [3/20], Step [400/555], loss: 0.226\n", + "Epoch [3/20], Step [450/555], loss: 0.229\n", + "Epoch [3/20], Step [500/555], loss: 0.186\n", + "Epoch [3/20], Step [550/555], loss: 0.249\n", + "Epoch [4/20], Step [50/555], loss: 0.207\n", + "Epoch [4/20], Step [100/555], loss: 0.222\n", + "Epoch [4/20], Step [150/555], loss: 0.177\n", + "Epoch [4/20], Step [200/555], loss: 0.152\n", + "Epoch [4/20], Step [250/555], loss: 0.225\n", + "Epoch [4/20], Step [300/555], loss: 0.210\n", + "Epoch [4/20], Step [350/555], loss: 0.244\n", + "Epoch [4/20], Step [400/555], loss: 0.220\n", + "Epoch [4/20], Step [450/555], loss: 0.207\n", + "Epoch [4/20], Step [500/555], loss: 0.183\n", + "Epoch [4/20], Step [550/555], loss: 0.166\n", + "Epoch [5/20], Step [50/555], loss: 0.251\n", + "Epoch [5/20], Step [100/555], loss: 0.195\n", + "Epoch [5/20], Step [150/555], loss: 0.190\n", + "Epoch [5/20], Step [200/555], loss: 0.152\n", + "Epoch [5/20], Step [250/555], loss: 0.175\n", + "Epoch [5/20], Step [300/555], loss: 0.176\n", + "Epoch [5/20], Step [350/555], loss: 0.148\n", + "Epoch [5/20], Step [400/555], loss: 0.136\n", + "Epoch [5/20], Step [450/555], loss: 0.239\n", + "Epoch [5/20], Step [500/555], loss: 0.147\n", + "Epoch [5/20], Step [550/555], loss: 0.127\n", + "Epoch [6/20], Step [50/555], loss: 0.129\n", + "Epoch [6/20], Step [100/555], loss: 0.111\n", + "Epoch [6/20], Step [150/555], loss: 0.141\n", + "Epoch [6/20], Step [200/555], loss: 0.146\n", + "Epoch [6/20], Step [250/555], loss: 0.135\n", + "Epoch [6/20], Step [300/555], loss: 0.134\n", + "Epoch [6/20], Step [350/555], loss: 0.141\n", + "Epoch [6/20], Step [400/555], loss: 0.238\n", + "Epoch [6/20], Step [450/555], loss: 0.184\n", + "Epoch [6/20], Step [500/555], loss: 0.118\n", + "Epoch [6/20], Step [550/555], loss: 0.168\n", + "Epoch [7/20], Step [50/555], loss: 0.126\n", + "Epoch [7/20], Step [100/555], loss: 0.150\n", + "Epoch [7/20], Step [150/555], loss: 0.149\n", + "Epoch [7/20], Step [200/555], loss: 0.144\n", + "Epoch [7/20], Step [250/555], loss: 0.119\n", + "Epoch [7/20], Step [300/555], loss: 0.165\n", + "Epoch [7/20], Step [350/555], loss: 0.150\n", + "Epoch [7/20], Step [400/555], loss: 0.130\n", + "Epoch [7/20], Step [450/555], loss: 0.135\n", + "Epoch [7/20], Step [500/555], loss: 0.140\n", + "Epoch [7/20], Step [550/555], loss: 0.121\n", + "Epoch [8/20], Step [50/555], loss: 0.146\n", + "Epoch [8/20], Step [100/555], loss: 0.119\n", + "Epoch [8/20], Step [150/555], loss: 0.078\n", + "Epoch [8/20], Step [200/555], loss: 0.109\n", + "Epoch [8/20], Step [250/555], loss: 0.120\n", + "Epoch [8/20], Step [300/555], loss: 0.131\n", + "Epoch [8/20], Step [350/555], loss: 0.159\n", + "Epoch [8/20], Step [400/555], loss: 0.095\n", + "Epoch [8/20], Step [450/555], loss: 0.146\n", + "Epoch [8/20], Step [500/555], loss: 0.175\n", + "Epoch [8/20], Step [550/555], loss: 0.127\n", + "Epoch [9/20], Step [50/555], loss: 0.069\n", + "Epoch [9/20], Step [100/555], loss: 0.118\n", + "Epoch [9/20], Step [150/555], loss: 0.068\n", + "Epoch [9/20], Step [200/555], loss: 0.080\n", + "Epoch [9/20], Step [250/555], loss: 0.132\n", + "Epoch [9/20], Step [300/555], loss: 0.159\n", + "Epoch [9/20], Step [350/555], loss: 0.127\n", + "Epoch [9/20], Step [400/555], loss: 0.110\n", + "Epoch [9/20], Step [450/555], loss: 0.103\n", + "Epoch [9/20], Step [500/555], loss: 0.173\n", + "Epoch [9/20], Step [550/555], loss: 0.175\n", + "Epoch [10/20], Step [50/555], loss: 0.086\n", + "Epoch [10/20], Step [100/555], loss: 0.066\n", + "Epoch [10/20], Step [150/555], loss: 0.095\n", + "Epoch [10/20], Step [200/555], loss: 0.076\n", + "Epoch [10/20], Step [250/555], loss: 0.106\n", + "Epoch [10/20], Step [300/555], loss: 0.082\n", + "Epoch [10/20], Step [350/555], loss: 0.086\n", + "Epoch [10/20], Step [400/555], loss: 0.086\n", + "Epoch [10/20], Step [450/555], loss: 0.098\n", + "Epoch [10/20], Step [500/555], loss: 0.119\n", + "Epoch [10/20], Step [550/555], loss: 0.121\n", + "Epoch [11/20], Step [50/555], loss: 0.105\n", + "Epoch [11/20], Step [100/555], loss: 0.074\n", + "Epoch [11/20], Step [150/555], loss: 0.102\n", + "Epoch [11/20], Step [200/555], loss: 0.074\n", + "Epoch [11/20], Step [250/555], loss: 0.118\n", + "Epoch [11/20], Step [300/555], loss: 0.085\n", + "Epoch [11/20], Step [350/555], loss: 0.136\n", + "Epoch [11/20], Step [400/555], loss: 0.098\n", + "Epoch [11/20], Step [450/555], loss: 0.095\n", + "Epoch [11/20], Step [500/555], loss: 0.066\n", + "Epoch [11/20], Step [550/555], loss: 0.075\n", + "Epoch [12/20], Step [50/555], loss: 0.072\n", + "Epoch [12/20], Step [100/555], loss: 0.056\n", + "Epoch [12/20], Step [150/555], loss: 0.074\n", + "Epoch [12/20], Step [200/555], loss: 0.064\n", + "Epoch [12/20], Step [250/555], loss: 0.108\n", + "Epoch [12/20], Step [300/555], loss: 0.082\n", + "Epoch [12/20], Step [350/555], loss: 0.071\n", + "Epoch [12/20], Step [400/555], loss: 0.086\n", + "Epoch [12/20], Step [450/555], loss: 0.119\n", + "Epoch [12/20], Step [500/555], loss: 0.108\n", + "Epoch [12/20], Step [550/555], loss: 0.063\n", + "Epoch [13/20], Step [50/555], loss: 0.064\n", + "Epoch [13/20], Step [100/555], loss: 0.066\n", + "Epoch [13/20], Step [150/555], loss: 0.086\n", + "Epoch [13/20], Step [200/555], loss: 0.091\n", + "Epoch [13/20], Step [250/555], loss: 0.064\n", + "Epoch [13/20], Step [300/555], loss: 0.070\n", + "Epoch [13/20], Step [350/555], loss: 0.064\n", + "Epoch [13/20], Step [400/555], loss: 0.099\n", + "Epoch [13/20], Step [450/555], loss: 0.117\n", + "Epoch [13/20], Step [500/555], loss: 0.087\n", + "Epoch [13/20], Step [550/555], loss: 0.089\n", + "Epoch [14/20], Step [50/555], loss: 0.051\n", + "Epoch [14/20], Step [100/555], loss: 0.045\n", + "Epoch [14/20], Step [150/555], loss: 0.056\n", + "Epoch [14/20], Step [200/555], loss: 0.045\n", + "Epoch [14/20], Step [250/555], loss: 0.047\n", + "Epoch [14/20], Step [300/555], loss: 0.055\n", + "Epoch [14/20], Step [350/555], loss: 0.111\n", + "Epoch [14/20], Step [400/555], loss: 0.104\n", + "Epoch [14/20], Step [450/555], loss: 0.087\n", + "Epoch [14/20], Step [500/555], loss: 0.054\n", + "Epoch [14/20], Step [550/555], loss: 0.061\n", + "Epoch [15/20], Step [50/555], loss: 0.043\n", + "Epoch [15/20], Step [100/555], loss: 0.054\n", + "Epoch [15/20], Step [150/555], loss: 0.063\n", + "Epoch [15/20], Step [200/555], loss: 0.142\n", + "Epoch [15/20], Step [250/555], loss: 0.076\n", + "Epoch [15/20], Step [300/555], loss: 0.080\n", + "Epoch [15/20], Step [350/555], loss: 0.067\n", + "Epoch [15/20], Step [400/555], loss: 0.071\n", + "Epoch [15/20], Step [450/555], loss: 0.091\n", + "Epoch [15/20], Step [500/555], loss: 0.082\n", + "Epoch [15/20], Step [550/555], loss: 0.050\n", + "Epoch [16/20], Step [50/555], loss: 0.034\n", + "Epoch [16/20], Step [100/555], loss: 0.060\n", + "Epoch [16/20], Step [150/555], loss: 0.074\n", + "Epoch [16/20], Step [200/555], loss: 0.057\n", + "Epoch [16/20], Step [250/555], loss: 0.078\n", + "Epoch [16/20], Step [300/555], loss: 0.053\n", + "Epoch [16/20], Step [350/555], loss: 0.047\n", + "Epoch [16/20], Step [400/555], loss: 0.049\n", + "Epoch [16/20], Step [450/555], loss: 0.079\n", + "Epoch [16/20], Step [500/555], loss: 0.096\n", + "Epoch [16/20], Step [550/555], loss: 0.072\n", + "Epoch [17/20], Step [50/555], loss: 0.088\n", + "Epoch [17/20], Step [100/555], loss: 0.048\n", + "Epoch [17/20], Step [150/555], loss: 0.072\n", + "Epoch [17/20], Step [200/555], loss: 0.055\n", + "Epoch [17/20], Step [250/555], loss: 0.093\n", + "Epoch [17/20], Step [300/555], loss: 0.049\n", + "Epoch [17/20], Step [350/555], loss: 0.060\n", + "Epoch [17/20], Step [400/555], loss: 0.177\n", + "Epoch [17/20], Step [450/555], loss: 0.102\n", + "Epoch [17/20], Step [500/555], loss: 0.081\n", + "Epoch [17/20], Step [550/555], loss: 0.056\n", + "Epoch [18/20], Step [50/555], loss: 0.035\n", + "Epoch [18/20], Step [100/555], loss: 0.047\n", + "Epoch [18/20], Step [150/555], loss: 0.032\n", + "Epoch [18/20], Step [200/555], loss: 0.028\n", + "Epoch [18/20], Step [250/555], loss: 0.029\n", + "Epoch [18/20], Step [300/555], loss: 0.046\n", + "Epoch [18/20], Step [350/555], loss: 0.055\n", + "Epoch [18/20], Step [400/555], loss: 0.069\n", + "Epoch [18/20], Step [450/555], loss: 0.073\n", + "Epoch [18/20], Step [500/555], loss: 0.069\n", + "Epoch [18/20], Step [550/555], loss: 0.075\n", + "Epoch [19/20], Step [50/555], loss: 0.051\n", + "Epoch [19/20], Step [100/555], loss: 0.044\n", + "Epoch [19/20], Step [150/555], loss: 0.085\n", + "Epoch [19/20], Step [200/555], loss: 0.055\n", + "Epoch [19/20], Step [250/555], loss: 0.088\n", + "Epoch [19/20], Step [300/555], loss: 0.034\n", + "Epoch [19/20], Step [350/555], loss: 0.045\n", + "Epoch [19/20], Step [400/555], loss: 0.041\n", + "Epoch [19/20], Step [450/555], loss: 0.027\n", + "Epoch [19/20], Step [500/555], loss: 0.058\n", + "Epoch [19/20], Step [550/555], loss: 0.075\n", + "Finished Training\n" + ] + } + ], + "source": [ + "epoch_losses_resnet = model_train(resnet, trainloader, 20)" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "UTcxK4eF-jvP", + "outputId": "697e9fb9-93be-4a88-a27d-d370e96f1b59" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Accuracy for class left is: 93.9 %\n", + "Accuracy for class right is: 96.9 %\n", + "Accuracy for class up is: 97.3 %\n", + "Accuracy for class down is: 90.4 %\n", + "Accuracy for class stop is: 89.6 %\n", + "Total accuracy: 93 %\n" + ] + } + ], + "source": [ + "model_predict(resnet, testloader)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "biCn_-5G8pBE" + }, + "source": [ + "### Какое восхитительное качество показала модель ResNet!\n", + "\n", + "Ниже для сравнения приведены лоссы трех моделей. ResNet справляется очень хорошо:)" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 312 + }, + "id": "mTbJlIok8NDJ", + "outputId": "4e9d007a-90eb-4eed-bce1-397ea4bd431b" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5, 1.0, 'Losses')" + ] + }, + "execution_count": 57, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEWCAYAAACJ0YulAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3dd3wc9Z34/9d7dyWtpN1V79W94ibbmG5Dgk0LkBAgIcaQ5JdwaaTcHXAhhJBwB5fk0ggEEmqO7xlwQjMG22CbloDBBXDF3ZItWbJkSStZfT+/P2a0KpZsWdZq19L76cc8ps++Zy3NW5/PfOYzYoxBKaWUAnCEOwCllFKRQ5OCUkqpIE0KSimlgjQpKKWUCtKkoJRSKkiTglJKqSBNCkoppYI0KSjViYjsFZHPhDsOpcJFk4JSSqkgTQpKnYCIxIjIb0XkoD38VkRi7HWpIrJURKpFpEpE3hYRh73uNhE5ICJ+EdkuIhfZyx0icruI7BKRShF5VkSS7XVuEflfe3m1iHwgIhnhO3s13GhSUOrEfgzMAaYBU4HZwJ32uh8BJUAakAH8B2BEZBzwHWCWMcYLzAf22vt8F7gKuADIBo4Af7TXLQISgDwgBbgFaAjdqSnVlSYFpU7sBuAeY0y5MaYC+Bmw0F7XAmQBBcaYFmPM28bqUKwNiAEmikiUMWavMWaXvc8twI+NMSXGmCbgbuAaEXHZx0sBRhtj2owx64wxtYN2pmrY06Sg1IllA/s6ze+zlwH8EtgJrBCR3SJyO4AxZifwfawLfrmILBaR9n0KgOft6qFqYCtWEskA/gosBxbbVVX/LSJRoT09pTpoUlDqxA5iXcjb5dvLMMb4jTE/MsaMBD4H/LD93oEx5v8ZY8619zXA/fb+xcAlxpjEToPbGHPALm38zBgzETgbuBy4cVDOUik0KSjVkyj7hq9bRNzA/wF3ikiaiKQCdwH/CyAil4vIaBERoAbrL/6AiIwTkQvtG9KNWPcFAvbx/wTcKyIF9jHSRORKe3qeiJwhIk6gFqs6KYBSg0STglLHWoZ1EW8f3MCHwMfAJ8B64Bf2tmOA14E64J/Ag8aY1Vj3E+4DDgNlQDpwh73P74CXsKqc/MB7wJn2ukxgCVZC2Aq8iVWlpNSgEH3JjlJKqXZaUlBKKRWkSUEppVSQJgWllFJBmhSUUkoFucIdwKlITU01hYWF/dq3vr6e+Pj4gQ1oAGl8p0bjO3WRHqPG13/r1q07bIxJ63GlMea0HYqKikx/rV69ut/7DgaN79RofKcu0mPU+PoP+ND0cl3V6iOllFJBmhSUUkoFaVJQSikVpElBKaVUkCYFpZRSQZoUlFJKBWlSUEopFTQ8k8LBjRTsfRb8h8IdiVJKRZThmRT2vMmIvU/DbybCszfC7jdBuxBXSqnTu5uLfjvnVt6vSeNM52bY+DRseRFSxsDMr8K0L0FsUrgjVEqpsBieJQWgIS4b5t8LP9wKVz9sJYLld8Cvx8ML34KSdVp6UEoNO8OzpNBZVCxMvd4ayj6BDx6Fj5+1ShBZU2Hm1+CMayA6Mju2UkqpgTRsSwo9yjwDrvgt/GgbXPZraGuFl79nlR6W/RuUbw13hEopFVJaUuiJ2wezvm6VEorft0oP656AtY9AwTnWvYcJV4ArJtyRKqXUgNKkcDwikD/HGhb8l1Wl9OFj8LevQVQ8+LLBkwHeDGvsSQdPpj3OAG8mxCaDQwtkSqnTgyaFvopPhXNuhbO+C7tXwY6VUHfIetbh4EZrurnu2P3EaSeJbgkjIce6Z5ExWUscSqmIoUnhZDkcMPoz1tBdUx3Ul1uJoq7T0D7vL4XSjVBfASZg7eOMthJDzgzInmGNU8cO7jkppZRNk8JAivFYQ/LI428XaIOaYji4AQ6st8YfLYYP/mKtj/YwLbYQmufZiaIIEvOt6iyllAqhYZsUaprC+AyCwwlJhdYw6WprWaANDu+Ag+vhwHoc29bA+w9DW7O1Pi6loyTRPvakh+kElFJD1bBMCo+8tYs/vHOUM2bUMTLNE+5wLA4npI+3hmlfZn38GuaeezYc2mQnig3WeNcbHVVP8emQMckeJlvjtHF6j0Ip1W/DMilcPDGTP7y+jRsfW8vf/+Vs0n3ucIfUM1e0VSLImQGz7GVNdVD2sVXldGiLlTTW/hnamqz14rTuSXRPFr5srX5SSp3QsEwKhanx/LDIzS/XNbPo8Q945ptz8Lmjwh1W38R4oOBsa2jX1gpVu60EcWizNRSvhU1LOrZxJ3YkiIxJVuKIirVKFc5oa+g+7XAO/vkppcIqpElBRH4AfB0wwCfAzUAWsBhIAdYBC40xzSISAzwFFAGVwHXGmL2him1EgpM/fWUKX33iA77x1Ic8+dXZxLhO04ug0wVpY61h8uc7ljdUW09hH9rUkTA2/C+01PftuOK0E0UUOGO6TE9vCoD/LMiaBtnTIH2iVlspNQSELCmISA7wPWCiMaZBRJ4FrgcuBX5jjFksIn8CvgY8ZI+PGGNGi8j1wP3AdaGKD+D8sWn86otT+f4zG/nhMx/x+y9Nx+kYQlUssYlQcJY1tAsEoHovVO6G1kbrRnZbM7Q29WG62aqmamsmULoHNj9vPekN4IiC9AlWgggmikkQFaFVc0qpHoW6+sgFxIpICxAHlAIXAl+21z8J3I2VFK60pwGWAA+IiBgT2q5Kr5qeQ4W/iXuXbSXVE83dn5uEDOW6d4fDajJ7omazJ/DRmjXMveACOLLXevbi4EZrvOUlWP+U/VkuSJsA2VPtRDHdqrqKij3181BKhYSE8porIrcC9wINwArgVuA9Y8xoe30e8KoxZrKIbAIWGGNK7HW7gDONMYe7HfMbwDcAMjIyihYvXtyv2Orq6vB4OloeLd7WxGt7W/nCmCiuGBXdr2MOpO7xRZpe4zMGd2M5nrpdeP3W4KnbRXRLrbUaB/XxedTHFxBwRGNEAAdGHIBgxNHLso5pcBBwOGl1eWmJ8tIS5QuOW10ejMN1+n5/ESTSY9T4+m/evHnrjDEze1oXyuqjJKy//kcA1cBzwIJTPa4x5hHgEYCZM2eauXPn9us4a9asofO+559v+OGzG/nbxoOcOWUC187KO9VQT0n3+CLNScVnDNSUQOlGpPQjPAc34jm83Xo2I9BmNbE1ATD2dCBw7LL2oS9iEmiQWGJTcqznO2KTrXFcsj3Yy9wJVueH7gSI8Q3qjfVI//+FyI9R4wuNUFYffQbYY4ypABCRvwPnAIki4jLGtAK5wAF7+wNAHlAiIi4gAeuG86BwOIT/vmYqlfXN3PH8J6R4orloQsZgffzQJgKJedYw4Yr+H8cYe2iz7nE0VMPRSmiossZHq+yhktq9W4l1u6CuHMq3WetPdIM92ts1SbQnjc7T7etiE8GbDQm51nKlhohQJoX9wBwRicOqProI+BBYDVyD1QJpEfCivf1L9vw/7fWrQn0/obtol4M/faWIL/35Pb79/9bz9NfnUFSgr+aMGCL2sxYOqxVUdLzVsWAPtq5ZQ0b3v9JaGu0EYieRplporIXGGnu6xppvqrGm6w7B4U871gVae44rxge+HCsWXw4k5HWazrXGesNdnSZClhSMMe+LyBJgPdAKbMCq9nkFWCwiv7CXPWrv8ijwVxHZCVRhtVQadPExLh67aRbXPPQPvvbkByy55SxGp3vDEYoaaFFuiMq2HuQ7WcZAS0NHAmk4ArUHoOaAVTVWa49LP7I6POwuLtVOFLmQkEN+RQO8vd6uPmuzEk6gtaNKLdDabXmg27I2u9QUAOyxMV2ng+vMsetE7N56c+0kltsxHZesDzoOYyFtfWSM+Snw026LdwOze9i2EfhiKOPpq1RPDE999Uw+/9A/uPHRtfz9W+eQmaB/6Q1rIhAdZw1kHX/blkYrSXRJGiXW9JE9sPdtRjbVwp5u+zmirPsaDlfHWNrnXVbLsfZpcVjrBGsauxQVnHZ0m29fZg8mYD278ulrVtPkzlyxkJDLlEA81JxhJYrETonDl9PxTEp7smyus4amOmiu72Heb43b51sbrb67gse0x54Mff9ImA3LJ5r7Ij8ljidunsX1j7zHosfW8uw3zyIh7jR56lmFV5QbUkZZQy/eemM5559/fqcLf5guhMZYVWk1xVbyCg7FuIq3wI4VVjVad7HJVomlua7vDQAcLoj2WIMrxrrf0+zvtk2UVZLrUnrJ6TofE+El90AbNNYQe7QUStZB4xHr/lfDEWistqabaq0GDwm5kJDfkXQj4Nw0KRzH5JwEHllYxKLH1/L/PfUhT31tNu6o0/SpZxVRAs6YyHheQ8R6gVR8qvUcSSfr21vPtDZ1VI+1D/5ScLmt+zrRno5xTPu01x7HWxe66Pien3hvrOmSiLp8xr53ofagVWXWmTsBfDnMaGiGHYlWqUqc9tjRUdLqsqzTfLCkJXQpVbWXqI4pdXVeZk+DXY1YbV/o2y/81dY9KeBMgLU9fOdR8db3dLQKAi3dzi2xW8nMHifmW+P49JD/AaFJ4QTOHp3K/1w7je8t3sCtizfw4A1FQ+upZ6VOxBUzIA889sidYA0Zk3pe39ZqlVS6Jw1/KS3lpVbLr/ZmzYE2MM2d7rm02c2b2zrNd5oO3mfpdv+l+/iYZXbJKMYLsUnWhdyTCWnjO+Zjk9i6t5QJ08+ylsUmdqxz2c9BBdqs0lJNMVTv7zjH6mI4sg/2vmMlns6c0Vb1XWIezPk2jDvlVv7H0KTQB1dMzeZwXRM/e3kLP3lxE/deNXloP/WsVKRwuuzqoxzsv72DPonw5wAONa5hwri5vW/gcIIvyxryjrnNammssZJEe0LsnDx6aw13ijQp9NHN54yg3N/EQ2t2ke6N4fuf0VdmKqVCzJ0AmQmQOXnQPlKTwkn49/njKK9t4rev7yAlPpqvzCnQEoNSakjRpHASRIT7vnAGVfVN/OTFzfz57T1cNiWLy6dkMTHLpwlCKXXa06RwkqKcDv60sIgXNxzk5Y8P8shbu3lozS5GpsVz+ZRsrpiSxZiM8DcrU0qp/hiWSSFgAhxpPdLv/WNcTq6dlce1s/KorGvi1U1lLP34IH9YtYPfv7GDcRleLp+SxeVTsxmRGj+AkSulVGgNy6TwyMeP8McDf+SS1ktwu07tSeUUTwxfmVPAV+YUUF7byLJPSln6cSm/Xvkpv175KZOyfVw+JZvLp2SRlxw3QGeglFKhMSyTQr43H4ASfwmjk0YP2HHTfW5uOmcEN50zgoPVDSz7pJSXPy7l/te2cf9r25ial8gVU7K49IwsshMj4MElpZTqZlgmhQJfAQD7/PsGNCl0lp0Yy9fPG8nXzxtJcdVRln5cytKPD/KLV7byi1e2UlSQxMUTM/jMxAxGpUXmiziUUsPPsEwKeT7rBTr7a/cPzuclx/Evc0fxL3NHsedwPUs/Osirm8r4r1e38V+vbmNkWjyfnWAliBn5SfrEtFIqbIZlUvBF+/A4POyr3Tfonz0iNZ7vXjSG7140hgPVDby+5RCvbz3Eo+/s4eG3dpMcH82F49PJCrQyu7mVuOhh+V+klAqTYXvFSYtKo9hfHNYYchJjWXR2IYvOLqS2sYU3t1fw+tZDrNhcRm1jKw9/spJzR6fy2YkZXDQ+nXSfdt+tlAqtYZsUUl2pYSkp9MbnjuKKqdlcMTWblrYAf35hNRXRmazccohV28oBmJqXaN2HmJDB2AyPPiynlBpwwzYppLvS+aDmAxpaG4h1RVZLoCing4kpTubOncRdl09k+yE/r285xMoth/jl8u38cvl2chJjmZjtY1yGl3GZXsZneilMjSfKqS8oUUr137BNCmlRaYDVLHVM0pgwR9M7EWF8po/xmT6+c+EYDtU28sbWct7ddZjtZX5WbSunLWC9yjra6WBkWjzjM72MtRPF2AwvOYmxWqpQSvXJ8E0KLisp7K/dH9FJobsMn5svn5nPl8+0nrVobGljd0U92w/Vsq3Mz6dlftbuqeKFjQeD+3hjXIy1E8T4TKtkMS7DS1J8dLhOQykVoYZvUrBLCvv8kXNfoT/cUU4mZvuYmO3rsry2sYVPy/xWojhkjZd9Usr/re1ohpvpczM+y8uELB/jM71MzPIxIjUel1ZBKTVsDdukEOuIJdmdPGjPKgw2nzuKmYXJzCxMDi4zxlDub2JbmZ9tpbVsL/OzpbSWd3cepqXNroJyORib4WF8po8JWT4mZFpJQ0sVSg0PwzYpgNXdxX7/0EwKPRERMnxuMnxuLhibFlze3BpgV0Ud28pq2VrqZ2tpLWu2V7BkXUlwmwxfjF2i8DEhy0t1bRu7KuqIcjhwOQWXU4h2OnA5HbgcQpTToQ/hKXUaGt5JwZfPe6XvhTuMsIt2OaxSQZaPqzu9u73C38T2MitJbLUTxrs7dwdLFfzjzeMe1yHgcjqIcog1djqIshNIXJSLkWnxjEn3MCbDut8xIjWeaJdWXSkVTsM7KXjzeWnXSxHZLDUSpHljSPPGcO6Y1OCyljarVPHymrWMHT+BljZDa1uAlraANR2wxi1tAVrbDC0Be9y+vi1Aa8Dgb2xlW5mf5ZvLsBtP4XIIhanxjM3wMDrdy9gMD2MzvBSmnHyyMMZwpL6ZQ/5GymubOFTbSLm/iXJ7XH20hVRvDFkJbjJ9brIT3WQmxJKV4CbVEzMkSzklR47ywd4q1u45wqeH/BQVJLFgcibTchNxDMHzVf0zrJNCe8d4xf5ixibpO5f7IsrpYHymj7JMF3On5Zzy8dpbT+0ot26If3qoji0Ha3l1UxmmU7IYkRrP2AwvYzI8jEn3kpccS/XRli4X+0O1TZT7rfGhmgZal6885vN8bhfpPjcJsVF8XFLN8s2NNLcGumzjcljVbJkJ1pCd0JEwrCGWNG9kJ45AwLCzoo61e6r4YG8VH+yp4mBNIwBet4tRaR4ef3cPj7y1m0yfm/mTMlgwOYvZI5Ij+rz6q7UtwP6qo+wsr2NXRT3FR46SneC2mntnabPtzoZ1UujcMZ4mhfDorfVUY4t1z2LHobpgsth0sIZlm0qDyaKz9ot9hi+G2SOSaaouZ+akMaT7YsjwuUn3xpDudRMb7eyynzGGI0dbOFjdQFlNI6W1jZTVNFBa3UhpTSNbDtby+pZDNHVLHE6HkO6NIdNOFBk+a9yePDLtezeDVR3W0hZg04GaYEngw31VVB9tASDdG8OsEcl8szCZWYXJjMv04nQINQ0trNp2iFc/KWPxB8U8+c99pMRHc7GdIFoDPXzRAyAQMByub8Id5cQT7RrQUkp9Uyu7K+rZWeFnV3m9nQTq2FtZ31HtCSTGRQW/H7AS5QQ7QbQninEZXuJjht8lcvidcScFXrsL7Qjq7kJZ3FFOJmUnMCk7ocvyhmYrWRyobiA5PrrXi/2aNWuYe+6IE36OiJAcH01yfDSTcxJ63MYYQ/XRFkprGimrbeBgdSOlNQ2U1VjVUtvL/KzZXsHR5rZj9k31xJCZEEOmz04WdhIpPdxG3J4qnA7B5RBr7BRcDkeXeWu9o+t2DqG5LcCG/dXBksCG/dU0tFifX5gSx2cnZDBrRDKzC5MpSInr8a/ghNgorp6ey9XTc6lvamXN9gpe3VTKSxsP8n9ri4lzwYKKjSyYnMn5Y9NwRzmPOcbxHG22LtC7KuqC410V9ew5XEdji5VkHQJedxS+WBc+dxQ+dxQJsR3z1rQ1nxBrrffFRhEb5WRrZRvF7+1jl33h31VeFywNgZW4C1LiGJXmCXZRPzrdw8i0eHzuKPyNLXx6yM/WUj/bymrZVurn7+sPUNe0z/7ZgILkuGCSaG9kkZcU12siawsYjja3crS5jbJ6K1EfbW6jvrmVhuY26pusdU2tbeQnxzEpO4HcpMgqpQzrpOCJ9pDsTg57x3iq72KjnUzOSej1Ah4KIkJSfDRJ8dHHlGjaGWPwN7VSVtMYHNqTSFlNIyVHjnb56x2AD/85ALHBhEwf183KY1ZhMrNGJJHuPfmOE+NjXFw2JYvLpmTR2NLGOzsO8/jrG3ljWzl/33CAuGgn88als2ByJvPGp+Ox/4I2xlBW29hx0S+vY/fh+mMu0CKQlxTHyLR4zh6VQn5yHC1tAWobWqhtbKW2oYWahhZqG1vYc7g+ON1Tou3ig03ERzsZle5hzsgURqV77It/PPnJx78X5XVHUVSQTFFB12bbJUca2GY3sGhPFsu3dFRnxkc7GZ1u9T12tLmV+qY2GlqsC373EiVvv3PC7z4hNorJOT4mZycwKSeBydk+ClPiw3afZ1gnBbBuNmtJQZ0qEQn+pTs2w9vrdg3NbZTVNrLirfeYPGUqrQFDm30zvi1gaA1YN+s7z3eMrZv0bW0GEZiUk0BRQRI+d9SAnos7yslnJmbgKo/hnPPO55+7KnltcxkrNpfxyielRLsczC5Mpqahhd0VddR3unC3X6Bnj0hmVJqHUfZf5oUp8Sdd0gB6TRxHm9qo2Pcpn//s2WT63AP2l7aIkJccR15yHJ+dmBFc3tDcZj8EarXC21VRh4iQleAmLtpFXLSTuBgn8e3T0S727fqUoqmTiY/pWBYX7SQ+xkWUU9hdUc+mgzVsOlDL5oM1PP7uXprbAsHvcVJ2AhOzffYfQT5Gp3kG5cFSTQq+fN47qM1S1eCIjXYyIjWecclOzhmdeuIdwizK6eD8sWmcPzaNn185mQ/3VvHqpjLe211JmjeGL87MY1RafDABpHtjBrQqJMrpIMUTQ4on5ph1a+p3kZUwOK0GY6OdTM1LZGpeYp/3WdOwm7mTMntd3/14LW0Bdtj3zjYfqGHTwVqe+aCYJ/6xF4AYl4PxWT4m24ni3NGpIXnv+7BPCgW+Al7a9RJHW44SFzXwX7BSQ4XTIZw5MoUzR6aEO5QhKcrp6Gh0MdNqBNMWMOw5XMemA7VsOlDD5oO1vPTRQZ5+fz//efUZwT7QBtKwTwr5XutLLfYXMy55XJijUUqpDk6HMDrdy+h0L1dNt5qAG2MormrA6w7N5XvYPz6a77OSwnDq7kIpdfoSEfJT4kLWH9mwTwrtD7DpzWallNKkQHxUPCnuFG2WqpRSaFIArCokLSkopZQmBcDuQnuIvldBKaVOhiYFrPsKFQ0VHG05Gu5QlFIqrEKaFEQkUUSWiMg2EdkqImeJSLKIrBSRHfY4yd5WROT3IrJTRD4WkRmhjK2z9o7x9L6CUmq4C3VJ4XfAa8aY8cBUYCtwO/CGMWYM8IY9D3AJMMYevgE8FOLYgrRjPKWUsoQsKYhIAnA+8CiAMabZGFMNXAk8aW/2JHCVPX0l8JSxvAckikhWqOLrTJ9VUEopi5ieOqcfiAOLTAMeAbZglRLWAbcCB4wxifY2AhwxxiSKyFLgPmPMO/a6N4DbjDEfdjvuN7BKEmRkZBQtXry4X/HV1dXh8XiC8/9R/B9Mip3EDak39Ot4A617fJFG4zs1kR4fRH6MGl//zZs3b50xZmaPK40xIRmAmUArcKY9/zvg50B1t+2O2OOlwLmdlr8BzDzeZxQVFZn+Wr16dZf5G5fdaG5cdmO/jzfQuscXaTS+UxPp8RkT+TFqfP0HfGh6ua6G8p5CCVBijHnfnl8CzAAOtVcL2eNye/0BIK/T/rn2skGR78vX6iOl1LAXsqRgjCkDikWkvZe5i7Cqkl4CFtnLFgEv2tMvATfarZDmADXGmNJQxdddga+Aww2HtVmqUmpYC3Uvqd8FnhaRaGA3cDNWInpWRL4G7AOutbddBlwK7ASO2tsOmjyv/b5m/37GJ48fzI9WSqmIEdKkYIzZiHVvobuLetjWAN8OZTzH07ljPE0KSqnhSp9otnV+r4JSSg1XmhRscVFxpMam6gNsSqlhTZNCJ9oxnlJquNOk0EmBr0CbpSqlhjVNCp3k+/I53HCY+pb6cIeilFJhEeomqaeV9pvN+2v3MyFlQpijUUqdSEtLCyUlJTQ2NoY7lGMkJCSwdevWsMbgdrvJzc0lKiqqz/toUuikvVnqfr8mBaVOByUlJXi9XgoLC7G6Uoscfr8fr9cbts83xlBZWUlJSQkjRozo835afdRJ8AE2vdms1GmhsbGRlJSUiEsIkUBESElJOelSlCaFTuKi4kiLTdNmqUqdRjQh9K4/340mhW60Yzyl1HCmSaGbAl+BVh8ppSLCypUrKSoq4owzzqCoqIhVq1b1uN0TTzzBd77znQH5TL3R3E2eN4/KxkrqmuvwREfmCzKUUsNDamoqL7/8MtnZ2WzatIn58+dz4EBo3yigJYVuOrdAUkqpvnjqqaeYMmUKU6dOZeHChezdu5fLL7+cKVOmcNFFF7F/v3U9uemmm/je977H2WefzciRI1myZAkA119/Pa+88krweDfddBNLlixh+vTpZGdnAzBp0iQaGhpoamoC4PHHH2fs2LHMnj2bd999d8DORUsK3QSfVfDvZ2LKxDBHo5Tqq5+9vJktB2sH9JgTs3389IpJx91m8+bN/OIXv+Af//gHqampVFVVsWjRIr70pS9xyy238Nhjj/G9732PF154AYDS0lLeeecdtm3bxuc+9zmuueYarrvuOp599lkuu+wympubeeONN3jooYe6fM7f/vY3ZsyYQUxMDKWlpfz0pz9l3bp1JCQkMG/ePKZPnz4g56wlhW60WapS6mSsWrWKL37xi6SmpgKQnJzMP//5T6691npVzMKFC3nnnXeC21911VU4HA4mTpzIoUOHALjkkktYvXo1TU1NvPrqq5x//vnExsYG99m8eTO33XYbDz/8MADvv/8+c+fOJS0tjejoaK677roBOx8tKXQTFxVHemy6NktV6jRzor/oI0VMTExw2nqNjPXk8dy5c1m+fDnPPPMM119/fXCbkpISrr76ap566ilGjRoV8vi0pNCDfF++vldBKdUnF154Ic899xyVlZUAVFVVcfbZZwfvFzz99NOcd955JzzOddddx+OPP87bb7/NggULAKiuruayyy7jvvvu45xzzglue+aZZ/Lmm29SWVlJS0sLzz333ICdj5YUepDvy2dN8Zpwh6GUOg1MmjSJH//4x1xwwQU4nU6mT5/OH/7wB2688UYeeOAB0tLSePzxx094nIsvvpiFCxdy5Z7TOOMAAB60SURBVJVXEh0dDcADDzzAzp07ueeee7jnnnsAWLFiBVlZWdx9992cddZZJCYmMm3atAE7H00KPcj35lPVWKXNUpVSfbJo0SIWLVrUZdnSpUuP6fvoiSee6DJfV1cXnI6KiqKqqqrL+jvvvJM777yzx8+8+eabufnmgX+VvVYf9SD4vma/3ldQSg0vmhR60N4CqbhW7ysopYYXTQo9yPdZzypoCySl1HCjSaEHsa5Y0uPS9almpdSw06ekICK3iohPLI+KyHoRuTjUwYWTdoynlBqO+lpS+Koxpha4GEgCFgL3hSyqCJDv1S60lVLDT1+TQvubGi4F/mqM2dxp2ZCU77Oapfqb/eEORSk1TFVWVjJv3jw8Hs9xu8YeyK6z+5oU1onICqyksFxEvEBgQCKIUAVe7S1VKRVebrebn//85/zqV78atM/sa1L4GnA7MMsYcxSIAgb+qYkIkufTjvGUUn0Tqq6z4+PjOffcc3G73cd8Zri7zj4L2GiMqReRrwAzgN8NWBQRqP1ZBW2WqtRp4tXboeyTgT1m5hlwyfFvnw5W19mdRULX2Q8BR0VkKvAjYBfw1IBEEKFiXbFkxGVoSUEpdVyD0XV2d5HQdXarMcaIyJXAA8aYR0XkawMWRYTK92kLJKVOGyf4iz5SnGzX2YOtryUFv4jcgdUU9RURcWDdVxjS8r35WlJQSh1XKLvO7k0kdJ19HfBlrOcVykQkH/jlgEURoQp8BRxpOkJtcy2+aF+4w1FKRaBQdp0NUFhYSG1tLc3NzbzwwgusWLGCiRMnhrfrbDsRPA3MEpHLgbXGmCF9TwE6+kAqri1mUurp8VYnpdTgC1XX2QB79+7t8TPD2nW2iFwLrAW+CFwLvC8i1wx4NBEm36sd4ymlhpe+Vh/9GOsZhXIAEUkDXgeWhCqwSBBslqrvVVBKDRN9vdHsaE8ItsqT2Pe05Xa5yYzP1PcqKKWGjb6WFF4TkeXA/9nz1wHLQhNSZMn35mtJQSk1bPTpr31jzL8BjwBT7OERY8xtfdlXRJwiskFEltrzI0TkfRHZKSLPiEi0vTzGnt9pry/szwkNtHyfNktVSg0ffa4CMsb8zRjzQ3t4/iQ+41Zga6f5+4HfGGNGA0ew+lXCHh+xl//G3i7sCrwFVDdVU9NUE+5QlFIq5I6bFETELyK1PQx+Eak90cFFJBe4DPiLPS/AhXTcoH4SuMqevtKex15/kb19WLV3jFfs1/sKSqnw2rhxI8uWhbbm/rj3FIwx3uOt74PfAv8OtB8nBag2xrTa8yVAjj2dAxTbn9sqIjX29oc7H1BEvgF8AyAjI4M1a9b0K7C6uro+7VvebN1ff+391zgcf/gEWw+cvsYXLhrfqYn0+CDyY6yrqyMhIQG/P3LeeWKMwRiDw+Ggra1twGN77733WL9+fZ+ekG7X2Nh4cv+P7Scx0ANwOfCgPT0XWAqkAjs7bZMHbLKnNwG5ndbtAlKP9xlFRUWmv1avXt2n7RpbG80ZT5xhHtzwYL8/qz/6Gl+4aHynJtLjMybyY1y9erXZsmVLuMMwe/bsMWPHjjULFy40EydONHfffbeZOXOmmTRpkrnrrruMMcbU1dWZSy+91EyZMsVMmjTJLF682BhjTEFBgbnrrrvM9OnTzeTJk83WrVuD2998881m1qxZZtq0aeaFF14wTU1NJi8vz6SmppqpU6cGj3EiPX1HwIeml+tqX1sf9cc5wOdE5FLADfiwuttOFBGXsUoLucABe/sDdpIoEREXkIDV9DWsYpwxZMRnaMd4SkW4+9fez7aqbQN6zPHJ47lt9onb1OzYsYMnn3yS2tpalixZwtq1a6mtreWGG27grbfeoqKiguzs7OA7E2pqOu5Rpqamsn79eh588EF+9atf8Ze//IV7772XCy+8kMcee4zq6mpmz57NZz7zGe655x4+/PBDHnjggQE9z85C9qyBMeYOY0yuMaYQuB5YZYy5AVgNtD8NvQh40Z5+yZ7HXr/KzmhhV+At0BZISqleFRQUMGfOHFasWMGKFSuYPn065513Htu2bWPHjh2cccYZrFy5kttuu423336bhISE4L6f//znASgqKgp2abFixQruu+8+pk2bxty5c2lsbAy+qCfUQllS6M1twGIR+QWwAXjUXv4o8FcR2QlUYSWSiJDvy2fFvhXhDkMpdRx9+Ys+VOLj4wGrOv6OO+7gm9/8Jn6/v0vfR+vXr2fZsmXceeedXHTRRdx1111AR1faTqeT1tbW4HH+9re/MW7cuC6f8/7774f8XAblqWRjzBpjzOX29G5jzGxjzGhjzBeNMU328kZ7frS9fvdgxNYXBb4CappqtFmqUuq45s+fz2OPPRbs6O7AgQOUl5dz8OBB4uLi+MpXvsK//du/sX79+hMe5w9/+EPwfQsbNmwAwOv1hvzG+pDvqmIgtPeBpFVISqnjufjii/nyl7/MWWedxZw5c7jmmmvw+/188sknzJ49m2nTpvGzn/2MO++887jH+clPfkJLSwtTpkxh0qRJ/OQnPwFg3rx5bNmyhWnTpvHMM8+E5BzCUX102inwFQBWx3hnpJ0R5miUUpGksLCQTZs2BedvvfVWbr311i7VR6NGjWL+/PnH7Nu5W+yZM2cGm47Gxsby8MMPH7N9cnIyH3zwwcCeQDdaUuiDXG8ugmjHeEqpIU+TQh/EOGPIjM/UjvGUUkOeJoU+0o7xlIpMEdJyPSL157vRpNBHBd4CfQObUhHG7XZTWVmpiaEHxhgqKytxu90ntZ/eaO6jfF8+tc211DTVkBCTcOIdlFIhl5ubS0lJCRUVFeEO5RiNjY0nfUEeaG63m9zc3JPaR5NCH3V+X/OUtClhjkYpBdbL7keMGBHuMHq0Zs0apk+fHu4wTppWH/VRsFmqViEppYYwTQp9FGyWqu9VUEoNYZoU+ijaGU1WfJaWFJRSQ5omhZOgzVKVUkOdJoWTUOAr0PcqKKWGNE0KJyHPm0dtcy3VjdXhDkUppUJCk8JJ6NwxnlJKDUWaFE5Cvs96VkHvKyilhipNCich15OLQxx6X0EpNWRpUjgJ2ixVKTXUaVI4SflebZaqlBq6NCmcpPZnFbRXRqXUUKRJ4STle/Pxt/ipbtJmqUqpoUeTwknSjvGUUkOZJoWT1N4sVTvGU0oNRZoUTlJ7s1QtKSilhiJNCicpyhlFVnyWtkBSSg1JmhT6ocBXoF1dKKWGJE0K/ZDnzaO4tlibpSqlhhxNCv0wNmks/hY/y/ctD3coSik1oDQp9MPVo69mStoU7nr3LnYe2RnucJRSasBoUuiHKGcU/3PB/xDriuUHa36Av9kf7pCUUmpAaFLop4z4DH59wa8p9hfz43d+TMAEwh2SUkqdMk0Kp2Bm5kz+dea/srp4NX/55C/hDkcppU6ZJoVTdMOEG7h0xKU8sOEB3jnwTrjDUUqpU6JJ4RSJCD8966eMThrNbW/dRom/JNwhKaVUv2lSGABxUXH8bu7vMBh+sOYHNLQ2hDskpZTqF00KAyTPl8d9593H9qrt/PyfP9cH25RSpyVNCgPo/Nzz+Zdp/8LLu19m8fbF4Q5HKaVOWsiSgojkichqEdkiIptF5FZ7ebKIrBSRHfY4yV4uIvJ7EdkpIh+LyIxQxRZK35zyTS7IvYD/XvvfbCjfEO5wlFLqpISypNAK/MgYMxGYA3xbRCYCtwNvGGPGAG/Y8wCXAGPs4RvAQyGMLWQc4uA/z/tPsj3Z/HDND6k4WhHukJRSqs9ClhSMMaXGmPX2tB/YCuQAVwJP2ps9CVxlT18JPGUs7wGJIpIVqvhCyRft47fzfkt9Sz0/evNHtLS1hDskpZTqk0G5pyAihcB04H0gwxhTaq8qAzLs6Ryg8+vMSuxlp6UxSWP42dk/Y0P5Bn714a/CHY5SSvWJhLqVjIh4gDeBe40xfxeRamNMYqf1R4wxSSKyFLjPGPOOvfwN4DZjzIfdjvcNrOolMjIyihYv7t8N3bq6OjweT/9O6iT8vervrPavZmHKQmZ7Zvd5v8GKr780vlMT6fFB5Meo8fXfvHnz1hljZva40hgTsgGIApYDP+y0bDuQZU9nAdvt6YeBL/W0XW9DUVGR6a/Vq1f3e9+T0dLWYm5+7WZT9Ncis+Xwlj7vN1jx9ZfGd2oiPT5jIj9Gja//gA9NL9fVULY+EuBRYKsx5n86rXoJWGRPLwJe7LT8RrsV0hygxnRUM522XA4Xvzz/lyTEJPCDNT+gpqkm3CEppVSvQnlP4RxgIXChiGy0h0uB+4DPisgO4DP2PMAyYDewE/gz8K0QxjaoUmJT+M3c31B+tJzb3rqNtkBbuENSSqkeuUJ1YGPdG5BeVl/Uw/YG+Hao4gm3KWlTuOPMO7jnn/fw4EcP8t3p3w13SEopdQx9onkQXTPmGj4/5vM88vEjrNq/KtzhKKXUMTQpDCIR4T/O/A8mpUzi9rdv53frf0dVY1W4w1JKqSBNCoMsxhnD7y/8Pefnns+jnzzK/CXzuX/t/ZTVl4U7NKWU0qQQDulx6fzqgl/x4lUvMr9wPou3LeaSv1/C3f+4m+La4hMfQCmlQiRkN5rViY1IGMEvzv0F35r2LR7b9BjP73ie53c+zyUjLmFq89Rwh6eUGoa0pBABsj3Z3DnnTl77wmvcOPFGVu1fxX+W/iffX/19NlduDnd4SqlhRJNCBEmLS+NHM3/Eii+sYEHCAtaWreX6pddzy8pbWHdoXbjDU0oNA5oUIlCiO5HLEi9jxRdWcOuMW9latZWbXruJRa8u4t0D7+pb3ZRSIaNJIYJ5oj18/Yyv89oXXuP22bdzoO4At7x+C9e/cj0r962kJaBdciulBpbeaD4NxLpiuWHCDVw79lpe2vUSj256lB+u+SFJMUnML5zPFaOu4IzUM7C6m1JKqf7TpHAaiXJG8YWxX+DK0Vfy7oF3Wbp7Kc/vfJ7F2xeT783n8pGXc9nIy8j35Yc7VKXUaUqTwmnI5XBxQd4FXJB3Af5mP6/ve51Xdr/CQx89xIMfPciUtClcMfIK5hfOJ8mdFO5wlVKnEU0KpzlvtJerx1zN1WOupqy+jGV7lvHyrpe59/17uX/t/Zybcy6Xj7qcC3IvwO1yhztcpVSE06QwhGTGZ/LVyV/lq5O/yvaq7SzdvZRlu5expmQNnigPny34LFeMuoKijCIcom0MlFLH0qQwRI1LHse45HF8f8b3+eDQB7y862WW713O8zufJyMugwWFC5iSNoUJKRPI9eTqTWqlFKBJYchzOpzMyZrDnKw53DnnTtYUr+HlXS/z9NaneXLLkwB4o7yMTxnP+OTxTEiewITkCRQmFOJy6I+HUsON/tYPI7GuWC4ZcQmXjLiExtZGdlbvZGvVVrZWbmVb1Tae3f4sTW1NALidbsYmjw0mifEp4xmTOIZoZ3SYz0IpFUqaFIYpt8vN5NTJTE6dHFzWGmhlT82eYKLYWrWVV3a/wjPbnwHAJS5GJY5iQsoEXLUu0irTGJc0TksUSg0h+tusglwOF2OSxjAmaQyfG/U5AAImQIm/pEuJ4q2St6hqrGLJ0iXEumKZkjqFaenTmJ4+nSlpU/BGe8N8Jkqp/tKkoI7LIQ7yffnk+/KZXzgfAGMMz7/xPLGjYtlQvoGN5Rv58yd/JmACCMKYpDFMT5/O1LSpTE+fTo4nR29kK3Wa0KSgTpqIkOxKZu6IuVwy4hIA6lvq+bjiYzaWb2RD+QaW7l4arHZKi00LliSmp09nXPI4ohxR4TwFpVQvNCmoAREfFc9Z2WdxVvZZALQF2thZvZMN5RuCpYmV+1YC1g3vCckTSI9LJyU2hRR3So9jvamt1ODTpKBCwulwBp+VuH789QAcqj/EhooNfFT+EVsqt7ClcguVjZXUt9T3eAxvlJeU2BSS3cldk0ZsCqnuVFJjU0mLSyPFnUKUU0seSg0ETQpq0GTEZ7AgfgELChd0Wd7Y2khlYyWVDfbQeOx4x5EdvNf4Hv5mf4/HTopJIiU2hbTYNNLi0jh65CglW0pIjUu1lsWmkRqbSlxU3GCcqlKnLU0KKuzcLjc5nhxyPDkn3La5rZmqxioONxzmcMNhKhoqOHzUGlc0VFDZUMmesj1U1Ffw+gevH7N/nCsuWLrwRfvwRnvxRHvwRnvxRvUybQ8xzphQnL5SEUWTgjqtRDujyYzPJDM+87jbrVq9iulnTQ8mjcONh6k4WhFMJJUNlZTWl7Kjege1zbXUt9QTMIHjHjPKERVMEAkxCUxMnsjU9KlMTZuqXYWoIUOTghqSHOIgyZ1EkjuJsUljT7h9wAQ42nKUupY6/M1+/M1+6lrqqG2upa65rsu0v9nP4YbDvLTrJRZvXwxAsjuZqWlTmZI2halpU5mcOplYV2yoT1OpAadJQSmsJOKJ9uCJ9pywFNKuvYXVRxUfBYfVxasBcIqTsUljmZo2VUsT6rSiSUGpfurcwuracdcCcKTxCB9XfBxMEi/uevGY0sTUtKm0NLTgKfPQZtpoC7RZ427TrYFWAiYQnG4zbQRMgNZAKwCJMYmkxqZarbFiU0mKScLpcIbt+1BDgyYFpQZQkjsp+FY8sPqT2lm9k4/KP+Ljwx93KU2wfGA/WxCS3ElWonCndEkY7U1626cTYxL1nRqqR5oUlAohl8PF+GSrW/LruA6wShPPrXmOqVOn4hQnToczOHaJC4c4uky7HC6c4uwybTBUN1ZT2VgZbInVPt3etHdf7T4ONxymOdB8TFyC4BRn+wxi/wPriXVBaAu04Xra1WWf9uovpzjJjM8k35tPnjePPF8e+d588r35ZMRnDKmEY4yhuqmaA3UHKKkr4WDdQSqOVlDoK2R6xnRGJ44eUuerSUGpQZbkTmKseyxnZp15SsfxRnvJ8+UddxtjDHUtdVQ22Mmj0UoaVY1VwdZWxhgMxprGYE+yv3g/ubm5weXBbYyhJdBCaX0pu2p28WbJm7QEWoKfGe2IJsebE0wY+T577M0ny5PVYxcnbYE2aptrqW6qpqaphuqmao40HglOd15e3VSNv9mPo8XBX5f/lSR3Esnu5B6HJHcSvmjfCe/l1LfUU+Iv4UDdgY7Bf4AD9db4aOvRLtu7nW4a2xqD/w/tXbjMSJ/BpNRJp3XzZU0KSg1hIhJsRluYUHhS+66pW8PcWXNPuF1boI1DRw+x37+fYn8xxbXFwem1ZWtpaG0IbusUJ9mebLLjs2loa6C6seMi3550unOJi4SYBBJjEkmISSDfm48n2sPeg3tpDbSyvWo7lY2VvT7Y6HK4SI5J7kgescn4on0cbjgcTAA1TTVd9ol1xZLjySHXk8vszNnkeHLI9mST68kl25ONJ8pDSV0JG8o3sP7QejaUb+CtkrcAq+ny5NTJpDSmIMXCtPRpJMQk9PFbDz9NCkqpU+J02Bd6TzZzsuZ0WWeM4XDDYYr9VqLYX2sli9L6UuJccWSnZJMQk0CSOyl40U+MSQxOJ8UkER8V3+Nf+mvWrGHu3LnB+Za2Fo40HaGqsapjaKjqWNZgLSv2F1PTXEOKO4UcTw6TUyaT4+246Od4ckiMSTxh6SLPm0eeNy/YzXxVY1WwQ8j15etZVbuK11dZD1COThzdUZrImEF2fHaPx28LtNEcaKa5rZmmtiaa26zp5kDX+aa2JsYmjSXXm3uy/10npElBKRUyIkJanNX1yIyMGSH9rChnFOlx6aTHpYf0c3qT7E7mwvwLuTD/QgBWrFpB0sSkYJJ4dc+rPPfpc4DVc3CMM6ZLAmhpa6HVtPb5834y5yfBVm8DSZOCUkqFQLQjmlmZs5iVOQvoeK5l3aF1bDq8iQABoh3RRDujiXHGEO3sNG0v77LO0XW77PjskMStSUEppQZB5+daItnQaUellFLqlEVUUhCRBSKyXUR2isjt4Y5HKaWGm4hJCiLiBP4IXAJMBL4kIhPDG5VSSg0vEZMUgNnATmPMbmNMM7AYuDLMMSml1LASSUkhByjuNF9iL1NKKTVIxJienyIcbCJyDbDAGPN1e34hcKYx5jvdtvsG8A2AjIyMosWLF/fr8+rq6vB4PKcWdAhpfKdG4zt1kR6jxtd/8+bNW2eMmdnjSmNMRAzAWcDyTvN3AHccb5+ioiLTX6tXr+73voNB4zs1Gt+pi/QYNb7+Az40vVxXI6n66ANgjIiMEJFo4HrgpTDHpJRSw0rEVB8BiMilwG8BJ/CYMebeE2xfAezr58elAof7ue9g0PhOjcZ36iI9Ro2v/wqMMWk9rYiopDCYRORD01udWgTQ+E6NxnfqIj1GjS80Iqn6SCmlVJhpUlBKKRU0nJPCI+EO4AQ0vlOj8Z26SI9R4wuBYXtPQSml1LGGc0lBKaVUN5oUlFJKBQ35pHCi7rhFJEZEnrHXvy8ihYMYW56IrBaRLSKyWURu7WGbuSJSIyIb7eGuwYrP/vy9IvKJ/dkf9rBeROT39vf3sYiE9p2LXT97XKfvZaOI1IrI97ttM+jfn4g8JiLlIrKp07JkEVkpIjvscVIv+y6yt9khIosGKbZfisg2+//veRFJ7GXf4/4shDjGu0XkQKf/x0t72Tfk3e/3Et8znWLbKyIbe9l3UL7DU9Lbo85DYcB6CG4XMBKIBj4CJnbb5lvAn+zp64FnBjG+LGCGPe0FPu0hvrnA0jB+h3uB1OOsvxR4FRBgDvB+GP+vy7Aeygnr9wecD8wANnVa9t/A7fb07cD9PeyXDOy2x0n2dNIgxHYx4LKn7+8ptr78LIQ4xruBf+3Dz8Bxf99DFV+39b8G7grnd3gqw1AvKfSlO+4rgSft6SXARSIigxGcMabUGLPenvYDWzn9eoa9EnjKWN4DEkUkKwxxXATsMsb09wn3AWOMeQuo6ra488/Zk8BVPew6H1hpjKkyxhwBVgILQh2bMWaFMcE3xr8H5A7kZ56sXr6/vhiU7vePF5997bgW+L+B/tzBMtSTQl+64w5uY/9i1AApgxJdJ3a11XTg/R5WnyUiH4nIqyIyaVADAwOsEJF1dg+13UVKl+fX0/svYji/v3YZxphSe7oMyOhhm0j4Lr+KVfLryYl+FkLtO3YV12O9VL9Fwvd3HnDIGLOjl/Xh/g5PaKgnhdOCiHiAvwHfN8bUdlu9HqtKZCrwB+CFQQ7vXGPMDKw34n1bRM4f5M8/IbsDxc8Bz/WwOtzf3zGMVY8QcW3BReTHQCvwdC+bhPNn4SFgFDANKMWqoolEX+L4pYSI/30a6knhAJDXaT7XXtbjNiLiAhKAykGJzvrMKKyE8LQx5u/d1xtjao0xdfb0MiBKRFIHKz5jzAF7XA48j1VE76wv33GoXQKsN8Yc6r4i3N9fJ4faq9XscXkP24TtuxSRm4DLgRvspHWMPvwshIwx5pAxps0YEwD+3Mtnh/Vn0b5+fB54prdtwvkd9tVQTwp96Y77JaC9lcc1wKrefikGml3/+Ciw1RjzP71sk9l+j0NEZmP9nw1K0hKReBHxtk9j3ZDc1G2zl4Ab7VZIc4CaTtUkg6XXv87C+f110/nnbBHwYg/bLAcuFpEku3rkYntZSInIAuDfgc8ZY472sk1ffhZCGWPn+1RX9/LZ4e5+/zPANmNMSU8rw/0d9lm473SHesBqHfMpVquEH9vL7sH6BQBwY1U77ATWAiMHMbZzsaoRPgY22sOlwC3ALfY23wE2Y7WkeA84exDjG2l/7kd2DO3fX+f4BPij/f1+Aswc5P/feKyLfEKnZWH9/rASVCnQglWv/TWs+1RvADuA14Fke9uZwF867ftV+2dxJ3DzIMW2E6suvv1nsL01Xjaw7Hg/C4P4/f3V/vn6GOtCn9U9Rnv+mN/3wYjPXv5E+89dp23D8h2eyqDdXCillAoa6tVHSimlToImBaWUUkGaFJRSSgVpUlBKKRWkSUEppVSQJgWlwsTuwXVpuONQqjNNCkoppYI0KSh1AiLyFRFZa/eB/7CIOEWkTkR+I9Z7MN4QkTR722ki8l6ndxMk2ctHi8jrdsd860VklH14j4gssd9n8PRg9dCrVG80KSh1HCIyAbgOOMcYMw1oA27AepL6Q2PMJOBN4Kf2Lk8BtxljpmA9gdu+/Gngj8bqmO9srCdiweoZ9/vARKwnXs8J+UkpdRyucAegVIS7CCgCPrD/iI/F6swuQEfHZ/8L/F1EEoBEY8yb9vIngefs/m5yjDHPAxhjGgHs4601dl859tu6CoF3Qn9aSvVMk4JSxyfAk8aYO7osFPlJt+36219MU6fpNvR3UoWZVh8pdXxvANeISDoE37VcgPW7c429zZeBd4wxNcARETnPXr4QeNNYb9UrEZGr7GPEiEjcoJ6FUn2kf5UodRzGmC0icifW27IcWD1jfhuoB2bb68qx7juA1S32n+yL/m7gZnv5QuBhEbnHPsYXB/E0lOoz7SVVqX4QkTpjjCfccSg10LT6SCmlVJCWFJRSSgVpSUEppVSQJgWllFJBmhSUUkoFaVJQSikVpElBKaVU0P8P5x/T1x6AS0cAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(epoch_losses, '-', label='conv2d')\n", + "plt.plot(epoch_losses1d, '-', label='conv1d')\n", + "plt.plot(epoch_losses_resnet, '-', label='resnet')\n", + "plt.xlabel('epoch')\n", + "plt.ylabel('loss')\n", + "plt.grid()\n", + "plt.legend()\n", + "plt.title('Losses')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ojEuXjx5DlDW" + }, + "source": [ + "Train a model: finally, lets' build and train a classifier neural network. You can use any library you like. If in doubt, consult the model & training tips below." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "hwgnOrZy1E8p" + }, + "source": [ + "__Training tips:__ here's what you can try:\n", + "* __Layers:__ 1d or 2d convolutions, perhaps with some batch normalization in between;\n", + "* __Architecture:__ VGG-like, residual, highway, densely-connected, MatchboxNet, Dilated convs - you name it :)\n", + "* __Batch size matters:__ smaller batches usually train slower but better. Try to find the one that suits you best.\n", + "* __Data augmentation:__ add background noise, faster/slower, change pitch;\n", + "* __Average checkpoints:__ you can make model more stable with [this simple technique (arxiv)](https://arxiv.org/abs/1803.05407)\n", + "* __For full scale stage:__ make sure you're not losing too much data due to max_length in the pre-processing stage!\n", + "\n", + "These are just recommendations. As long as your model works, you're not required to follow them." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Fvf8UCsPDvj2" + }, + "source": [ + "### Full scale commands recognition (3+ points)\n", + "\n", + "Your final task is to train a full-scale voice command spotter and apply it to a video:\n", + "1. Build the dataset with all 30+ classes (directions, digits, names, etc.)\n", + " * __Optional:__ include a special \"noise\" class that contains random unrelated sounds\n", + " * You can download youtube videos with [`youtube-dl`](https://ytdl-org.github.io/youtube-dl/index.html) library.\n", + "2. Train a model on this full dataset. Kudos for tuning its accuracy :)\n", + "3. Apply it to a audio/video of your choice to spot the occurences of each keyword\n", + " * Here's one [video about primes](https://www.youtube.com/watch?v=EK32jo7i5LQ) that you can try. It should be full of numbers :)\n", + " * There are multiple ways you can analyze the performance of your network, e.g. plot probabilities predicted for every time-step. Chances are you'll discover something useful about how to improve your model :)\n", + "\n", + "\n", + "Please briefly describe what you did in a short informal report." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "uo3P6bMNriIj" + }, + "source": [ + "### Обучение на всем датасете\n", + "Датасет слишком большой, поэтому пришлось обрабатывать его по частям. В ноутбуке финальные файлы" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Tfc5o7cwvBuC", + "outputId": "c7da5f02-0ccc-402c-d538-22a9e95d6daf" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Mounted at /content/drive\n" + ] + } + ], + "source": [ + "from google.colab import drive\n", + "drive.mount('/content/drive')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "id": "9hWycdhJwayr" + }, + "outputs": [], + "source": [ + "with open('/content/drive/MyDrive/speech_technology/X_train.pickle', 'rb') as f:\n", + " X_train = pickle.load(f)\n", + " \n", + "with open('/content/drive/MyDrive/speech_technology/X_test.pickle', 'rb') as f:\n", + " X_test = pickle.load(f)\n", + "\n", + "with open('/content/drive/MyDrive/speech_technology/y_train.pickle', 'rb') as f:\n", + " y_train = pickle.load(f)\n", + "\n", + "with open('/content/drive/MyDrive/speech_technology/y_test.pickle', 'rb') as f:\n", + " y_test = pickle.load(f)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "FgMZJdoJ_klS", + "outputId": "789e48ea-7ba2-48d5-8952-35a56a1714d2" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(48539, 150, 128)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "id": "568ZPJYn_tLV" + }, + "outputs": [], + "source": [ + "# X.shape\n", + "X_train_r = X_train[:,None,:,:]\n", + "X_test_r = X_test[:,None,:,:]" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ud5OxvOl_Rks", + "outputId": "07a73f9d-061f-481b-a098-db33db3e76d9" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.7/dist-packages/torch/utils/data/dataloader.py:481: UserWarning: This DataLoader will create 4 worker processes in total. Our suggested max number of worker in current system is 2, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary.\n", + " cpuset_checked))\n" + ] + } + ], + "source": [ + "batch_size = 64\n", + "\n", + "tensor_x = torch.Tensor(X_train_r)\n", + "tensor_y = torch.LongTensor(y_train)\n", + "\n", + "train_dataset = TensorDataset(tensor_x, tensor_y)\n", + "\n", + "tensor_x = torch.Tensor(X_test_r) # transform to torch tensor\n", + "tensor_y = torch.LongTensor(y_test)\n", + "\n", + "test_dataset = TensorDataset(tensor_x, tensor_y)\n", + "\n", + "\n", + "trainloader = DataLoader(train_dataset, batch_size=batch_size,\n", + " shuffle=True, num_workers=4)\n", + "testloader = DataLoader(test_dataset, batch_size=batch_size,\n", + " shuffle=False, num_workers=2)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "id": "YoqeKb-Y7x6D" + }, + "outputs": [], + "source": [ + "import torch.nn as nn\n", + "import torch.nn.functional as F\n", + "import torchvision.models as models\n", + "\n", + "resnet = models.resnet.resnet18()\n", + "resnet.conv1 = nn.Conv2d(1, 64, kernel_size=7, stride=2, padding=3, bias=False)\n", + "resnet = resnet.to(device)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "id": "L65aKUgHANJR" + }, + "outputs": [], + "source": [ + "criterion = nn.CrossEntropyLoss()\n", + "optimizer = optim.Adam(resnet.parameters(), lr=0.003)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "NJtKxRVw_9SC", + "outputId": "30b66d83-c6ea-4c92-d032-cd97b9863d39" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.7/dist-packages/torch/utils/data/dataloader.py:481: UserWarning: This DataLoader will create 4 worker processes in total. Our suggested max number of worker in current system is 2, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary.\n", + " cpuset_checked))\n", + "/usr/local/lib/python3.7/dist-packages/torch/nn/functional.py:718: UserWarning: Named tensors and all their associated APIs are an experimental feature and subject to change. Please do not use them for anything important until they are released as stable. (Triggered internally at /pytorch/c10/core/TensorImpl.h:1156.)\n", + " return torch.max_pool2d(input, kernel_size, stride, padding, dilation, ceil_mode)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch [0/10], Step [50/759], loss: 3.800\n", + "Epoch [0/10], Step [100/759], loss: 3.215\n", + "Epoch [0/10], Step [150/759], loss: 2.832\n", + "Epoch [0/10], Step [200/759], loss: 2.424\n", + "Epoch [0/10], Step [250/759], loss: 2.063\n", + "Epoch [0/10], Step [300/759], loss: 1.741\n", + "Epoch [0/10], Step [350/759], loss: 1.520\n", + "Epoch [0/10], Step [400/759], loss: 1.337\n", + "Epoch [0/10], Step [450/759], loss: 1.214\n", + "Epoch [0/10], Step [500/759], loss: 1.077\n", + "Epoch [0/10], Step [550/759], loss: 0.986\n", + "Epoch [0/10], Step [600/759], loss: 0.933\n", + "Epoch [0/10], Step [650/759], loss: 0.863\n", + "Epoch [0/10], Step [700/759], loss: 0.800\n", + "Epoch [0/10], Step [750/759], loss: 0.782\n", + "Epoch [1/10], Step [50/759], loss: 0.742\n", + "Epoch [1/10], Step [100/759], loss: 0.670\n", + "Epoch [1/10], Step [150/759], loss: 0.666\n", + "Epoch [1/10], Step [200/759], loss: 0.623\n", + "Epoch [1/10], Step [250/759], loss: 0.634\n", + "Epoch [1/10], Step [300/759], loss: 0.600\n", + "Epoch [1/10], Step [350/759], loss: 0.582\n", + "Epoch [1/10], Step [400/759], loss: 0.590\n", + "Epoch [1/10], Step [450/759], loss: 0.539\n", + "Epoch [1/10], Step [500/759], loss: 0.496\n", + "Epoch [1/10], Step [550/759], loss: 0.525\n", + "Epoch [1/10], Step [600/759], loss: 0.519\n", + "Epoch [1/10], Step [650/759], loss: 0.508\n", + "Epoch [1/10], Step [700/759], loss: 0.486\n", + "Epoch [1/10], Step [750/759], loss: 0.470\n", + "Epoch [2/10], Step [50/759], loss: 0.435\n", + "Epoch [2/10], Step [100/759], loss: 0.413\n", + "Epoch [2/10], Step [150/759], loss: 0.445\n", + "Epoch [2/10], Step [200/759], loss: 0.422\n", + "Epoch [2/10], Step [250/759], loss: 0.409\n", + "Epoch [2/10], Step [300/759], loss: 0.411\n", + "Epoch [2/10], Step [350/759], loss: 0.377\n", + "Epoch [2/10], Step [400/759], loss: 0.381\n", + "Epoch [2/10], Step [450/759], loss: 0.383\n", + "Epoch [2/10], Step [500/759], loss: 0.402\n", + "Epoch [2/10], Step [550/759], loss: 0.390\n", + "Epoch [2/10], Step [600/759], loss: 0.403\n", + "Epoch [2/10], Step [650/759], loss: 0.385\n", + "Epoch [2/10], Step [700/759], loss: 0.382\n", + "Epoch [2/10], Step [750/759], loss: 0.374\n", + "Epoch [3/10], Step [50/759], loss: 0.306\n", + "Epoch [3/10], Step [100/759], loss: 0.319\n", + "Epoch [3/10], Step [150/759], loss: 0.352\n", + "Epoch [3/10], Step [200/759], loss: 0.339\n", + "Epoch [3/10], Step [250/759], loss: 0.281\n", + "Epoch [3/10], Step [300/759], loss: 0.311\n", + "Epoch [3/10], Step [350/759], loss: 0.322\n", + "Epoch [3/10], Step [400/759], loss: 0.349\n", + "Epoch [3/10], Step [450/759], loss: 0.320\n", + "Epoch [3/10], Step [500/759], loss: 0.342\n", + "Epoch [3/10], Step [550/759], loss: 0.318\n", + "Epoch [3/10], Step [600/759], loss: 0.305\n", + "Epoch [3/10], Step [650/759], loss: 0.326\n", + "Epoch [3/10], Step [700/759], loss: 0.307\n", + "Epoch [3/10], Step [750/759], loss: 0.296\n", + "Epoch [4/10], Step [50/759], loss: 0.256\n", + "Epoch [4/10], Step [100/759], loss: 0.254\n", + "Epoch [4/10], Step [150/759], loss: 0.226\n", + "Epoch [4/10], Step [200/759], loss: 0.209\n", + "Epoch [4/10], Step [250/759], loss: 0.257\n", + "Epoch [4/10], Step [300/759], loss: 0.271\n", + "Epoch [4/10], Step [350/759], loss: 0.293\n", + "Epoch [4/10], Step [400/759], loss: 0.275\n", + "Epoch [4/10], Step [450/759], loss: 0.252\n", + "Epoch [4/10], Step [500/759], loss: 0.256\n", + "Epoch [4/10], Step [550/759], loss: 0.287\n", + "Epoch [4/10], Step [600/759], loss: 0.285\n", + "Epoch [4/10], Step [650/759], loss: 0.288\n", + "Epoch [4/10], Step [700/759], loss: 0.254\n", + "Epoch [4/10], Step [750/759], loss: 0.290\n", + "Epoch [5/10], Step [50/759], loss: 0.225\n", + "Epoch [5/10], Step [100/759], loss: 0.226\n", + "Epoch [5/10], Step [150/759], loss: 0.199\n", + "Epoch [5/10], Step [200/759], loss: 0.223\n", + "Epoch [5/10], Step [250/759], loss: 0.233\n", + "Epoch [5/10], Step [300/759], loss: 0.216\n", + "Epoch [5/10], Step [350/759], loss: 0.245\n", + "Epoch [5/10], Step [400/759], loss: 0.260\n", + "Epoch [5/10], Step [450/759], loss: 0.255\n", + "Epoch [5/10], Step [500/759], loss: 0.230\n", + "Epoch [5/10], Step [550/759], loss: 0.215\n", + "Epoch [5/10], Step [600/759], loss: 0.248\n", + "Epoch [5/10], Step [650/759], loss: 0.217\n", + "Epoch [5/10], Step [700/759], loss: 0.209\n", + "Epoch [5/10], Step [750/759], loss: 0.241\n", + "Epoch [6/10], Step [50/759], loss: 0.187\n", + "Epoch [6/10], Step [100/759], loss: 0.171\n", + "Epoch [6/10], Step [150/759], loss: 0.199\n", + "Epoch [6/10], Step [200/759], loss: 0.189\n", + "Epoch [6/10], Step [250/759], loss: 0.204\n", + "Epoch [6/10], Step [300/759], loss: 0.187\n", + "Epoch [6/10], Step [350/759], loss: 0.193\n", + "Epoch [6/10], Step [400/759], loss: 0.205\n", + "Epoch [6/10], Step [450/759], loss: 0.200\n", + "Epoch [6/10], Step [500/759], loss: 0.177\n", + "Epoch [6/10], Step [550/759], loss: 0.230\n", + "Epoch [6/10], Step [600/759], loss: 0.212\n", + "Epoch [6/10], Step [650/759], loss: 0.196\n", + "Epoch [6/10], Step [700/759], loss: 0.195\n", + "Epoch [6/10], Step [750/759], loss: 0.206\n", + "Epoch [7/10], Step [50/759], loss: 0.181\n", + "Epoch [7/10], Step [100/759], loss: 0.157\n", + "Epoch [7/10], Step [150/759], loss: 0.161\n", + "Epoch [7/10], Step [200/759], loss: 0.139\n", + "Epoch [7/10], Step [250/759], loss: 0.152\n", + "Epoch [7/10], Step [300/759], loss: 0.156\n", + "Epoch [7/10], Step [350/759], loss: 0.174\n", + "Epoch [7/10], Step [400/759], loss: 0.217\n", + "Epoch [7/10], Step [450/759], loss: 0.202\n", + "Epoch [7/10], Step [500/759], loss: 0.210\n", + "Epoch [7/10], Step [550/759], loss: 0.203\n", + "Epoch [7/10], Step [600/759], loss: 0.195\n", + "Epoch [7/10], Step [650/759], loss: 0.205\n", + "Epoch [7/10], Step [700/759], loss: 0.168\n", + "Epoch [7/10], Step [750/759], loss: 0.168\n", + "Epoch [8/10], Step [50/759], loss: 0.155\n", + "Epoch [8/10], Step [100/759], loss: 0.133\n", + "Epoch [8/10], Step [150/759], loss: 0.131\n", + "Epoch [8/10], Step [200/759], loss: 0.132\n", + "Epoch [8/10], Step [250/759], loss: 0.155\n", + "Epoch [8/10], Step [300/759], loss: 0.154\n", + "Epoch [8/10], Step [350/759], loss: 0.143\n", + "Epoch [8/10], Step [400/759], loss: 0.147\n", + "Epoch [8/10], Step [450/759], loss: 0.171\n", + "Epoch [8/10], Step [500/759], loss: 0.165\n", + "Epoch [8/10], Step [550/759], loss: 0.147\n", + "Epoch [8/10], Step [600/759], loss: 0.165\n", + "Epoch [8/10], Step [650/759], loss: 0.192\n", + "Epoch [8/10], Step [700/759], loss: 0.176\n", + "Epoch [8/10], Step [750/759], loss: 0.154\n", + "Epoch [9/10], Step [50/759], loss: 0.134\n", + "Epoch [9/10], Step [100/759], loss: 0.111\n", + "Epoch [9/10], Step [150/759], loss: 0.127\n", + "Epoch [9/10], Step [200/759], loss: 0.107\n", + "Epoch [9/10], Step [250/759], loss: 0.120\n", + "Epoch [9/10], Step [300/759], loss: 0.141\n", + "Epoch [9/10], Step [350/759], loss: 0.139\n", + "Epoch [9/10], Step [400/759], loss: 0.141\n", + "Epoch [9/10], Step [450/759], loss: 0.138\n", + "Epoch [9/10], Step [500/759], loss: 0.154\n", + "Epoch [9/10], Step [550/759], loss: 0.150\n", + "Epoch [9/10], Step [600/759], loss: 0.141\n", + "Epoch [9/10], Step [650/759], loss: 0.149\n", + "Epoch [9/10], Step [700/759], loss: 0.183\n", + "Epoch [9/10], Step [750/759], loss: 0.149\n", + "Finished Training\n" + ] + } + ], + "source": [ + "losses = model_train(resnet, trainloader, 10)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 312 + }, + "id": "-AfBKNUmAEKt", + "outputId": "94f3d47f-78f1-4292-ff9a-6e3c9b154afd" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5, 1.0, 'Losses')" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(losses, '-')\n", + "plt.xlabel('epoch')\n", + "plt.ylabel('loss')\n", + "plt.grid()\n", + "plt.title('Losses')" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "G5GZ2ZX-KkbR", + "outputId": "9070ac5d-1cdb-4680-c56e-f11790481f5d" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total accuracy: 83 %\n" + ] + } + ], + "source": [ + "correct = 0\n", + "total = 0\n", + "\n", + "# again no gradients needed\n", + "with torch.no_grad():\n", + " for data in testloader:\n", + " inputs, labels = data\n", + " inputs = inputs.to(device)\n", + " labels = labels.to(device)\n", + " outputs = resnet(inputs)\n", + " _, predictions = torch.max(outputs, 1)\n", + " total += labels.size(0)\n", + " correct += (predictions == labels).sum().item()\n", + " # collect the correct predictions for each class\n", + "print('Total accuracy: %d %%' % (\n", + " 100 * correct / total))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "yubcOux7r31P" + }, + "source": [ + "### Применение модели на видео" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "aBbYF1bPK8C9", + "outputId": "04de95d5-449d-4707-e51f-d80124f44da2" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Collecting youtube_dl\n", + " Downloading youtube_dl-2021.6.6-py2.py3-none-any.whl (1.9 MB)\n", + "\u001b[K |████████████████████████████████| 1.9 MB 5.1 MB/s \n", + "\u001b[?25hInstalling collected packages: youtube-dl\n", + "Successfully installed youtube-dl-2021.6.6\n" + ] + } + ], + "source": [ + "!pip install youtube_dl" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "id": "Pxafjm2JAIiD" + }, + "outputs": [], + "source": [ + "import youtube_dl" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "eHtfWqhtI21n", + "outputId": "b4880628-2804-47f9-9804-551f0f9ca9ad" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[youtube] EK32jo7i5LQ: Downloading webpage\n", + "[download] Destination: Why do prime numbers make these spirals _ Dirichlet’s theorem-EK32jo7i5LQ.webm\n", + "[download] 100% of 22.81MiB in 05:10\n", + "[ffmpeg] Destination: Why do prime numbers make these spirals _ Dirichlet’s theorem-EK32jo7i5LQ.wav\n" + ] + } + ], + "source": [ + "ydl_opts = {\n", + " 'format': 'bestaudio/best',\n", + " 'postprocessors': [{\n", + " 'key': 'FFmpegExtractAudio',\n", + " 'preferredcodec': 'wav',\n", + " 'preferredquality': '256'\n", + " }],\n", + " 'postprocessor_args': [\n", + " '-ar', '16000',\n", + " '-ac', '1' #mono\n", + " \n", + " ],\n", + " 'prefer_ffmpeg': True,\n", + " 'keepvideo': True\n", + " \n", + "}\n", + "with youtube_dl.YoutubeDL(ydl_opts) as ydl:\n", + " ydl.download(['https://www.youtube.com/watch?v=EK32jo7i5LQ'])" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "RvDqwmfZLipw", + "outputId": "b47a1921-d93b-44e9-ad87-04f2da5c503d" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Input File : 'prime_numbers_1.wav'\n", + "Channels : 1\n", + "Sample Rate : 16000\n", + "Precision : 16-bit\n", + "Duration : 00:22:29.52 = 21592247 samples ~ 101214 CDDA sectors\n", + "File Size : 43.2M\n", + "Bit Rate : 256k\n", + "Sample Encoding: 16-bit Signed Integer PCM\n", + "\n" + ] + } + ], + "source": [ + "!sox --info prime_numbers_1.wav" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 328 + }, + "id": "vX19Ht35G1PB", + "outputId": "6d9c95f3-7bc6-4c93-f170-4a6cdc5f4eac" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.7/dist-packages/matplotlib/axes/_axes.py:7592: RuntimeWarning: divide by zero encountered in log10\n", + " Z = 10. * np.log10(spec)\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "show_spectrogram('prime_numbers_mono.wav')" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "id": "-ekZJTe6mhd7" + }, + "outputs": [], + "source": [ + "# словарь с индексами и названиями классов\n", + "classes = ['bed', 'bird', 'cat', 'dog', 'eight', 'five', 'four', \n", + " 'go', 'happy', 'house', 'marvin', 'nine', 'no', 'off', 'on',\n", + " 'left', 'right', 'up', 'down', 'stop', 'one', 'seven',\n", + " 'sheila', 'six', 'three', 'tree', 'two', 'wow', 'yes', 'zero']\n", + "\n", + "classes_dict = {\n", + " ind: word for ind, word in enumerate(classes)\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "hHyqyWrosWI9" + }, + "source": [ + "### Спектрограмма" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "id": "u09cx1VdOR7x" + }, + "outputs": [], + "source": [ + "import joblib as jl\n", + "\n", + "def preprocess_sample(filepath):\n", + " amplitudes, sr = librosa.core.load(filepath)\n", + " spectrogram = librosa.feature.melspectrogram(amplitudes, sr=sr)\n", + " return np.float32(spectrogram)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "id": "3_49CqToOrFV" + }, + "outputs": [], + "source": [ + "spectrogram = preprocess_sample('/content/drive/MyDrive/speech_technology/prime_numbers_mono.wav')" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "4lxhLNSEPRsP", + "outputId": "da67dfac-f751-4506-855d-3b8aad73d06d" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(128, 58119)" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "spectrogram.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "duFBprRNsfx3" + }, + "source": [ + "### Нарезание спектрограммы на кусочки 1.5 секунды и подготовка даталоудера" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "8F1XA30oUNp3", + "outputId": "7387bbfe-d770-46da-f7e0-f3adacc47b5c" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.7/dist-packages/torch/utils/data/dataloader.py:481: UserWarning: This DataLoader will create 4 worker processes in total. Our suggested max number of worker in current system is 2, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary.\n", + " cpuset_checked))\n" + ] + } + ], + "source": [ + "parts = []\n", + "for i in range(0, spectrogram.shape[1]-150, 10):\n", + " parts.append(spectrogram[:, i:i + 150])\n", + "parts = np.float32(parts)\n", + "parts = parts.transpose([0, 2, 1])\n", + "parts = parts[:, None, :, :]\n", + "\n", + "batch_size = 64\n", + "\n", + "tensor_video = torch.Tensor(parts)\n", + "\n", + "video_dataset = TensorDataset(tensor_video)\n", + "\n", + "videoloader = DataLoader(video_dataset, batch_size=batch_size,\n", + " shuffle=False, num_workers=4, drop_last=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "_xJaWb8Vi5jY", + "outputId": "47b76716-cd27-4dd1-c9c6-7ae893a28380" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.7/dist-packages/torch/utils/data/dataloader.py:481: UserWarning: This DataLoader will create 4 worker processes in total. Our suggested max number of worker in current system is 2, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary.\n", + " cpuset_checked))\n", + "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:7: UserWarning: Implicit dimension choice for softmax has been deprecated. Change the call to include dim=X as an argument.\n", + " import sys\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Time: 20 ms \t Predicted word is \"nine\"\n", + "Time: 75 ms \t Predicted word is \"up\"\n", + "Time: 250 ms \t Predicted word is \"happy\"\n", + "Time: 255 ms \t Predicted word is \"happy\"\n", + "Time: 260 ms \t Predicted word is \"happy\"\n", + "Time: 265 ms \t Predicted word is \"happy\"\n", + "Time: 270 ms \t Predicted word is \"happy\"\n", + "Time: 275 ms \t Predicted word is \"happy\"\n", + "Time: 280 ms \t Predicted word is \"happy\"\n", + "Time: 285 ms \t Predicted word is \"happy\"\n", + "Time: 290 ms \t Predicted word is \"happy\"\n", + "Time: 295 ms \t Predicted word is \"happy\"\n", + "Time: 305 ms \t Predicted word is \"happy\"\n", + "Time: 510 ms \t Predicted word is \"bird\"\n", + "Time: 530 ms \t Predicted word is \"bird\"\n", + "Time: 630 ms \t Predicted word is \"go\"\n", + "Time: 945 ms \t Predicted word is \"bird\"\n", + "Time: 1065 ms \t Predicted word is \"dog\"\n", + "Time: 1115 ms \t Predicted word is \"happy\"\n", + "Time: 1175 ms \t Predicted word is \"five\"\n", + "Time: 1180 ms \t Predicted word is \"five\"\n", + "Time: 1200 ms \t Predicted word is \"happy\"\n", + "Time: 1205 ms \t Predicted word is \"up\"\n", + "Time: 1340 ms \t Predicted word is \"happy\"\n", + "Time: 1345 ms \t Predicted word is \"happy\"\n", + "Time: 1390 ms \t Predicted word is \"happy\"\n", + "Time: 1410 ms \t Predicted word is \"happy\"\n", + "Time: 1420 ms \t Predicted word is \"six\"\n", + "Time: 1485 ms \t Predicted word is \"down\"\n", + "Time: 1500 ms \t Predicted word is \"down\"\n", + "Time: 1660 ms \t Predicted word is \"stop\"\n", + "Time: 1785 ms \t Predicted word is \"six\"\n", + "Time: 1800 ms \t Predicted word is \"six\"\n", + "Time: 2130 ms \t Predicted word is \"up\"\n", + "Time: 2180 ms \t Predicted word is \"happy\"\n", + "Time: 2795 ms \t Predicted word is \"five\"\n", + "Time: 2860 ms \t Predicted word is \"up\"\n", + "Time: 2900 ms \t Predicted word is \"happy\"\n", + "Time: 3700 ms \t Predicted word is \"happy\"\n", + "Time: 3705 ms \t Predicted word is \"happy\"\n", + "Time: 3715 ms \t Predicted word is \"happy\"\n", + "Time: 3720 ms \t Predicted word is \"happy\"\n", + "Time: 3725 ms \t Predicted word is \"happy\"\n", + "Time: 3730 ms \t Predicted word is \"happy\"\n", + "Time: 3755 ms \t Predicted word is \"six\"\n", + "Time: 3945 ms \t Predicted word is \"go\"\n", + "Time: 4320 ms \t Predicted word is \"happy\"\n", + "Time: 4325 ms \t Predicted word is \"eight\"\n", + "Time: 4380 ms \t Predicted word is \"bed\"\n", + "Time: 4570 ms \t Predicted word is \"dog\"\n", + "Time: 4605 ms \t Predicted word is \"five\"\n", + "Time: 4620 ms \t Predicted word is \"five\"\n", + "Time: 4750 ms \t Predicted word is \"five\"\n", + "Time: 4780 ms \t Predicted word is \"up\"\n", + "Time: 4880 ms \t Predicted word is \"five\"\n", + "Time: 4895 ms \t Predicted word is \"five\"\n", + "Time: 4910 ms \t Predicted word is \"five\"\n", + "Time: 4920 ms \t Predicted word is \"five\"\n", + "Time: 5050 ms \t Predicted word is \"nine\"\n", + "Time: 5165 ms \t Predicted word is \"down\"\n", + "Time: 5370 ms \t Predicted word is \"five\"\n", + "Time: 5520 ms \t Predicted word is \"down\"\n", + "Time: 5525 ms \t Predicted word is \"go\"\n", + "Time: 5540 ms \t Predicted word is \"go\"\n", + "Time: 5545 ms \t Predicted word is \"go\"\n", + "Time: 5720 ms \t Predicted word is \"up\"\n", + "Time: 5840 ms \t Predicted word is \"happy\"\n", + "Time: 5855 ms \t Predicted word is \"happy\"\n", + "Time: 5860 ms \t Predicted word is \"happy\"\n", + "Time: 5910 ms \t Predicted word is \"happy\"\n", + "Time: 5945 ms \t Predicted word is \"down\"\n", + "Time: 6040 ms \t Predicted word is \"down\"\n", + "Time: 6045 ms \t Predicted word is \"down\"\n", + "Time: 6195 ms \t Predicted word is \"go\"\n", + "Time: 6235 ms \t Predicted word is \"four\"\n", + "Time: 6245 ms \t Predicted word is \"four\"\n", + "Time: 6270 ms \t Predicted word is \"four\"\n", + "Time: 6480 ms \t Predicted word is \"zero\"\n", + "Time: 6545 ms \t Predicted word is \"five\"\n", + "Time: 6550 ms \t Predicted word is \"five\"\n", + "Time: 6565 ms \t Predicted word is \"five\"\n", + "Time: 6570 ms \t Predicted word is \"five\"\n", + "Time: 6575 ms \t Predicted word is \"five\"\n", + "Time: 6580 ms \t Predicted word is \"five\"\n", + "Time: 6660 ms \t Predicted word is \"dog\"\n", + "Time: 6670 ms \t Predicted word is \"dog\"\n", + "Time: 6700 ms \t Predicted word is \"dog\"\n", + "Time: 6905 ms \t Predicted word is \"happy\"\n", + "Time: 6910 ms \t Predicted word is \"up\"\n", + "Time: 7465 ms \t Predicted word is \"six\"\n", + "Time: 7510 ms \t Predicted word is \"right\"\n", + "Time: 7535 ms \t Predicted word is \"six\"\n", + "Time: 7540 ms \t Predicted word is \"six\"\n", + "Time: 7600 ms \t Predicted word is \"go\"\n", + "Time: 7625 ms \t Predicted word is \"go\"\n", + "Time: 7635 ms \t Predicted word is \"go\"\n", + "Time: 7640 ms \t Predicted word is \"go\"\n", + "Time: 7650 ms \t Predicted word is \"go\"\n", + "Time: 7655 ms \t Predicted word is \"go\"\n", + "Time: 7675 ms \t Predicted word is \"zero\"\n", + "Time: 7680 ms \t Predicted word is \"go\"\n", + "Time: 7720 ms \t Predicted word is \"go\"\n", + "Time: 7725 ms \t Predicted word is \"go\"\n", + "Time: 7835 ms \t Predicted word is \"five\"\n", + "Time: 7870 ms \t Predicted word is \"up\"\n", + "Time: 8025 ms \t Predicted word is \"six\"\n", + "Time: 8030 ms \t Predicted word is \"six\"\n", + "Time: 8150 ms \t Predicted word is \"four\"\n", + "Time: 8630 ms \t Predicted word is \"six\"\n", + "Time: 8635 ms \t Predicted word is \"six\"\n", + "Time: 8740 ms \t Predicted word is \"up\"\n", + "Time: 9045 ms \t Predicted word is \"go\"\n", + "Time: 9070 ms \t Predicted word is \"up\"\n", + "Time: 9100 ms \t Predicted word is \"six\"\n", + "Time: 9340 ms \t Predicted word is \"up\"\n", + "Time: 9355 ms \t Predicted word is \"up\"\n", + "Time: 9380 ms \t Predicted word is \"up\"\n", + "Time: 9405 ms \t Predicted word is \"six\"\n", + "Time: 9410 ms \t Predicted word is \"six\"\n", + "Time: 9440 ms \t Predicted word is \"dog\"\n", + "Time: 9450 ms \t Predicted word is \"dog\"\n", + "Time: 9475 ms \t Predicted word is \"dog\"\n", + "Time: 9480 ms \t Predicted word is \"dog\"\n", + "Time: 9770 ms \t Predicted word is \"go\"\n", + "Time: 9845 ms \t Predicted word is \"four\"\n", + "Time: 10035 ms \t Predicted word is \"go\"\n", + "Time: 10060 ms \t Predicted word is \"four\"\n", + "Time: 10205 ms \t Predicted word is \"five\"\n", + "Time: 10225 ms \t Predicted word is \"five\"\n", + "Time: 10235 ms \t Predicted word is \"five\"\n", + "Time: 10240 ms \t Predicted word is \"five\"\n", + "Time: 10245 ms \t Predicted word is \"five\"\n", + "Time: 10250 ms \t Predicted word is \"five\"\n", + "Time: 10530 ms \t Predicted word is \"six\"\n", + "Time: 10645 ms \t Predicted word is \"go\"\n", + "Time: 10730 ms \t Predicted word is \"up\"\n", + "Time: 10900 ms \t Predicted word is \"four\"\n", + "Time: 11265 ms \t Predicted word is \"down\"\n", + "Time: 11270 ms \t Predicted word is \"down\"\n", + "Time: 11275 ms \t Predicted word is \"down\"\n", + "Time: 11300 ms \t Predicted word is \"down\"\n", + "Time: 11385 ms \t Predicted word is \"four\"\n", + "Time: 11390 ms \t Predicted word is \"four\"\n", + "Time: 11445 ms \t Predicted word is \"happy\"\n", + "Time: 11480 ms \t Predicted word is \"happy\"\n", + "Time: 11595 ms \t Predicted word is \"dog\"\n", + "Time: 11630 ms \t Predicted word is \"up\"\n", + "Time: 11650 ms \t Predicted word is \"up\"\n", + "Time: 11670 ms \t Predicted word is \"up\"\n", + "Time: 11935 ms \t Predicted word is \"nine\"\n", + "Time: 11965 ms \t Predicted word is \"left\"\n", + "Time: 12225 ms \t Predicted word is \"four\"\n", + "Time: 12370 ms \t Predicted word is \"zero\"\n", + "Time: 12395 ms \t Predicted word is \"go\"\n", + "Time: 12595 ms \t Predicted word is \"happy\"\n", + "Time: 12600 ms \t Predicted word is \"happy\"\n", + "Time: 12610 ms \t Predicted word is \"happy\"\n", + "Time: 12660 ms \t Predicted word is \"go\"\n", + "Time: 12680 ms \t Predicted word is \"go\"\n", + "Time: 12685 ms \t Predicted word is \"go\"\n", + "Time: 12710 ms \t Predicted word is \"stop\"\n", + "Time: 12770 ms \t Predicted word is \"down\"\n", + "Time: 12920 ms \t Predicted word is \"happy\"\n", + "Time: 12995 ms \t Predicted word is \"four\"\n", + "Time: 13000 ms \t Predicted word is \"four\"\n", + "Time: 13005 ms \t Predicted word is \"four\"\n", + "Time: 13050 ms \t Predicted word is \"six\"\n", + "Time: 13345 ms \t Predicted word is \"four\"\n", + "Time: 13360 ms \t Predicted word is \"four\"\n", + "Time: 13365 ms \t Predicted word is \"four\"\n", + "Time: 13370 ms \t Predicted word is \"four\"\n", + "Time: 13375 ms \t Predicted word is \"four\"\n", + "Time: 13475 ms \t Predicted word is \"up\"\n", + "Time: 13490 ms \t Predicted word is \"off\"\n", + "Time: 13515 ms \t Predicted word is \"up\"\n", + "Time: 13555 ms \t Predicted word is \"up\"\n", + "Time: 13625 ms \t Predicted word is \"up\"\n", + "Time: 14000 ms \t Predicted word is \"dog\"\n", + "Time: 14030 ms \t Predicted word is \"zero\"\n", + "Time: 14100 ms \t Predicted word is \"five\"\n", + "Time: 14155 ms \t Predicted word is \"up\"\n", + "Time: 14165 ms \t Predicted word is \"up\"\n", + "Time: 14170 ms \t Predicted word is \"up\"\n", + "Time: 14185 ms \t Predicted word is \"up\"\n", + "Time: 14210 ms \t Predicted word is \"happy\"\n", + "Time: 14255 ms \t Predicted word is \"two\"\n", + "Time: 14340 ms \t Predicted word is \"dog\"\n", + "Time: 14365 ms \t Predicted word is \"six\"\n", + "Time: 14395 ms \t Predicted word is \"six\"\n", + "Time: 14505 ms \t Predicted word is \"six\"\n", + "Time: 14555 ms \t Predicted word is \"happy\"\n", + "Time: 14630 ms \t Predicted word is \"go\"\n", + "Time: 14870 ms \t Predicted word is \"five\"\n", + "Time: 15135 ms \t Predicted word is \"six\"\n", + "Time: 15200 ms \t Predicted word is \"five\"\n", + "Time: 15350 ms \t Predicted word is \"five\"\n", + "Time: 15410 ms \t Predicted word is \"dog\"\n", + "Time: 15525 ms \t Predicted word is \"on\"\n", + "Time: 15655 ms \t Predicted word is \"five\"\n", + "Time: 15660 ms \t Predicted word is \"five\"\n", + "Time: 16110 ms \t Predicted word is \"up\"\n", + "Time: 16125 ms \t Predicted word is \"up\"\n", + "Time: 16165 ms \t Predicted word is \"five\"\n", + "Time: 16400 ms \t Predicted word is \"go\"\n", + "Time: 16405 ms \t Predicted word is \"go\"\n", + "Time: 16700 ms \t Predicted word is \"dog\"\n", + "Time: 16710 ms \t Predicted word is \"five\"\n", + "Time: 16740 ms \t Predicted word is \"dog\"\n", + "Time: 16745 ms \t Predicted word is \"dog\"\n", + "Time: 16755 ms \t Predicted word is \"dog\"\n", + "Time: 16760 ms \t Predicted word is \"dog\"\n", + "Time: 16845 ms \t Predicted word is \"six\"\n", + "Time: 16955 ms \t Predicted word is \"five\"\n", + "Time: 16965 ms \t Predicted word is \"five\"\n", + "Time: 16970 ms \t Predicted word is \"five\"\n", + "Time: 17155 ms \t Predicted word is \"five\"\n", + "Time: 17160 ms \t Predicted word is \"five\"\n", + "Time: 17165 ms \t Predicted word is \"five\"\n", + "Time: 17170 ms \t Predicted word is \"five\"\n", + "Time: 17175 ms \t Predicted word is \"five\"\n", + "Time: 17180 ms \t Predicted word is \"five\"\n", + "Time: 17185 ms \t Predicted word is \"five\"\n", + "Time: 17190 ms \t Predicted word is \"five\"\n", + "Time: 17195 ms \t Predicted word is \"five\"\n", + "Time: 17200 ms \t Predicted word is \"five\"\n", + "Time: 17205 ms \t Predicted word is \"five\"\n", + "Time: 17370 ms \t Predicted word is \"four\"\n", + "Time: 17765 ms \t Predicted word is \"six\"\n", + "Time: 18095 ms \t Predicted word is \"dog\"\n", + "Time: 18190 ms \t Predicted word is \"dog\"\n", + "Time: 18215 ms \t Predicted word is \"up\"\n", + "Time: 18410 ms \t Predicted word is \"bed\"\n", + "Time: 18435 ms \t Predicted word is \"happy\"\n", + "Time: 18450 ms \t Predicted word is \"happy\"\n", + "Time: 18710 ms \t Predicted word is \"six\"\n", + "Time: 18730 ms \t Predicted word is \"six\"\n", + "Time: 18745 ms \t Predicted word is \"six\"\n", + "Time: 18755 ms \t Predicted word is \"down\"\n", + "Time: 18880 ms \t Predicted word is \"six\"\n", + "Time: 19415 ms \t Predicted word is \"happy\"\n", + "Time: 19420 ms \t Predicted word is \"six\"\n", + "Time: 19600 ms \t Predicted word is \"one\"\n", + "Time: 19605 ms \t Predicted word is \"dog\"\n", + "Time: 19615 ms \t Predicted word is \"up\"\n", + "Time: 19620 ms \t Predicted word is \"up\"\n", + "Time: 19635 ms \t Predicted word is \"up\"\n", + "Time: 19640 ms \t Predicted word is \"up\"\n", + "Time: 19645 ms \t Predicted word is \"up\"\n", + "Time: 19660 ms \t Predicted word is \"up\"\n", + "Time: 19665 ms \t Predicted word is \"up\"\n", + "Time: 19690 ms \t Predicted word is \"happy\"\n", + "Time: 19780 ms \t Predicted word is \"dog\"\n", + "Time: 19820 ms \t Predicted word is \"five\"\n", + "Time: 19845 ms \t Predicted word is \"up\"\n", + "Time: 19860 ms \t Predicted word is \"six\"\n", + "Time: 19865 ms \t Predicted word is \"six\"\n", + "Time: 19880 ms \t Predicted word is \"six\"\n", + "Time: 19935 ms \t Predicted word is \"five\"\n", + "Time: 19970 ms \t Predicted word is \"five\"\n", + "Time: 20085 ms \t Predicted word is \"happy\"\n", + "Time: 20090 ms \t Predicted word is \"happy\"\n", + "Time: 20100 ms \t Predicted word is \"happy\"\n", + "Time: 20115 ms \t Predicted word is \"happy\"\n", + "Time: 20195 ms \t Predicted word is \"happy\"\n", + "Time: 20200 ms \t Predicted word is \"happy\"\n", + "Time: 20285 ms \t Predicted word is \"four\"\n", + "Time: 20345 ms \t Predicted word is \"five\"\n", + "Time: 20385 ms \t Predicted word is \"happy\"\n", + "Time: 20470 ms \t Predicted word is \"go\"\n", + "Time: 20720 ms \t Predicted word is \"no\"\n", + "Time: 20855 ms \t Predicted word is \"up\"\n", + "Time: 20870 ms \t Predicted word is \"up\"\n", + "Time: 20875 ms \t Predicted word is \"up\"\n", + "Time: 20915 ms \t Predicted word is \"up\"\n", + "Time: 20970 ms \t Predicted word is \"up\"\n", + "Time: 21105 ms \t Predicted word is \"happy\"\n", + "Time: 21125 ms \t Predicted word is \"happy\"\n", + "Time: 21130 ms \t Predicted word is \"happy\"\n", + "Time: 21220 ms \t Predicted word is \"happy\"\n", + "Time: 21225 ms \t Predicted word is \"happy\"\n", + "Time: 21395 ms \t Predicted word is \"happy\"\n", + "Time: 21400 ms \t Predicted word is \"happy\"\n", + "Time: 21620 ms \t Predicted word is \"six\"\n", + "Time: 21710 ms \t Predicted word is \"up\"\n", + "Time: 21720 ms \t Predicted word is \"up\"\n", + "Time: 22005 ms \t Predicted word is \"five\"\n", + "Time: 22345 ms \t Predicted word is \"bed\"\n", + "Time: 22355 ms \t Predicted word is \"happy\"\n", + "Time: 22360 ms \t Predicted word is \"happy\"\n", + "Time: 22525 ms \t Predicted word is \"five\"\n", + "Time: 22535 ms \t Predicted word is \"five\"\n", + "Time: 22605 ms \t Predicted word is \"go\"\n", + "Time: 22675 ms \t Predicted word is \"stop\"\n", + "Time: 22770 ms \t Predicted word is \"happy\"\n", + "Time: 22775 ms \t Predicted word is \"happy\"\n", + "Time: 22780 ms \t Predicted word is \"happy\"\n", + "Time: 22885 ms \t Predicted word is \"five\"\n", + "Time: 22910 ms \t Predicted word is \"five\"\n", + "Time: 22920 ms \t Predicted word is \"five\"\n", + "Time: 22965 ms \t Predicted word is \"six\"\n", + "Time: 22980 ms \t Predicted word is \"six\"\n", + "Time: 23125 ms \t Predicted word is \"dog\"\n", + "Time: 23145 ms \t Predicted word is \"dog\"\n", + "Time: 23435 ms \t Predicted word is \"one\"\n", + "Time: 23515 ms \t Predicted word is \"off\"\n", + "Time: 23520 ms \t Predicted word is \"off\"\n", + "Time: 23585 ms \t Predicted word is \"on\"\n", + "Time: 23595 ms \t Predicted word is \"on\"\n", + "Time: 23600 ms \t Predicted word is \"on\"\n", + "Time: 23605 ms \t Predicted word is \"on\"\n", + "Time: 23610 ms \t Predicted word is \"on\"\n", + "Time: 23660 ms \t Predicted word is \"happy\"\n", + "Time: 23850 ms \t Predicted word is \"five\"\n", + "Time: 23855 ms \t Predicted word is \"bird\"\n", + "Time: 24005 ms \t Predicted word is \"happy\"\n", + "Time: 24250 ms \t Predicted word is \"nine\"\n", + "Time: 24365 ms \t Predicted word is \"dog\"\n", + "Time: 24370 ms \t Predicted word is \"dog\"\n", + "Time: 24400 ms \t Predicted word is \"dog\"\n", + "Time: 24535 ms \t Predicted word is \"five\"\n", + "Time: 24540 ms \t Predicted word is \"five\"\n", + "Time: 24555 ms \t Predicted word is \"five\"\n", + "Time: 24560 ms \t Predicted word is \"five\"\n", + "Time: 24570 ms \t Predicted word is \"right\"\n", + "Time: 24590 ms \t Predicted word is \"go\"\n", + "Time: 24605 ms \t Predicted word is \"go\"\n", + "Time: 24610 ms \t Predicted word is \"go\"\n", + "Time: 24615 ms \t Predicted word is \"go\"\n", + "Time: 24905 ms \t Predicted word is \"five\"\n", + "Time: 25040 ms \t Predicted word is \"go\"\n", + "Time: 25060 ms \t Predicted word is \"bird\"\n", + "Time: 25260 ms \t Predicted word is \"go\"\n", + "Time: 25425 ms \t Predicted word is \"up\"\n", + "Time: 25475 ms \t Predicted word is \"happy\"\n", + "Time: 25480 ms \t Predicted word is \"happy\"\n", + "Time: 25525 ms \t Predicted word is \"up\"\n", + "Time: 25575 ms \t Predicted word is \"up\"\n", + "Time: 25635 ms \t Predicted word is \"down\"\n", + "Time: 25675 ms \t Predicted word is \"left\"\n", + "Time: 25690 ms \t Predicted word is \"left\"\n", + "Time: 25710 ms \t Predicted word is \"left\"\n", + "Time: 25780 ms \t Predicted word is \"happy\"\n", + "Time: 25795 ms \t Predicted word is \"happy\"\n", + "Time: 25810 ms \t Predicted word is \"happy\"\n", + "Time: 25815 ms \t Predicted word is \"happy\"\n", + "Time: 25835 ms \t Predicted word is \"six\"\n", + "Time: 25945 ms \t Predicted word is \"five\"\n", + "Time: 25960 ms \t Predicted word is \"five\"\n", + "Time: 26000 ms \t Predicted word is \"happy\"\n", + "Time: 26015 ms \t Predicted word is \"happy\"\n", + "Time: 26060 ms \t Predicted word is \"five\"\n", + "Time: 26195 ms \t Predicted word is \"happy\"\n", + "Time: 26200 ms \t Predicted word is \"happy\"\n", + "Time: 26205 ms \t Predicted word is \"happy\"\n", + "Time: 26210 ms \t Predicted word is \"happy\"\n", + "Time: 26215 ms \t Predicted word is \"happy\"\n", + "Time: 26220 ms \t Predicted word is \"happy\"\n", + "Time: 26225 ms \t Predicted word is \"happy\"\n", + "Time: 26230 ms \t Predicted word is \"happy\"\n", + "Time: 26455 ms \t Predicted word is \"four\"\n", + "Time: 26465 ms \t Predicted word is \"four\"\n", + "Time: 26470 ms \t Predicted word is \"four\"\n", + "Time: 26595 ms \t Predicted word is \"four\"\n", + "Time: 26675 ms \t Predicted word is \"dog\"\n", + "Time: 26680 ms \t Predicted word is \"dog\"\n", + "Time: 26685 ms \t Predicted word is \"five\"\n", + "Time: 26735 ms \t Predicted word is \"four\"\n", + "Time: 26785 ms \t Predicted word is \"go\"\n", + "Time: 26795 ms \t Predicted word is \"go\"\n", + "Time: 26890 ms \t Predicted word is \"go\"\n", + "Time: 26915 ms \t Predicted word is \"dog\"\n", + "Time: 27025 ms \t Predicted word is \"happy\"\n", + "Time: 27220 ms \t Predicted word is \"four\"\n", + "Time: 27325 ms \t Predicted word is \"six\"\n", + "Time: 27865 ms \t Predicted word is \"four\"\n", + "Time: 28230 ms \t Predicted word is \"four\"\n", + "Time: 28240 ms \t Predicted word is \"four\"\n", + "Time: 28255 ms \t Predicted word is \"four\"\n", + "Time: 28400 ms \t Predicted word is \"up\"\n", + "Time: 28420 ms \t Predicted word is \"up\"\n", + "Time: 28445 ms \t Predicted word is \"up\"\n", + "Time: 28450 ms \t Predicted word is \"up\"\n" + ] + } + ], + "source": [ + "global_time = 0\n", + "with torch.no_grad():\n", + " resnet.eval()\n", + " for inputs in videoloader:\n", + " # print(inputs[0].shape)\n", + " inputs = inputs[0].to(device)\n", + " outputs = F.softmax(resnet(inputs)[:, :30])\n", + " _, predicted = torch.max(outputs.data, 1)\n", + " \n", + " for i, pred in enumerate(predicted):\n", + " if outputs[i, pred].item() > 0.9:\n", + " print(f'Time: {global_time} ms \\t Predicted word is \"{classes_dict[pred.item()]}\"')\n", + " global_time += 5" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "xTGRhBr0wHa2" + }, + "source": [ + "### Интересно получилось :)" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "collapsed_sections": [], + "name": "HW2_speech_tech.ipynb\"", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.4" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +}