{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import torch\n", "import numpy as np\n", "from sklearn.model_selection import train_test_split\n", "from torch import FloatTensor\n", "from torch import cuda\n", "import matplotlib.pylab as plt\n", "import time\n", "import math\n", "import random\n", "import pickle\n", "from tqdm import tqdm_notebook as tqdm\n", "random.seed(100)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "class Sigmoid:\n", " def forward(self, x):\n", " self.sigm = torch.sigmoid(x)\n", " return self.sigm\n", " \n", " def backward(self, dz, lr = 0.001):\n", " return dz * torch.mul((1 - self.sigm),self.sigm)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "class Dense:\n", " def __init__(self, in_size, out_size):\n", " self.W = torch.randn(out_size, in_size)\n", " self.b = torch.randn(out_size)\n", " \n", " def forward(self, x):\n", " self.x = x\n", " return torch.mv(self.W, x) + self.b\n", " \n", " def backward(self, dz, lr = 0.001):\n", " local_derivative = self.W\n", " \n", " db = dz * lr\n", " self.b = self.b - db\n", " \n", " dW = torch.ger(dz, self.x) * lr\n", " self.W = self.W - dW\n", " return torch.mv(local_derivative.t(), dz)\n", " \n", " def cuda(self):\n", " self.W.cuda()\n", " self.b.cuda()\n", " " ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "class Softmax:\n", " def forward(self, x):\n", " exps = torch.exp(x)\n", " self.softmax = exps / torch.sum(exps) \n", " return self.softmax\n", " \n", " def backward(self, dz, lr = 0.001):\n", " local_derivative = torch.diag(self.softmax) - torch.ger(self.softmax, self.softmax)\n", " return torch.mv(local_derivative, dz)\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "class ReLu:\n", " \n", " def forward(self, x):\n", " self.x = x\n", " return torch.max(torch.zeros(x.size()[0]), x)\n", " \n", " def backward(self, dz, lr=0.1):\n", " dz[self.x < 0] = 0\n", " return dz" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "class CrossEntropy:\n", " \n", " def forward(self, y_true, y_hat):\n", " self.y_true = y_true\n", " self.y_hat = y_hat\n", " return -torch.sum(y_true * np.log(y_hat))\n", " \n", " def backward(self, dz, lr=0.001):\n", " return dz * -1. * self.y_true / self.y_hat" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "class MSQE:\n", " \n", " def forward(self, y_true, y_hat):\n", " self.y_true = y_true\n", " self.y_hat = y_hat\n", " return torch.sum(torch.pow(y_true - y_hat, 2))\n", " \n", " def backward(self, dz, lr=0.001):\n", " return - 2 * (self.y_true - self.y_hat)" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [], "source": [ "class Net:\n", " \n", " def __init__(self):\n", " self.layers = []\n", " self.layers.append(Dense(784, 10))\n", " self.layers.append(Sigmoid())\n", " self.layers.append(Dense(10, 10))\n", " self.layers.append(Softmax())\n", " \n", " def forward(self, x):\n", " net = x\n", " for i in range(len(self.layers)):\n", " net = self.layers[i].forward(net)\n", " return net\n", " \n", " def backward(self, dz, lr):\n", " \n", " for i in range(len(self.layers)):\n", " dz = self.layers[-(i + 1)].backward(dz, lr)\n", " return dz\n", " \n", " def cuda(self):\n", " for layer in self.layers:\n", " if type(layer) == Dense:\n", " layer.cuda()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Грузим данные" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [], "source": [ "from sklearn.datasets import fetch_openml\n", "data, target = fetch_openml('mnist_784', version=1, return_X_y=True)" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [], "source": [ "data = data/255" ] }, { "cell_type": "code", "execution_count": 61, "metadata": { "scrolled": true }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "3ebd3a393a404c74bbd50888c9e9ada5", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HBox(children=(IntProgress(value=0, max=70000), HTML(value='')))" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "X = []\n", "for i in tqdm(range(int(data.shape[0]))):\n", " X.append(torch.FloatTensor(data[i].astype(float)))\n", "\n", "Y = []\n", "eye = torch.eye(10)\n", "for i in range(data.shape[0]):\n", " Y.append(eye[int(target[i])])\n", " \n", "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.1, stratify=target, shuffle=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Дебажим" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [], "source": [ "def max_index(vec):\n", " size = len(vec)\n", "\n", " max_value = -1\n", " max_index = -1\n", " for i in range(size):\n", " if list(vec)[i] > max_value:\n", " max_value = vec[i]\n", " max_index = i\n", "\n", " return max_index\n", "\n", "def prediction_accuracy(net, test_data=X_test, test_target=Y_test, count = -1):\n", " if count < 0:\n", " count = len(test_data)\n", " \n", " acc = 0\n", " for i in range(count):\n", " if max_index(net.forward(test_data[i])) == max_index(test_target[i]):\n", " acc+=1\n", " \n", " return acc / count\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Обучаем" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "точность до обучения 0.10928571428571429\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "0b0e5a5a46854305838083ddca73d0a1", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HBox(children=(IntProgress(value=0, max=63000), HTML(value='')))" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "точность после обучения 0.8782857142857143\n" ] } ], "source": [ "def train(net, loss, lr, epoch_size, noise_scale=0.1):\n", " L_iter = []\n", " \n", " L_acc = 0\n", " iter_in_epoch = 0\n", " lr_dec = 0.095 * epoch_size / len(X_train)\n", " for i in tqdm(range(len(X_train))):\n", " y_h = net.forward(X_train[i] + (torch.FloatTensor(784).random_(0,100)*0.01 * noise_scale))\n", " L_acc += loss.forward(Y_train[i], y_h)\n", " dz = loss.backward(1, lr)\n", " net.backward(dz, lr)\n", " iter_in_epoch += 1\n", " if iter_in_epoch == epoch_size:\n", " lr -= lr_dec\n", " L_iter.append(L_acc)\n", " iter_in_epoch = 0\n", " L_acc = 0\n", " \n", " return(L_iter)\n", " \n", "net = Net()\n", "loss = CrossEntropy()\n", "print('точность до обучения', prediction_accuracy(net))\n", "noise_scale = 0.0\n", "L_iter = train(net, loss, 0.1, 1000, noise_scale)\n", "print('точность после обучения', prediction_accuracy(net))" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0,0.5,'Cross Entropy Loss')" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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K5a7zks6phUZy6tqmZtVyKdr8lmwZR+19RaJId7cc35bLkyNOCNXlrMnBU4iIiIiIiIip5mRaZFHisc3lbZhPtw3pB33nt+WpduL+ThjN19uKGDWql2E+7lzYecIgr3deOWHHIrKqji7XQh3npdEhwj7TX81xnBhagQDkoJ5+pvNvLVkB1+s38MjF3RgaMewX4VrNXX1LMzexyer8/k2s5DDNXVE+DWEaCM6R9AuzEf1mOxEgZOIiIiIiIiInDCbzdA7oWGFtsdGpDA3q5CPV+/m9YXbqau36BEXyOSru/yiZpi9+Xm48NiIFC7uEsVfP17PxPcyGJAUzOMjUqi3LJZv38+na3bzxfo9HKiowd/ThVFdIhnRObLJVt870ylwEhERERERERG78HB14oLUCC5IjaCorIrC0kqSw32bbdRQarQ/n07sw9tLdvLMt1s499kf8HK22P/1EjxcnDg3OZQRnSPolxjcpCsHigInEREREREREWkCQd5uDim27exkY1zfOIZ2DOefX28iJ6+AR0Z25Jz2oXi5KQZpLvpOi4iIiIiIiMhpJ8zPnWcu7cz8+fMZ2Llp61nJr2n8mIiIiIiIiIiI2JUCJxERERERERERsSsFTiIiIiIiIiIiYlcKnERERERERERExK4UOImIiIiIiIiIiF0pcBIREREREREREbtS4CQiIiIiIiIiInalwElEREREREREROxKgZOIiIiIiIiIiNiVAicREREREREREbErBU4iIiIiIiIiImJXCpxERERERERERMSuFDiJiIiIiIiIiIhdKXASERERERERERG7UuAkIiIiIiIiIiJ2pcBJRERERERERETsSoGTiIiIiIiIiIjYlQInERERERERERGxKwVOIiIiIiIiIiJiVwqcRERERERERETErhQ4iYiIiIiIiIiIXSlwEhERERERERERu1LgJCIiIiIiIiIidmUsy3J0G+zOGLMP2OnodthJEFDk6EaINFJ/lJZCfVFaEvVHaUnUH6WlUF+UlkT90X5aW5YVfCw7npaB0+nEGLPSsqx0R7dDBNQfpeVQX5SWRP1RWhL1R2kp1BelJVF/dAxNqRMREREREREREbtS4CQiIiIiIiIiInalwKnle9XRDRD5GfVHaSnUF6UlUX+UlkT9UVoK9UVpSdQfHUA1nERERERERERExK40wklERERERERE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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize=(20,10))\n", "\n", "ax = fig.gca()\n", "#ax.set_xticks(np.arange(0, 600, 100))\n", "#ax.set_yticks(np.arange(0, 600, ))\n", "plt.plot(L_iter)\n", "plt.grid()\n", "\n", "plt.xlabel(\"Epoch number\")\n", "plt.ylabel(\"Cross Entropy Loss\")\n", "\n", "#plt.savefig(\"Cross_Entropy_Loss.png\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Результат" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "предсказание 1\n", "вероятность предсказания 0.9888917207717896\n", "на самом деле 1\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "r = random.randint(0, len(X_test))\n", "\n", "print('предсказание',max_index(net.forward(X_test[r])))\n", "print('вероятность предсказания', torch.sum(net.forward(X_test[r]) * Y_test[r]))\n", "print('на самом деле', max_index(Y_test[r]))\n", "I = (X_test[r] + (torch.FloatTensor(784).random_(0,100)*0.01 * noise_scale)).numpy()\n", "I = I.reshape((28, 28))\n", "plt.imshow(I, cmap='gray');" ] } ], "metadata": { "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": 2 }