From de6f7f0c4134256a243e46fd2505558f50ae39d5 Mon Sep 17 00:00:00 2001 From: Dmitri Soshnikov Date: Tue, 28 Sep 2021 16:20:46 +0300 Subject: [PATCH] Add OwnFramework --- .../04-OwnFramework/OwnFramework.ipynb | 2790 ++++------------- 3-NeuralNetworks/04-OwnFramework/README.md | 52 + README.md | 2 +- 3 files changed, 685 insertions(+), 2159 deletions(-) create mode 100644 3-NeuralNetworks/04-OwnFramework/README.md diff --git a/3-NeuralNetworks/04-OwnFramework/OwnFramework.ipynb b/3-NeuralNetworks/04-OwnFramework/OwnFramework.ipynb index 48a8ac16..968a6bcf 100644 --- a/3-NeuralNetworks/04-OwnFramework/OwnFramework.ipynb +++ b/3-NeuralNetworks/04-OwnFramework/OwnFramework.ipynb @@ -2,37 +2,32 @@ "cells": [ { "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, "source": [ "# Введение в нейронные сети\n", "\n", "## Эпизод 2: Многослойный персептрон\n", "\n", "Дмитрий Сошников | dmitri@soshnikov.com" - ] + ], + "metadata": { + "slideshow": { + "slide_type": "slide" + } + } }, { "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "notes" - } - }, "source": [ "Данная презентация представляет собой введение в современные нейронные сети на основе Microsoft Cognitive Toolkit (CNTK). Идея однодневного мастер-класса основана на Neural Network Workshop в Microsoft Research Cambridge. Материал и фрагменты кода частично взяты из презентаций [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) и [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/) из Microsoft Research Cambridge. [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop) подготовлен [Дмитрием Сошниковым](http://blog.soshnikov.com), Microsoft Russia." - ] - }, - { - "cell_type": "markdown", + ], "metadata": { "slideshow": { "slide_type": "notes" } - }, + } + }, + { + "cell_type": "markdown", "source": [ "## Обучение с учителем\n", "\n", @@ -43,15 +38,15 @@ " * Известные значения целевой функции $\\mathbf{Y}$ ($y_i$ соответствует вектору свойств $x_i$)\n", " * $\\mathbf{Y} \\in \\mathbb{R}^{n \\times 1}$ (задачи регрессии)\n", " * $\\mathbf{Y} \\in C^{n \\times 1}$, где $y_i \\in C$ (задачи классификации на $|C|$ классов)\n" - ] - }, - { - "cell_type": "markdown", + ], "metadata": { "slideshow": { "slide_type": "notes" } - }, + } + }, + { + "cell_type": "markdown", "source": [ "## Задача\n", "\n", @@ -61,140 +56,148 @@ "\n", "**Необходимо построить:**\n", " * Функцию $f : \\mathbf{X} \\rightarrow \\mathbf{Y}$ который _точно предсказывает_ значение целевой функции на новом наборе входных данных $\\mathbf{X}_{new}$\n" - ] + ], + "metadata": { + "slideshow": { + "slide_type": "notes" + } + } }, { "cell_type": "code", "execution_count": 1, + "source": [ + "import matplotlib.pyplot as plt \r\n", + "from matplotlib import gridspec\r\n", + "from sklearn.datasets import make_classification\r\n", + "import numpy as np" + ], + "outputs": [], "metadata": { "slideshow": { "slide_type": "skip" } - }, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt \n", - "from matplotlib import gridspec\n", - "from sklearn.datasets import make_classification\n", - "import numpy as np" - ] + } }, { "cell_type": "code", "execution_count": 2, + "source": [ + "# pick the seed for reproducability - change it to explore the effects of random variations\r\n", + "np.random.seed(0)\r\n", + "import random" + ], + "outputs": [], "metadata": { "slideshow": { "slide_type": "skip" } - }, - "outputs": [], - "source": [ - "# pick the seed for reproducability - change it to explore the effects of random variations\n", - "np.random.seed(0)\n", - "import random" - ] + } }, { "cell_type": "markdown", + "source": [ + "## Пример\n", + "Рассмотрим пример двухмерной задачи классификации на 2 класса. Примером такой задачи может быть классификация опухоли на 2 типа - доброкачественная и злокачественная, в зависимости от её размера и возраста.\n" + ], "metadata": { "slideshow": { "slide_type": "slide" } - }, - "source": [ - "## Пример\n", - "Рассмотрим пример двухмерной задачи классификации на 2 класса. Примером такой задачи может быть классификация опухоли на 2 типа - доброкачественная и злокачественная, в зависимости от её размера и возраста.\n" - ] + } }, { "cell_type": "code", "execution_count": 3, + "source": [ + "n = 100\r\n", + "X, Y = make_classification(n_samples = n, n_features=2,\r\n", + " n_redundant=0, n_informative=2, flip_y=0.2)\r\n", + "X = X.astype(np.float32)\r\n", + "Y = Y.astype(np.int32)\r\n", + "\r\n", + "# Разбиваем на обучающую и тестовые выборки\r\n", + "train_x, test_x = np.split(X, [n*8//10])\r\n", + "train_labels, test_labels = np.split(Y, [n*8//10])" + ], + "outputs": [], "metadata": { "scrolled": false, "slideshow": { "slide_type": "slide" } - }, - "outputs": [], - "source": [ - "n = 100\n", - "X, Y = make_classification(n_samples = n, n_features=2,\n", - " n_redundant=0, n_informative=2, flip_y=0.2)\n", - "X = X.astype(np.float32)\n", - "Y = Y.astype(np.int32)\n", - "\n", - "# Разбиваем на обучающую и тестовые выборки\n", - "train_x, test_x = np.split(X, [n*8//10])\n", - "train_labels, test_labels = np.split(Y, [n*8//10])" - ] + } }, { "cell_type": "code", "execution_count": 4, + "source": [ + "def plot_dataset(suptitle, features, labels):\r\n", + " # prepare the plot\r\n", + " fig, ax = plt.subplots(1, 1)\r\n", + " #pylab.subplots_adjust(bottom=0.2, wspace=0.4)\r\n", + " fig.suptitle(suptitle, fontsize = 16)\r\n", + " ax.set_xlabel('$x_i[0]$ -- (feature 1)')\r\n", + " ax.set_ylabel('$x_i[1]$ -- (feature 2)')\r\n", + "\r\n", + " colors = ['r' if l else 'b' for l in labels]\r\n", + " ax.scatter(features[:, 0], features[:, 1], marker='o', c=colors, s=100, alpha = 0.5)\r\n", + " fig.show()" + ], + "outputs": [], "metadata": { "scrolled": false, "slideshow": { "slide_type": "skip" } - }, - "outputs": [], - "source": [ - "def plot_dataset(suptitle, features, labels):\n", - " # prepare the plot\n", - " fig, ax = plt.subplots(1, 1)\n", - " #pylab.subplots_adjust(bottom=0.2, wspace=0.4)\n", - " fig.suptitle(suptitle, fontsize = 16)\n", - " ax.set_xlabel('$x_i[0]$ -- (feature 1)')\n", - " ax.set_ylabel('$x_i[1]$ -- (feature 2)')\n", - "\n", - " colors = ['r' if l else 'b' for l in labels]\n", - " ax.scatter(features[:, 0], features[:, 1], marker='o', c=colors, s=100, alpha = 0.5)\n", - " fig.show()" - ] + } }, { "cell_type": "code", "execution_count": 5, - "metadata": { - "scrolled": false, - "slideshow": { - "slide_type": "slide" - } - }, + "source": [ + "plot_dataset('Scatterplot of the training data', train_x, train_labels)" + ], "outputs": [ { - "name": "stderr", "output_type": "stream", + "name": "stderr", "text": [ "C:\\winapp\\Miniconda3\\lib\\site-packages\\ipykernel_launcher.py:11: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n", " # This is added back by InteractiveShellApp.init_path()\n" ] }, { + "output_type": "display_data", "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" - }, - "output_type": "display_data" + } } ], - "source": [ - "plot_dataset('Scatterplot of the training data', train_x, train_labels)" - ] + "metadata": { + "scrolled": false, + "slideshow": { + "slide_type": "slide" + } + } }, { "cell_type": "code", "execution_count": 6, - "metadata": {}, + "source": [ + "print(train_x[:5])\r\n", + "print(train_labels[:5])" + ], "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "[[ 1.3382818 -0.98613256]\n", " [ 0.5128146 0.43299454]\n", @@ -205,18 +208,10 @@ ] } ], - "source": [ - "print(train_x[:5])\n", - "print(train_labels[:5])" - ] + "metadata": {} }, { "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, "source": [ "## Подход\n", "\n", @@ -227,15 +222,15 @@ " * Проверяем качество модели на тестовой выборке\n", "\n", "Результат: $f_{\\theta}$, которая делает предсказания на новых данных: $\\hat{Y} = f_{\\theta}(X_{new})$" - ] - }, - { - "cell_type": "markdown", + ], "metadata": { "slideshow": { "slide_type": "slide" } - }, + } + }, + { + "cell_type": "markdown", "source": [ "## Функции потерь\n", "\n", @@ -247,70 +242,70 @@ "Абсолютная ошибка: $\\mathcal{L}_{abs}(\\theta) = \\sum_{i=1}^n |y_i - f_{\\theta}(x_i)|$\n", "\n", "Среднеквадратичная ошибка: $\\mathcal{L}_{sq}(\\theta) = \\sum_{i=1}^n (y_i - f_{\\theta}(x_i))^2$\n" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "slideshow": { - "slide_type": "skip" - } - }, - "outputs": [], - "source": [ - "# helper function for plotting various loss functions\n", - "def plot_loss_functions(suptitle, functions, ylabels, xlabel):\n", - " fig, ax = plt.subplots(1,len(functions), figsize=(9, 3))\n", - " plt.subplots_adjust(bottom=0.2, wspace=0.4)\n", - " fig.suptitle(suptitle)\n", - " for i, fun in enumerate(functions):\n", - " ax[i].set_xlabel(xlabel)\n", - " if len(ylabels) > i:\n", - " ax[i].set_ylabel(ylabels[i])\n", - " ax[i].plot(x, fun)\n", - " plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 8, + ], "metadata": { "slideshow": { "slide_type": "slide" } - }, + } + }, + { + "cell_type": "code", + "execution_count": 7, + "source": [ + "# helper function for plotting various loss functions\r\n", + "def plot_loss_functions(suptitle, functions, ylabels, xlabel):\r\n", + " fig, ax = plt.subplots(1,len(functions), figsize=(9, 3))\r\n", + " plt.subplots_adjust(bottom=0.2, wspace=0.4)\r\n", + " fig.suptitle(suptitle)\r\n", + " for i, fun in enumerate(functions):\r\n", + " ax[i].set_xlabel(xlabel)\r\n", + " if len(ylabels) > i:\r\n", + " ax[i].set_ylabel(ylabels[i])\r\n", + " ax[i].plot(x, fun)\r\n", + " plt.show()" + ], + "outputs": [], + "metadata": { + "slideshow": { + "slide_type": "skip" + } + } + }, + { + "cell_type": "code", + "execution_count": 8, + "source": [ + "x = np.linspace(-2, 2, 101)\r\n", + "plot_loss_functions(\r\n", + " suptitle = 'Common loss functions for regression',\r\n", + " functions = [np.abs(x), np.power(x, 2)],\r\n", + " ylabels = ['$\\mathcal{L}_{abs}}$ (absolute loss)',\r\n", + " '$\\mathcal{L}_{sq}$ (squared loss)'],\r\n", + " xlabel = '$y - f(x_i)$')" + ], "outputs": [ { + "output_type": "display_data", "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" - }, - "output_type": "display_data" + } } ], - "source": [ - "x = np.linspace(-2, 2, 101)\n", - "plot_loss_functions(\n", - " suptitle = 'Common loss functions for regression',\n", - " functions = [np.abs(x), np.power(x, 2)],\n", - " ylabels = ['$\\mathcal{L}_{abs}}$ (absolute loss)',\n", - " '$\\mathcal{L}_{sq}$ (squared loss)'],\n", - " xlabel = '$y - f(x_i)$')" - ] - }, - { - "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } - }, + } + }, + { + "cell_type": "markdown", "source": [ "## Функции ошибки для классификации\n", "\n", @@ -327,65 +322,65 @@ "**логистическая функция ошибки**\n", "\n", "$\\mathcal{L}_{log}(\\theta) = \\sum_{i=1}^n \\frac{1}{\\log(2)} \\log(1 + e^{-y_i f_{\\theta}(x)})$" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "# define and vectorize zero-one loss\n", - "def zero_one(d):\n", - " if d < 0:\n", - " return 1\n", - " return 0\n", - "\n", - "def logistic_loss(fx):\n", - " # assumes y == 1\n", - " y = 1\n", - " return 1 / np.log(2) * np.log(1 + np.exp(-y * fx))\n", - "\n", - "zero_one_v = np.vectorize(zero_one)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, + ], "metadata": { "slideshow": { "slide_type": "slide" } - }, + } + }, + { + "cell_type": "code", + "execution_count": 9, + "source": [ + "# define and vectorize zero-one loss\r\n", + "def zero_one(d):\r\n", + " if d < 0:\r\n", + " return 1\r\n", + " return 0\r\n", + "\r\n", + "def logistic_loss(fx):\r\n", + " # assumes y == 1\r\n", + " y = 1\r\n", + " return 1 / np.log(2) * np.log(1 + np.exp(-y * fx))\r\n", + "\r\n", + "zero_one_v = np.vectorize(zero_one)" + ], + "outputs": [], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 10, + "source": [ + "plot_loss_functions(suptitle = 'Common loss functions for classification',\r\n", + " functions = [zero_one_v(x), logistic_loss(x)],\r\n", + " ylabels = ['$\\mathcal{L}_{0-1}}$ (0-1 loss)',\r\n", + " '$\\mathcal{L}_{log}$ (logistic loss)'],\r\n", + " xlabel = '$y f(x_i)$')\r\n" + ], "outputs": [ { + "output_type": "display_data", "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" - }, - "output_type": "display_data" + } } ], - "source": [ - "plot_loss_functions(suptitle = 'Common loss functions for classification',\n", - " functions = [zero_one_v(x), logistic_loss(x)],\n", - " ylabels = ['$\\mathcal{L}_{0-1}}$ (0-1 loss)',\n", - " '$\\mathcal{L}_{log}$ (logistic loss)'],\n", - " xlabel = '$y f(x_i)$')\n" - ] - }, - { - "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } - }, + } + }, + { + "cell_type": "markdown", "source": [ "## Строим нейросеть\n", "Рассмотрим решение нашей задачи при помощи простейшей однослойной нейросети такого вида:\n", @@ -396,14 +391,31 @@ "f_\\theta(x) = W\\times x + b\n", "$$\n", "где параметры $$\\theta = $$" - ] + ], + "metadata": { + "slideshow": { + "slide_type": "slide" + } + } }, { "cell_type": "code", "execution_count": 11, - "metadata": {}, + "source": [ + "class Linear:\r\n", + " def __init__(self,nin,nout):\r\n", + " self.W = np.random.normal(0, 1.0/np.sqrt(nin), (nout, nin))\r\n", + " self.b = np.zeros((1,nout))\r\n", + " \r\n", + " def forward(self, x):\r\n", + " return np.dot(x, self.W.T) + self.b\r\n", + " \r\n", + "net = Linear(2,2)\r\n", + "net.forward(train_x[0:5])" + ], "outputs": [ { + "output_type": "execute_result", "data": { "text/plain": [ "array([[ 1.77202116, -0.25384488],\n", @@ -413,31 +425,14 @@ " [-1.23519653, 0.3394973 ]])" ] }, - "execution_count": 11, "metadata": {}, - "output_type": "execute_result" + "execution_count": 11 } ], - "source": [ - "class Linear:\n", - " def __init__(self,nin,nout):\n", - " self.W = np.random.normal(0, 1.0/np.sqrt(nin), (nout, nin))\n", - " self.b = np.zeros((1,nout))\n", - " \n", - " def forward(self, x):\n", - " return np.dot(x, self.W.T) + self.b\n", - " \n", - "net = Linear(2,2)\n", - "net.forward(train_x[0:5])" - ] + "metadata": {} }, { "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, "source": [ "## Переходим к вероятностям\n", "Расширяем нейросетевую модель с помощью функции **softmax**: $\\sigma(\\mathbf{z}_c) = \\frac{e^{z_c}}{\\sum_{j \\in J} e^{z_j}}$ для $c \\in 1 .. |C|$\n", @@ -445,14 +440,30 @@ "\n", "\n", "Можем рассматривать $\\sigma(\\mathbf{z})$ как распределение вероятности на классах $C$: $q = \\sigma(\\mathbf{z}_c) = \\hat{p}(c | x)$\n" - ] + ], + "metadata": { + "slideshow": { + "slide_type": "slide" + } + } }, { "cell_type": "code", "execution_count": 12, - "metadata": {}, + "source": [ + "class Softmax:\r\n", + " def forward(self,z):\r\n", + " zmax = z.max(axis=1,keepdims=True)\r\n", + " expz = np.exp(z-zmax)\r\n", + " Z = expz.sum(axis=1,keepdims=True)\r\n", + " return expz / Z\r\n", + "\r\n", + "softmax = Softmax()\r\n", + "softmax.forward(net.forward(train_x[0:10]))" + ], "outputs": [ { + "output_type": "execute_result", "data": { "text/plain": [ "array([[0.88348621, 0.11651379],\n", @@ -467,43 +478,27 @@ " [0.72746882, 0.27253118]])" ] }, - "execution_count": 12, "metadata": {}, - "output_type": "execute_result" + "execution_count": 12 } ], - "source": [ - "class Softmax:\n", - " def forward(self,z):\n", - " zmax = z.max(axis=1,keepdims=True)\n", - " expz = np.exp(z-zmax)\n", - " Z = expz.sum(axis=1,keepdims=True)\n", - " return expz / Z\n", - "\n", - "softmax = Softmax()\n", - "softmax.forward(net.forward(train_x[0:10]))" - ] + "metadata": {} }, { "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, "source": [ "## Ещё один взгляд на архитектуру сети\n", "\n", "![Архитектура нейросети](https://raw.githubusercontent.com/shwars/NeuroWorkshop/master/images/Cross-Entropy-Loss.PNG)\n" - ] - }, - { - "cell_type": "markdown", + ], "metadata": { "slideshow": { "slide_type": "slide" } - }, + } + }, + { + "cell_type": "markdown", "source": [ "## Cross-Entropy Loss\n", "\n", @@ -519,97 +514,97 @@ " = & ~\\color{red}{-\\sum_{c \\in C} p(c) \\log p(c)} + \\color{blue}{\\sum_{c \\in C} p(c) \\log \\frac{p(c)}{q(c)}} \\\\\n", " = & ~-\\sum_{c \\in C} p(c) \\log q(c)\n", "\\end{align}$\n" - ] + ], + "metadata": { + "slideshow": { + "slide_type": "slide" + } + } }, { "cell_type": "code", "execution_count": 13, + "source": [ + "def plot_cross_ent():\r\n", + " p = np.linspace(0.01, 0.99, 101) # estimated probability p(y|x)\r\n", + " cross_ent_v = np.vectorize(cross_ent)\r\n", + " f3, ax = plt.subplots(1,1, figsize=(8, 3))\r\n", + " l1, = plt.plot(p, cross_ent_v(p, 1), 'r--')\r\n", + " l2, = plt.plot(p, cross_ent_v(p, 0), 'r-')\r\n", + " plt.legend([l1, l2], ['$y = 1$', '$y = 0$'], loc = 'upper center', ncol = 2)\r\n", + " plt.xlabel('$\\hat{p}(y|x)$', size=18)\r\n", + " plt.ylabel('$\\mathcal{L}_{CE}$', size=18)\r\n", + " plt.show()" + ], + "outputs": [], "metadata": { "slideshow": { "slide_type": "skip" } - }, - "outputs": [], - "source": [ - "def plot_cross_ent():\n", - " p = np.linspace(0.01, 0.99, 101) # estimated probability p(y|x)\n", - " cross_ent_v = np.vectorize(cross_ent)\n", - " f3, ax = plt.subplots(1,1, figsize=(8, 3))\n", - " l1, = plt.plot(p, cross_ent_v(p, 1), 'r--')\n", - " l2, = plt.plot(p, cross_ent_v(p, 0), 'r-')\n", - " plt.legend([l1, l2], ['$y = 1$', '$y = 0$'], loc = 'upper center', ncol = 2)\n", - " plt.xlabel('$\\hat{p}(y|x)$', size=18)\n", - " plt.ylabel('$\\mathcal{L}_{CE}$', size=18)\n", - " plt.show()" - ] + } }, { "cell_type": "code", "execution_count": 14, - "metadata": { - "scrolled": true, - "slideshow": { - "slide_type": "slide" - } - }, + "source": [ + "def cross_ent(prediction, ground_truth):\r\n", + " t = 1 if ground_truth > 0.5 else 0\r\n", + " return -t * np.log(prediction) - (1 - t) * np.log(1 - prediction)\r\n", + "plot_cross_ent()" + ], "outputs": [ { + "output_type": "display_data", "data": { - "image/png": "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Th049liYONGvc4iIiFRk3DhfH3tspGEoiZd1/PGwejW88krUkYiISLoaOxZ23x122SXSMJTEyzroINhxR5gwIepIREQkHS1bBm++GXlVOkTfTzz9NGgA776rAV9ERKRizz8Pmzcriaet7t2jjkBERNLV2LE+adYee0QdiarTK3XddXDbbVFHISIi6WTNGvjvf70UHtFQqyUpiVfmww/hgQdAk1+IiEjciy9676U0qEoHJfHKHXecT/T+8cdRRyIiIuli7FjYeWcYMCDqSAAl8codc4xXlWjgFxERAR+ae/x4OPpoqF8/6mgAJfHKtW4N++8Po0Z5K0QREcltEybAt9/6eCJpQkl8Sy6+2IdiXbUq6khERCRqd93lrdJ/8pOoI/mRuphtyUkn+SIiIrmtqAheew3+/Geolz6pUyXxZBQV+WD3IiKSm+6+Gxo3hnPPjTqSUpTEt2blSthvP7jppqgjERGRKHz9NTz5JJx1lrdMTyNK4luz447w85/DP/4BS5dGHY2IiNS2v/0NfvjB20mlGSXxZFxyCaxfDw8+GHUkIiJSm9at8yR+9NFpOaeGkngyunWDI46A++7zszEREckNo0fDkiVw6aVRR1IhJfFkXXYZfP89TJsWdSQiIlIbQvAGbb16waBBUUdTofRpJ5/uDjsMiothp52ijkRERGrDhAlecHvkkbSY7KQiKokny8wTeAg+prqIiGSvDRvgiiugSxc47bSoo6mUknhVXXyxdzlbuTLqSEREpKaMGAGffOJTUjdoEHU0lVISr6ozzvBGDuo3LiKSnb79FoYPh4MP9smw0likSdzM8szsPTMrMrMZZnZ9lPEkpW9f7zd+110axU1EJBvdeCN88w3ceWfaXguPi7okvh4YFELoDfQBjjCzfhHHtHU33eRj5159ddSRiIhIKs2eDX/5C5x9NvTpE3U0WxVpEg/u+9jd+rElRBhScvLz4aqrYMoU+O67qKMREZFUueoqaNjQS+MZIOqSOGZW18w+ApYAL4UQJkcdU1KuugpmzoQmTaKOREREUuG//4WxY+Haa6F166ijSUrkSTyEsCmE0AcoAPYxs55l9zGz88xsiplNWZou45c3agR5ebB2rfclFBGRzPXtt16F3q2bD+6VISJP4nEhhO+A14EjKtg2IoTQN4TQt0WLFrUe2xZdf71PEP/ee1FHIiIi2+rCC322slGjvJCWIaJund7CzJrEbjcCDgU+jTKmKrv2WmjbFk4/HdasiToaERGpqqee8jHShw+HPfeMOpoqibok3gZ4zcymAe/j18SfjzimqtlpJ3j8cfjsM79OLiIimWPhQvjVr6BfP7jmmqijqbJIx04PIUwD9ogyhpQ4+GC/hnLXXV61Pnhw1BGJiMjWbN4MZ53ls1OOHOldhzNM5kWcrm66CZYtgw4doo5ERESScfvt8NJLPl94ly5RR7NNlMRTJS/Pz+TAz+42bkzr8XZFRHLaCy949fmJJ8L550cdzTaL+pp49gkBhg3zrgoh/cetERHJOZ9+6r/TvXvD3/+e9kOrbomSeKqZ+QTyTzzhs9+IiEj6+PZbn9SkYUMYNw622y7qiKplm5O4mWXGyGpR+O1v4eSTvarmhReijkZERMAvcw4bBvPmwZgxUFgYdUTVVp2SePeSd8xsVpn7J1fjtTObGTz6qA+ef8opPsa6iIhEJwQf0OXFF+H+++GAA6KOKCWqk8TLXvBtWeb+Q9V47czXuDGMH+8tHjdujDoaEZHcFQJceSWMGOEDdP3iF1FHlDKpbJ1eNqlnbkuBVMnP91J4vNHEqlWwww7RxiQikmtuvBHuuAMuugj+9Keoo0mp6pTEzcy2lJHUNBsSCfyee7zBW3FxtPGIiOSSu++G//s/OOMM/x3O4JboFalOEq8LfGdmC8xsIpBnZseZWX6KYssuBxwAy5fDoYf6MH8iIlKz/vY3H01z6FB4+GGok30dsqrzF20P9AauA2YBU4F/AF+a2SIgc6aBqQ177eUt1Rct8oQ+Z07UEYmIZK9bboELLoCjj/Yuvxk4pGoytvmvCiFsBj6OLSPB69eBrsBeQGZNBVMbDjgAXnvNx1YfOBBmzdI1chGRVArBG6/9+c9w6qnw2GNQv37UUdWYbU7iZjYIODyE8OO0LyGEAHwSW0ZVP7wstNde8OabMGmSEriISCpt2uTdyB580Gcm++tfs7IKvaTq/HVXADMr2mBmw8ws83vR15Ru3XzmHICJE+Hf/442HhGRTLd6tY+D/uCDXhK/776sT+BQvSS+B/BMJdtaA3+sxmvnhhB8+tKf/hRuvlljrYuIbIsFC/xy5bhx3hr9ppuyrhV6ZaqTxBsB6yrZNgYYWI3Xzg1mMHasDwP429/Cz38O6yo7pCIiUs5778E++8DcufD883DJJVFHVKuqk8Q/xxuwlRNCmA80q8Zr545Gjbzl5I03wqhRMGiQVwuJiMiWjRoFBx7ov6PvvgtHHhl1RLWuOkl8FPAXM8sru8HMWgLfVeO1c4sZXHcdPPOMT43XuHHUEYmIpK+1a+G88+D002Hffb003qNH1FFFojpJ/C/AGmCqmf3UzOoCmFkD4DbgtRTEl1tOOMEHJzCDmTPhhhu8taWIiLjZs2G//eChh7wB28svQ/PmUUcVmW1O4iGEDcAQYCLwBLDazL4AvgX2BX6bkghz1TPPwPDhcPjhPkCMiEiuGz3au+kuWAD/+Y83YMvSQVySVa329yGE9SGEy4EC4AzgbuBUYI8QgsYWrY7hw30603ffhZ494emno45IRCQa33zj0zqfeqr/Hn70EQwZEnVUaSFVneh2A14PIdwTQhgXQlibotfNbWedBUVFsOuu/gF+8smoIxIRqV0vvgi77w7PPusNgN94A9q1izqqtLHVJG5mO5vZr8zsTDOrbP/3gN/Hhl2VVOrSBd56ywcuGDrUH1u2LNqYRERq2ooV8MtfwhFHQJMm3njtuutyvvq8rGRK4hOAvwKPAOdWtEMIYSPwQmXbpZrq1fOB/Bs2hO+/92tCJ54IixdHHZmISOqNGeMjWz70EFx+OUydCnvsEXVUaSmZJL4DsAvwDt43vDKTgfOr8uZm1s7MXjOzT8xshpnlVi/9bdGwIZx/Powf7x/yESNg8+aooxIRqb7iYjj+eK91bNUKJk+G22+HvHI9mSUmmSQ+M4QwL4QwIITw0hb26wz0MbOqTBezEbg8hNAN6AdcaGbdq/D83FO/vo/uNm2an5mefz7sv783/BARyUTr1/usY127+nwSf/6zV5/37Rt1ZGkvmSQ+3sxuSGK/y2Lr7ZJ98xDC4hDCB7Hbq/DZz/KTfX5O23VXePVVePxxaN8edt7ZH9+wIdq4RESq4oUXvOHaNdfAoYfCjBlw1VVZPX1oKm01iYcQRgJ7m9ksM7vBzA43s4rm0BwArAohbNNIbWbWAZ9UZXIF284zsylmNmXp0qXb8vLZyczHW3/6ab+9aBF06uTVTxqDXUTS2YwZcNRRvpjBhAk+l0SnTlFHllGS7WI2FJgK/A5v6PaNmU0ysz+aWXz89PXArG0Jwsy2B54FLg0hrCy7PYQwIoTQN4TQt0WLFtvyFrnhhx/8jPbKK71a6okndL1cRNLLokVw7rnQqxe8/TbcdhtMn+6t0KXKkkriIYQ1IYRTgQOAR4FFwD7AdcB7ZvYGsAxYUNUAYtfQnwWeCCGMqerzpYQOHbxq6uWXoVkzOO00H1d4/fqoIxORXPfdd/D733u32ccfh4sv9pnHrrgCGjSIOrqMVaUOdyGEd/BW6vHq7wNLLB3xIVeTFutX/gjwSQjhzqo8V7bgkEPg/fd9iMKiIm/RDl59laOTBIhIRFatgnvugTvu8ER+8sk+XKqqzVOiOmOnzwshPB5CODuEsAt+Pbuqrar6A6cDg8zso9iisfRSoU4d+NnP4NZb/f60aT5c4aBBPuKRiEhNWrXKW5l37Ogl8IED4cMP4amnlMBTKFXDrhJCKAKureJz3gohWAihVwihT2x5IVUxSQldusDdd/vsaAceCAMG+HCGIUQdmYhkk2++geuv914z11wDe+/t3cXGjYM+faKOLuukLIkDhBCmp/L1JIUaNYJLLoHPP4d774V58+CnP4Vvq3QFRESkYgsXwtVXe/L+wx+85P3ee97qfO+9o44ua6U0iUsGaNwYfv1rb1Dy6qvQtKmXxk86ycdnX7066ghFJJNMnw5nnunV5rffDkcf7Zfvxo5V8q4FSuK5qkEDb7kO3thkwQK46CIoLPRJBoqLo41PRNLX5s1ewj7iCO8q9swzPlnJ7NneoHb33aOOMGcoiYuP9vbOOz5b2sCBcMst3l3t1VejjkxE0snKlX45rmtXn8+7qAj+9CcvBNx7rxqsRUBzuokzg/79fZk3Dx5+GPbbz7c9+aS3ND31VNihosH6RCSrTZsGDzwA//iHz6TYr583Xhs6VH28I6aSuJTXoQPceKM3hgN49lmvKmvbFn71K/joo0jDE5FasGYNjBzpEyz17g2PPuozjE2eDO++C8OGKYGnASVx2bp//cu/tEOHwmOP+expv/511FGJSKqF4HN3X3CBn7SfcQYsXw533unDpY4cCfvsE3WUUoKq02XrzLz6rF8//zI/8YRfEwNvAHfttT4Ry6BBULdutLGKSNUtWeKXzR5/3Gva8vLghBPgnHN8XAmzqCOUSiiJS9U0bVq6FD59Ojz/PIwaBfn5Pl77z38O3TUtvEhaW7fOv7sjR3pL840bYa+9vKvpqadCkyZRRyhJsJBhI3b17ds3TJkyJeowpKR162D8eD+LnzjRH/vqK2je3Oc317zAIulh0yZ47TUvdT/7rLc2b9s2cfKtuRXSkplNDSH0rWibSuJSfXl5cOKJvnz9tU8v2Ly5bxsyxGdRO/lkr55r1SraWEVyzebN3qbl6ae9P/dXX3kvk6FDvXHaIYfoMlgGU8M2Sa1WrXw4V/BGMgcf7A1jLrrIz/gPOQSeey7aGEWyXTxx/+Y3PgzqAQfAiBHebfSZZ/xk++9/h8MPVwLPcEriUnPM4Le/9SlQP/44MRLcnDm+fcUKHyBCo8OJVN/GjV5VftFF0K6ddw277z7Yc09vs7J0KYwZ4zVi8e6jkvF0TVxqVwh+Xa5ePR9b+fjj/fG+feG443zp3l2tYUWSsWYNvPSSf5fGj/dar0aNfDjUoUN9HPOddoo6SqmmLV0TVxKXaM2aBf/+t09TOGmSP/bZZz516tKl3kJWDeNEEhYv9lbl48fDyy/D2rX+PTnqKD8JPvJI2G67qKOUFFISl8yweDG88oq3lAXv5vKf/3ip4qijfN2yZbQxitS2zZt9AJYXXvDkHf/9a98efvITT9wDB+pkN4updbpkhjZtEgkcfLSoxo09kf/zn/7YySfDU0/57RBU7S7ZadkyryafONH7cC9dmhh06aabPHn36KHPvyiJSxobPNiXzZt9tqQXXkgMQLFhA+y2m19LHzzYW9m2axdtvCLbasMGH5P8xRd9mTLFT1KbNfMaqCFD/DMe77opEqMkLumvTh0fr32PPRKPrVrl3dcmTvQuM+BJ/dZb4ZhjoolTJFkhwCef+DXtl16C11/32cHq1EnMEDZ4sI+gpi5gsgVK4pKZmjaFRx7xH8MZM/yH8KWXfG508K4211zj/dIHDfIpVtWtRqI0f763+Xj1VV8WL/bHO3f2y0iHHeYnpvHPsEgSlMQls5lBz56+XHZZ4vF4N7bbboObb/YpE/fd10etatMmungldyxY4CeTr7/u63nz/PFWrfzEctAgP8ns2DHKKCXDKYlLdjr0UF9WrYI33/Qf0ffegxYtfPtVV3mXtoEDfZam/faD7bePNmbJXCHA55/DG2/A//7nSzxpN23qn7Hf/MZL2mqQJimkLmaSm+6910ex+uADL7XXrev9a8eP9+2rV6uvrVRu0yafwe/NN315661E9Xjz5n5yGD9B7NXLr3WLbKO07WJmZo8CRwNLQgg9o4xFcszFF/uyahW8847/CDdokNjevbvf79/fl/33h27d9GOcq1au9Nbjb7/ty6RJ3hANvFfEwQfDgAGeuLt1U0lbak2kJXEzGwh8D4xMNomrJC41btMmuPPOxA/2smX++MUXwz33+PZXXoF99tGcy9lo82YfNXDSJJ9E5N13fez/EPwkbvfdEyd2AwZAYWHUEUuWS9uSeAjhDTPrEGUMIuXUrQtXXulLCDB7tv+Q77abb58xw7v/AHTt6l2C9t3XB+DIz48ubtk2S5fC++97STu+fPedb9tpJ///nnCCt5vYd1/Yccdo4xUpQQ3bRLbEDHbd1Ze4zp29f++kSb48/zw89pgPg5mf7wnhiSdg77196dxZ1fDp4vvvvR3E++/7gCqTJ8MXX/i2OnW8l8OJJyZOzHQJRdJc5A3bYiXx57dUnW5m5wHnARQWFu41f/782glOJBkheEvkVq18mNjHHoMLLvCJKcBLc337ekO61q398bw8XTetaWvW+Eh/U6b42ONTpvgAK5s3+/Z27TxR77OPL3vuCTvsEG3MIhVI6wlQkkniJemauGSEjRu92v39932ZNs27HTVoAJdeCiNHetIouXTposS+rVat8oT9wQeesD/4wBP2pk2+vWVLP5GK14707esnXSIZIG2viYtkrXr1oHdvX37xi9LbBg3y0vjUqd5Q7ocffACaRYt8+6OP+nqPPbyVfMOGtRt7uvv6a/joI/jww8QyZ47XiIAn57328tm9+vb12/n5OkGSrBR1F7PRwEFAczMrBoaHEB6JMiaRGnfMMYnx3X/4AWbO9MQUd++9XqoEPxno1g2GDoXhw/2x777LjVbxGzZ4K/GiotLLV18l9unQwU92Tj/d13vtpRH5JKdE3Tp9WJTvLxK5Bg2gT5/Sj33wgZcsi4q8xFlU5Nd3wa/nFhb6tfdevRJL//6wyy61H38qhOAnMdOn+2WHadP89syZsH6979OggddKHHGEH68+ffzv1jjjkuMivyZeVbomLjlt/Xq4/35P7NOn+3X39evhd7+DP/4RVqyAc89NjCffs6cn93SZCWvFCo/54499mT7d1/G++OAl6fjJSe/evu7aFerXjy5ukQjpmrhItmjYsPRELxs3eqk9PkTs4sVekv/XvxLXiPPy4PHH4aSTYMkS7xbXo4dXRddUcl+1ykvSM2aUXoqLE/tst52fZBx3nA+g0rOnJ2zNmS2SNCVxkUxWr56XUuO6dvWkvnq1t86Ol3i7d/ft//ufJ3Pw5N61q2+7/nrvz75mjZd4ky31Ll/u7xNfZs70ZcGCxD7x9znwwNI1BIWF6oMtUk1K4iLZaLvtvGV23zI1cEce6aPPzZiRSLpvv50okT/4oM/w1rmzN6jr2tVHquvXz/vCf/IJfPqpL5984iX7uEaN/DkHHugnBt26eYm/U6f0qc4XyTJK4iK5ZPvtPSH361d+26pV3up9yBCYNctHpfv3v8vvV6+eV3l36uSt7Pv1825z7durZC1Sy5TERXLJ+vU+7/Xs2d59q+QSn0oTPBl37AgHHOCjzMWHIP3f/+A///EkHx929rnnEl3kbr/dxyKPD1XbpYv321YfbZEaoSQukm1++MGrvmfP9uvj8fVnn8H8+YlhR8FL1LvuCocf7tXm8aVz54oHmRk4EH7/e280t2yZJ/Nvv01sf+cdH0t+w4bEYwMGwBtv+O0HHvBq986dPcG3aKEEL1INSuIimWjNGi9Rz53rCTq+njOnfKLecUdPmPvuC6edlighd+kCTZtu2/ubeQJu0aL042PGeIv5+fP95GH27NLjkQ8fXvo6+g47+Ih2d97p9594AgoKvFtc27aqnhfZCvUTF0lHIXi19OefJ5L13LmJ2/EhWuOaNEmUbjt39iQYT9TNm6dPabdkLUH8xKN3bzjnHD8xiXeVA2/V3rGjjzV/3nleun/xRf/bOnTwEr1IDlA/cZF0tHq1J7QvvvDl889Lr7//vvT++fmewAYP9kZlu+ySSNjbWqKubQ0alJ/aNS4vz//2kjULc+d6YzzwY/WTnyT2z8/3JH/ttd4Yb+VKHwSnY0eV4iVnKImL1JR16+DLLxOJuuy6ZLUy+FCqnTr5MmiQJ+f4/VwoecYb03XsCIcdVn57u3bePS5eIxE/2Ykn6ylT4JBD/HaDBt5avkMHuOkm72q3ZInv36GDz2qWLrUTItWgJC6yrVav9iQ9f74n5rLrkq29wQdQKSz0JHXMMYmEFV+UWLYsL6/y7nHgE6BMnJio2YifMMX7qE+YAGeemXiteJL/29/8+M+b55cp2rf3oV9VkpcMoCQuUpF46+v58xOJuuy65HjfkEjS7dv7RB0dO3qSiC9t22rQk5q0885+qaEygwfD+PGerOPL/PmJGo5Ro7zlPfj/sl07/1+OGeNtDoqKvJ1CYaFvy/aaEckISuKSm1av9qFBFyzwpFx2/eWXXh1eUuPG/qNeWOhTXsZLcu3bJ0pvStLpq3VrOProyrefdZb/X0vWqBQXJ1rX338/jBiR2L9lS7/U8c47XoPy8sve3a5dO19at9bnQWqcWqdL9lm7FhYu9IRcXJxI1iWXkn2bwX+E27RJlLIKC0sv7dt74zFVd+euRYu8VX38JG/+fD/RGznStw8Z4lX2cfXqebe+t97y+48+6iePBQWJRN+ihartZavUOl2yx6pVnpgXLvR1Rcvy5eWf17RpIjn375/4EY0n7fx8bziTFtEAAA50SURBVAwlUpm2bX2pzJNPlq/VKVnlft99PsNcSQMH+ih4AFde6ev8fE/0BQV+SaZVq9T+HZJVlMQlPWzc6K2HFy4svSxalEjYCxd6Ei+rWbNEUt5/f/8RbNcu8UNYUOBV4SI1qUkTX3r1qnj7++97O4qStUMluwa+9ppPTFPyMs4pp8Do0X570CDYaSf/fLdt6+u99vIZ4SRnKYlLzdq82UvGixZ5a+1FixJLPEkvWgRffVV6lDHw6sg2bfzHqkcPHxq0oKB0SaVtW29pLJLu6tTx6+gtW8Kee5bfPmWKN6j85ptErVKzZr5twwavKZozx0vu8ctBV1wBt93mYwq0bp1I8PHl2GN9/PsNG7x2oE0bndBmGSVx2TabN3tL3cWLSy8lk3X8sZLjaMc1a5YoTey+u69LljDy8/3HTtcLJZeY+XejWTMfyS6ufn3vPhe3Zo1/x+LV9Rs3wrnn+onx4sU+Mc3ChV4jdcABnvzjc8o3aeLfszZt4Jpr4NBD/bv86quJx1u3TgyyI2lNSVxKW7fOS8WLF/s6fjt+P377669h06byz995Z/8RaNvWJ9Jo0yZRmo6XDlq3VulZpDoaN/bR+uKaNIG77iq9TwiJ72jLlvD3vyeSfPxEO779o4+86r6k7bf37nWHHebbH3ss8X1u3drXXbrouxwxJfFcsHGjn2nHk/LXX1d8e/FiWLGi/PPj1YDxL26vXokvc3xRchZJL2Z+SQq8ZB8f6KYiBxwA06eXr1nr0MG3z5kDjzxSfijgKVP8uvzo0T4NbevWiaVVKzjjDL+Ov3Kln1TsuKN6eKSYknim2rDBG4J9/fXWl2XL/AtU1g47+BetTRuv0j7ssMT9+Nl269beDaaePioiWatRI28gV1kjuRNO8OX770uf9MfHwN9+e/+tWLzYS+3xmrqTT/YkfscdcMMNfpLfqpUvrVt78m/c2Kv/v/wysa1VK69dUMLfKvUTTxch+BcknpiXLEks8fsl1998U/HrNGpU+kw4/mWpaF1yxigRkVSJN2ht1sxr8iZP9v7y8dq/eOHi/fd9+y9+4SX9knbayRvwmflUtdOne41gq1a+zs+Hgw9OvF8Wt59J637iZnYEcA9QF3g4hHBLxCGlztq1Xo29ZEn5dUXL+vUVv06TJokPbvfu/sGNJ+j4hzq+qDGKiEStTp3Sc83vu68vlbn1VrjkktI1iOvXJ0riX3wBr7zij//wgz/WubMPvgM+pO7UqYnW/y1bQp8+8Lvf+fbXXvPXatnS42raNGtG04u0JG5mdYHPgMOAYuB9YFgIYWZlz4msJB6Cj7a0dGnyS9nrR3ENGyY+aC1aJJJx2futWvl9DUIiIuK/wytWeKFn7dpEC/4HH/SSerymculSr+ofO9a3d+0Ks2YlXqdOHTj+ePjXv/z+hRf6ukWLxLLbbonX37Qp0qSfziXxfYA5IYTPAczsKeBYoNIknlLxkvGyZYklfr/kOn677FjacQ0blv7nd+ni63hSLpmgW7Twa9G61iMiUjVmiUF1Sjr//C0/b8wYv15fska0Y8fE9smTvbRf8jLlGWd4i/wQvIazUSP//W7e3NdDh8Lpp3uCf+IJf7x580QX2VoSdRLPBxaUuF8MbKHOJcX69Ck/XSR4C8r4P6ttWz8bi9+P/wNLLkrKIiLpq3v3RD/5isRrdzdu9Gv5S5cm+uBv2uT96UsW7L74IpE7vv3WE37cMcfAuHE183dUIOokXlHmK1e/b2bnAecBFBYWpu7d77gjce0mnqCbN1f1tYhILqpXL9G+qORjw4dX/pydd/YuePEkX7aWoIZFncSLgXYl7hcAi8ruFEIYAYwAvyaesncfNixlLyUiIjmobl3YZRdfIhB1m/z3gS5m1tHMGgCnAM9FHJOIiEhGiLQkHkLYaGYXAS/iXcweDSHMiDImERGRTBF1dTohhBeAF6KOQ0REJNNEXZ0uIiIi20hJXEREJENl3NjpZrYUmF+Nl2gOLEtROLlOxzI1dBxTR8cydXQsU6e6x7J9CKFFRRsyLolXl5lNqWz4OqkaHcvU0HFMHR3L1NGxTJ2aPJaqThcREclQSuIiIiIZKheT+IioA8giOpapoeOYOjqWqaNjmTo1dixz7pq4iIhItsjFkriIiEhWyMokbmZHmNksM5tjZtdUsL2hmT0d2z7ZzDrUfpSZIYlj+Rszm2lm08zsFTNrH0WcmWBrx7LEfieYWTAztQyuRDLH0sxOin02Z5jZk7UdY6ZI4jteaGavmdmHse/5kCjiTHdm9qiZLTGzjyvZbmZ2b+w4TzOzPVPyxiGErFrwMdjnAp2ABkAR0L3MPhcAD8RunwI8HXXc6bgkeSwPBhrHbv9Kx3Lbj2Vsvx2AN4BJQN+o407HJcnPZRfgQ2Dn2P2WUcedjkuSx3IE8KvY7e7AvKjjTscFGAjsCXxcyfYhwAR8Cu5+wORUvG82lsT3AeaEED4PIfwAPAUcW2afY4HHY7f/BRxiZhXNbZ7rtnosQwivhRDWxO5OwqeTlfKS+VwC/BG4FVhXm8FlmGSO5bnAfSGEbwFCCEtqOcZMkcyxDMCOsds7UcF00QIhhDeAb7awy7HAyOAmAU3MrE113zcbk3g+sKDE/eLYYxXuE0LYCKwAmtVKdJklmWNZ0jn4maaUt9VjaWZ7AO1CCM/XZmAZKJnP5a7Armb2tplNMrMjai26zJLMsfwDcJqZFeOTVf26dkLLOlX9PU1K5LOY1YCKStRlm+Ans49U4TiZ2WlAX+DAGo0oc23xWJpZHeAu4MzaCiiDJfO5rIdXqR+E1w69aWY9Qwjf1XBsmSaZYzkMeCyEcIeZ7Qf8I3YsN9d8eFmlRvJONpbEi4F2Je4XUL7658d9zKweXkW0pWqQXJXMscTMDgWuA44JIayvpdgyzdaO5Q5AT+B1M5uHXzN7To3bKpTsd3xcCGFDCOELYBae1KW0ZI7lOcA/AUII7wJ5+FjgUjVJ/Z5WVTYm8feBLmbW0cwa4A3Xniuzz3PAGbHbJwCvhljLAyllq8cyVgX8IJ7Add2xcls8liGEFSGE5iGEDiGEDnj7gmNCCFOiCTetJfMdH4s3usTMmuPV65/XapSZIZlj+SVwCICZdcOT+NJajTI7PAf8PNZKvR+wIoSwuLovmnXV6SGEjWZ2EfAi3vLy0RDCDDO7AZgSQngOeASvEpqDl8BPiS7i9JXksbwN2B54JtY28MsQwjGRBZ2mkjyWkoQkj+WLwOFmNhPYBFwZQlgeXdTpKcljeTnwkJldhlf/nqlCT3lmNhq/fNM81n5gOFAfIITwAN6eYAgwB1gDnJWS99X/QkREJDNlY3W6iIhITlASFxERyVBK4iIiIhlKSVxERCRDKYmLiIhkKCVxERGRDKUkLpKFzGw3M/uDme0WdSwiUnPUT1wky8Rm5HsT6IVPLTlQg3OIZCeVxEWyzzlAB6AP0JHEEMMikmWUxEWySGyc8JuBs0IInwNnA7eaWdMK9u1pZhvN7LBqvN/rZvb6Nj73ODP7wcw0MYnINlJ1ukiOMrP/Ag1DCNs8fWw8gYcQDtrG508F5ocQfrqtMYjkMpXERXJQbF7ow4A7Iw7lHuB4M+sRcRwiGUlJXCQ3XQAsx2dWitIYfEanX0Ych0hGUhIXyRJmdr2ZBTMbZGajzexrM1tjZu+Z2cAS+9UDjgNeCiFsKPMaD8Reo20Fr79b7Br2PVuJo5GZFZvZl2bWsMy2h81sk5mdAhBC+B5vSX/itv/lIrlLSVwke/TB585+CmgE/B6vLu8OTDCzNrH99sLngH+vgtd4N7bep4JtdwErgT9sKYgQwlp8LuV2eIkfADO7GW85/+sQwlNl3rOVmXXd0uuKSHlK4iLZow9QF7glhHBcCGFECOF3wEVAY+Ck2H7dY+u5FbzGpNi6VBI3s6OAI4H/CyF8m0QsjwEzgGvNbHszuxS4BhgeQri/zL7xOHRdXKSKlMRFsoCZ7QwUAm+FEMo2Vnsltu4QW7eIrb8p+zohhFmxx39M4mZWHy/Rfww8mEw8IYRNeNJuAYyNPf8vIYQbKth9eWzdMpnXFpGEelEHICIpsUds/XAF2+In69/H1vF+pVbJa00C+puZxUZ6uwTYFTg0lpyTEkJ43sw+AA7Bq/gvqWTXeBzq7ypSRSqJi2SHPrH1lAq27RtbfxhbL42tyw0AEzMJ2AnYzcxa4tfWx4YQXqlk/wqZ2Ukl4lq1haFf43EsrWS7iFRCJXGR7BBPlhsr2PYbvIr8v7H7H8fWlY2UVrJx20CgIXB5VYIxs8OBfwD/BjYAZ5vZXSGETyrYvXOZuEQkSSqJi2SHeHV6qdHXzOwcvCR+Y6w7F3iJfCXQr5LXmgxsxluSnwXcHRvCNSlmti/e//tt4GfA72Kvd3MlT+kHfB27Hi8iVaCSuEiGi/XF7oon57vMrD0wDzgIGAb8E7g7vn8IYZOZjQGONbOGIYT1JV8vhLDKzGbipfCvgD9VIZZuwH+Az4DjYq8918weAX5pZv1DCG+X2H97YADwaJX/cBFRSVwkC/TET8jvBK4GTgX+ipfOLwOGVXA9+m/AzsDRlbxmvA/5tSGEVckEYWaFeJX9CuDIEMLKEptvANYCt5Z52lC8+1tSrd5FpDRNgCKS4WJV5g8DvUMI06rwvInAdiGEAWUerw98Sqyr2ZbmItcEKCLRUklcJPPtgTce+7SKz7sc2C/WCK2kK/B5yH+9pQReXWZ2HLA7XnsgIttA18RFMl8fYFYI4YeqPCmEMIPYb0BsvvHBQC/gSuDOEMKkLTy92kIIY4EGNfkeItlOSVwkg5mZ4Yn3+Wq+1GDgSWAJPkb6NdV8PRGpBbomLiIikqF0TVxERCRDKYmLiIhkKCVxERGRDKUkLiIikqGUxEVERDKUkriIiEiGUhIXERHJUEriIiIiGUpJXEREJEP9P5VmBCAoNxpqAAAAAElFTkSuQmCC\n", + "image/png": "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Th049liYONGvc4iIiFRk3DhfH3tspGEoiZd1/PGwejW88krUkYiISLoaOxZ23x122SXSMJTEyzroINhxR5gwIepIREQkHS1bBm++GXlVOkTfTzz9NGgA776rAV9ERKRizz8Pmzcriaet7t2jjkBERNLV2LE+adYee0QdiarTK3XddXDbbVFHISIi6WTNGvjvf70UHtFQqyUpiVfmww/hgQdAk1+IiEjciy9676U0qEoHJfHKHXecT/T+8cdRRyIiIuli7FjYeWcYMCDqSAAl8codc4xXlWjgFxERAR+ae/x4OPpoqF8/6mgAJfHKtW4N++8Po0Z5K0QREcltEybAt9/6eCJpQkl8Sy6+2IdiXbUq6khERCRqd93lrdJ/8pOoI/mRuphtyUkn+SIiIrmtqAheew3+/Geolz6pUyXxZBQV+WD3IiKSm+6+Gxo3hnPPjTqSUpTEt2blSthvP7jppqgjERGRKHz9NTz5JJx1lrdMTyNK4luz447w85/DP/4BS5dGHY2IiNS2v/0NfvjB20mlGSXxZFxyCaxfDw8+GHUkIiJSm9at8yR+9NFpOaeGkngyunWDI46A++7zszEREckNo0fDkiVw6aVRR1IhJfFkXXYZfP89TJsWdSQiIlIbQvAGbb16waBBUUdTofRpJ5/uDjsMiothp52ijkRERGrDhAlecHvkkbSY7KQiKokny8wTeAg+prqIiGSvDRvgiiugSxc47bSoo6mUknhVXXyxdzlbuTLqSEREpKaMGAGffOJTUjdoEHU0lVISr6ozzvBGDuo3LiKSnb79FoYPh4MP9smw0likSdzM8szsPTMrMrMZZnZ9lPEkpW9f7zd+110axU1EJBvdeCN88w3ceWfaXguPi7okvh4YFELoDfQBjjCzfhHHtHU33eRj5159ddSRiIhIKs2eDX/5C5x9NvTpE3U0WxVpEg/u+9jd+rElRBhScvLz4aqrYMoU+O67qKMREZFUueoqaNjQS+MZIOqSOGZW18w+ApYAL4UQJkcdU1KuugpmzoQmTaKOREREUuG//4WxY+Haa6F166ijSUrkSTyEsCmE0AcoAPYxs55l9zGz88xsiplNWZou45c3agR5ebB2rfclFBGRzPXtt16F3q2bD+6VISJP4nEhhO+A14EjKtg2IoTQN4TQt0WLFrUe2xZdf71PEP/ee1FHIiIi2+rC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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" - }, - "output_type": "display_data" + } } ], - "source": [ - "def cross_ent(prediction, ground_truth):\n", - " t = 1 if ground_truth > 0.5 else 0\n", - " return -t * np.log(prediction) - (1 - t) * np.log(1 - prediction)\n", - "plot_cross_ent()" - ] + "metadata": { + "scrolled": true, + "slideshow": { + "slide_type": "slide" + } + } }, { "cell_type": "code", "execution_count": 15, - "metadata": {}, + "source": [ + "class CrossEntropyLoss:\r\n", + " def forward(self,p,y):\r\n", + " self.p = p\r\n", + " self.y = y\r\n", + " p_of_y = p[np.arange(len(y)), y]\r\n", + " log_prob = np.log(p_of_y)\r\n", + " return -log_prob.mean()\r\n", + "\r\n", + "cross_ent_loss = CrossEntropyLoss()\r\n", + "p = softmax.forward(net.forward(train_x[0:10]))\r\n", + "cross_ent_loss.forward(p,train_labels[0:10])" + ], "outputs": [ { + "output_type": "execute_result", "data": { "text/plain": [ "1.429664938969559" ] }, - "execution_count": 15, "metadata": {}, - "output_type": "execute_result" + "execution_count": 15 } ], - "source": [ - "class CrossEntropyLoss:\n", - " def forward(self,p,y):\n", - " self.p = p\n", - " self.y = y\n", - " p_of_y = p[np.arange(len(y)), y]\n", - " log_prob = np.log(p_of_y)\n", - " return -log_prob.mean()\n", - "\n", - "cross_ent_loss = CrossEntropyLoss()\n", - "p = softmax.forward(net.forward(train_x[0:10]))\n", - "cross_ent_loss.forward(p,train_labels[0:10])" - ] + "metadata": {} }, { "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, "source": [ "## Задача минимизации\n", "Описав нейронную сеть как модель $f_\\theta$ и функцию ошибки $\\mathcal{L}(Y,f_\\theta(X))$, можем рассмотреть $\\mathcal{L}$ как функцию $\\theta$ на всем множестве обучающей выборки $\\mathcal{L}(\\theta) = \\mathcal{L}(Y,f_\\theta(X))$\n", @@ -620,15 +615,15 @@ "$$\n", "\n", "Минимизацию можно осуществлять разными методами, например, стохастическим градиентным спуском (stochastic gradient descent, SGD)" - ] - }, - { - "cell_type": "markdown", + ], "metadata": { "slideshow": { "slide_type": "slide" } - }, + } + }, + { + "cell_type": "markdown", "source": [ "## Реализация нейронных сетей\n", "\n", @@ -638,48 +633,48 @@ " - Tensorflow\n", " - Chainer\n", " - [Microsoft Cognitive Toolkit](http://cntk.ai)" - ] - }, - { - "cell_type": "markdown", + ], "metadata": { "slideshow": { "slide_type": "slide" } - }, + } + }, + { + "cell_type": "markdown", "source": [ "## Вычислительный граф\n", "\n", "\n" - ] + ], + "metadata": { + "slideshow": { + "slide_type": "slide" + } + } }, { "cell_type": "code", "execution_count": 16, - "metadata": {}, + "source": [ + "z = net.forward(train_x[0:10])\r\n", + "p = softmax.forward(z)\r\n", + "loss = cross_ent_loss.forward(p,train_labels[0:10])\r\n", + "print(loss)" + ], "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "1.429664938969559\n" ] } ], - "source": [ - "z = net.forward(train_x[0:10])\n", - "p = softmax.forward(z)\n", - "loss = cross_ent_loss.forward(p,train_labels[0:10])\n", - "print(loss)" - ] + "metadata": {} }, { "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, "source": [ "## Обучение сети\n", "\n", @@ -691,15 +686,15 @@ " b^{i+1}&=b^i-\\eta\\frac{\\partial\\L}{\\partial b}\n", " \\end{align}\n", " $$" - ] - }, - { - "cell_type": "markdown", + ], "metadata": { "slideshow": { "slide_type": "slide" } - }, + } + }, + { + "cell_type": "markdown", "source": [ "## Обратное распространение ошибки\n", "\n", @@ -711,15 +706,15 @@ "\\zz{\\L}{b} =& \\zz{\\L}{p}\\zz{p}{z}\\zz{z}{b}\n", "\\end{align}\n", "$$" - ] - }, - { - "cell_type": "markdown", + ], "metadata": { "slideshow": { "slide_type": "slide" } - }, + } + }, + { + "cell_type": "markdown", "source": [ "## Обратное распространение ошибки\n", "\n", @@ -729,11 +724,15 @@ " * Вычисляем ошибку на каждом узле начиная с конца\n", " * Обратное распространение ошибки\n", " * Все вычисления фреймворк берёт на себя" - ] + ], + "metadata": { + "slideshow": { + "slide_type": "slide" + } + } }, { "cell_type": "markdown", - "metadata": {}, "source": [ "### Реализация обратного распространения\n", "\n", @@ -754,184 +753,215 @@ "\\end{align}$$\n", "\n", "**ВАЖНО:** Вычисления производятся не для одного элемента обучающей выборки, а сразу для целой последовательности, называемой **minibatch**. Необходимые значения градиентов $\\Delta W$ и $\\Delta b$ вычисляются по всей выборке, а вектора имеют соответствующую размерность: $x\\in\\mathbb{R}^{\\mathrm{minibatch}\\, \\times\\, \\mathrm{nclass}}$" - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 17, - "metadata": {}, - "outputs": [], "source": [ - "class Linear:\n", - " def __init__(self,nin,nout):\n", - " self.W = np.random.normal(0, 1.0/np.sqrt(nin), (nout, nin))\n", - " self.b = np.zeros((1,nout))\n", - " self.dW = np.zeros_like(self.W)\n", - " self.db = np.zeros_like(self.b)\n", - " \n", - " def forward(self, x):\n", - " self.x=x\n", - " return np.dot(x, self.W.T) + self.b\n", - " \n", - " def backward(self, dz):\n", - " dx = np.dot(dz, self.W)\n", - " dW = np.dot(dz.T, self.x)\n", - " db = dz.sum(axis=0)\n", - " self.dW = dW\n", - " self.db = db\n", - " return dx\n", - " \n", - " def update(self,lr):\n", - " self.W -= lr*self.dW\n", + "class Linear:\r\n", + " def __init__(self,nin,nout):\r\n", + " self.W = np.random.normal(0, 1.0/np.sqrt(nin), (nout, nin))\r\n", + " self.b = np.zeros((1,nout))\r\n", + " self.dW = np.zeros_like(self.W)\r\n", + " self.db = np.zeros_like(self.b)\r\n", + " \r\n", + " def forward(self, x):\r\n", + " self.x=x\r\n", + " return np.dot(x, self.W.T) + self.b\r\n", + " \r\n", + " def backward(self, dz):\r\n", + " dx = np.dot(dz, self.W)\r\n", + " dW = np.dot(dz.T, self.x)\r\n", + " db = dz.sum(axis=0)\r\n", + " self.dW = dW\r\n", + " self.db = db\r\n", + " return dx\r\n", + " \r\n", + " def update(self,lr):\r\n", + " self.W -= lr*self.dW\r\n", " self.b -= lr*self.db" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "Аналогичный образом функции обратного распространения `backward` добавляются к другим составляющим вычислительного графа:" - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 18, - "metadata": {}, - "outputs": [], "source": [ - "class Softmax:\n", - " def forward(self,z):\n", - " self.z = z\n", - " zmax = z.max(axis=1,keepdims=True)\n", - " expz = np.exp(z-zmax)\n", - " Z = expz.sum(axis=1,keepdims=True)\n", - " return expz / Z\n", - " def backward(self,dp):\n", - " p = self.forward(self.z)\n", - " pdp = p * dp\n", - " return pdp - p * pdp.sum(axis=1, keepdims=True)\n", - " \n", - "class CrossEntropyLoss:\n", - " def forward(self,p,y):\n", - " self.p = p\n", - " self.y = y\n", - " p_of_y = p[np.arange(len(y)), y]\n", - " log_prob = np.log(p_of_y)\n", - " return -log_prob.mean()\n", - " def backward(self,loss):\n", - " dlog_softmax = np.zeros_like(self.p)\n", - " dlog_softmax[np.arange(len(self.y)), self.y] -= 1.0/len(self.y)\n", + "class Softmax:\r\n", + " def forward(self,z):\r\n", + " self.z = z\r\n", + " zmax = z.max(axis=1,keepdims=True)\r\n", + " expz = np.exp(z-zmax)\r\n", + " Z = expz.sum(axis=1,keepdims=True)\r\n", + " return expz / Z\r\n", + " def backward(self,dp):\r\n", + " p = self.forward(self.z)\r\n", + " pdp = p * dp\r\n", + " return pdp - p * pdp.sum(axis=1, keepdims=True)\r\n", + " \r\n", + "class CrossEntropyLoss:\r\n", + " def forward(self,p,y):\r\n", + " self.p = p\r\n", + " self.y = y\r\n", + " p_of_y = p[np.arange(len(y)), y]\r\n", + " log_prob = np.log(p_of_y)\r\n", + " return -log_prob.mean()\r\n", + " def backward(self,loss):\r\n", + " dlog_softmax = np.zeros_like(self.p)\r\n", + " dlog_softmax[np.arange(len(self.y)), self.y] -= 1.0/len(self.y)\r\n", " return dlog_softmax / self.p" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "Теперь напишем цикл обучения модели на нашем датасете. Будем рассматривать один проход по модели - т.н. **эпоху**" - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 19, - "metadata": {}, + "source": [ + "lin = Linear(2,2)\r\n", + "softmax = Softmax()\r\n", + "cross_ent_loss = CrossEntropyLoss()\r\n", + "\r\n", + "pred = np.argmax(lin.forward(train_x),axis=1)\r\n", + "acc = (pred==train_labels).mean()\r\n", + "print(\"Initial accuracy: \",acc)\r\n", + "\r\n", + "batch_size=4\r\n", + "for i in range(0,len(train_x),batch_size):\r\n", + " xb = train_x[i:i+batch_size]\r\n", + " yb = train_labels[i:i+batch_size]\r\n", + " \r\n", + " # forward pass\r\n", + " z = lin.forward(xb)\r\n", + " p = softmax.forward(z)\r\n", + " loss = cross_ent_loss.forward(p,yb)\r\n", + " \r\n", + " # backward pass\r\n", + " dp = cross_ent_loss.backward(loss)\r\n", + " dz = softmax.backward(dp)\r\n", + " dx = lin.backward(dz)\r\n", + " lin.update(0.1)\r\n", + " \r\n", + "pred = np.argmax(lin.forward(train_x),axis=1)\r\n", + "acc = (pred==train_labels).mean()\r\n", + "print(\"Final accuracy: \",acc)\r\n", + " " + ], "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "Initial accuracy: 0.725\n", "Final accuracy: 0.825\n" ] } ], - "source": [ - "lin = Linear(2,2)\n", - "softmax = Softmax()\n", - "cross_ent_loss = CrossEntropyLoss()\n", - "\n", - "pred = np.argmax(lin.forward(train_x),axis=1)\n", - "acc = (pred==train_labels).mean()\n", - "print(\"Initial accuracy: \",acc)\n", - "\n", - "batch_size=4\n", - "for i in range(0,len(train_x),batch_size):\n", - " xb = train_x[i:i+batch_size]\n", - " yb = train_labels[i:i+batch_size]\n", - " \n", - " # forward pass\n", - " z = lin.forward(xb)\n", - " p = softmax.forward(z)\n", - " loss = cross_ent_loss.forward(p,yb)\n", - " \n", - " # backward pass\n", - " dp = cross_ent_loss.backward(loss)\n", - " dz = softmax.backward(dp)\n", - " dx = lin.backward(dz)\n", - " lin.update(0.1)\n", - " \n", - "pred = np.argmax(lin.forward(train_x),axis=1)\n", - "acc = (pred==train_labels).mean()\n", - "print(\"Final accuracy: \",acc)\n", - " " - ] + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "Для удобства опишем класс, который позволяет объединять узлы вычислительного графа в единую сеть, и применять функции `forward` и `backward` сразу ко всей сети последовательно:" - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 20, + "source": [ + "class Net:\r\n", + " def __init__(self):\r\n", + " self.layers = []\r\n", + " \r\n", + " def add(self,l):\r\n", + " self.layers.append(l)\r\n", + " \r\n", + " def forward(self,x):\r\n", + " for l in self.layers:\r\n", + " x = l.forward(x)\r\n", + " return x\r\n", + " \r\n", + " def backward(self,z):\r\n", + " for l in self.layers[::-1]:\r\n", + " z = l.backward(z)\r\n", + " return z\r\n", + " \r\n", + " def update(self,lr):\r\n", + " for l in self.layers:\r\n", + " if 'update' in l.__dir__():\r\n", + " l.update(lr)" + ], + "outputs": [], "metadata": { "scrolled": true, "slideshow": { "slide_type": "skip" } - }, - "outputs": [], - "source": [ - "class Net:\n", - " def __init__(self):\n", - " self.layers = []\n", - " \n", - " def add(self,l):\n", - " self.layers.append(l)\n", - " \n", - " def forward(self,x):\n", - " for l in self.layers:\n", - " x = l.forward(x)\n", - " return x\n", - " \n", - " def backward(self,z):\n", - " for l in self.layers[::-1]:\n", - " z = l.backward(z)\n", - " return z\n", - " \n", - " def update(self,lr):\n", - " for l in self.layers:\n", - " if 'update' in l.__dir__():\n", - " l.update(lr)" - ] + } }, { "cell_type": "markdown", - "metadata": {}, "source": [ "Ещё раз пробуем создать и обучить нашу нейросеть:" - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 21, - "metadata": {}, + "source": [ + "net = Net()\r\n", + "net.add(Linear(2,2))\r\n", + "net.add(Softmax())\r\n", + "loss = CrossEntropyLoss()\r\n", + "\r\n", + "def get_loss_acc(x,y,loss=CrossEntropyLoss()):\r\n", + " p = net.forward(x)\r\n", + " l = loss.forward(p,y)\r\n", + " pred = np.argmax(p,axis=1)\r\n", + " acc = (pred==y).mean()\r\n", + " return l,acc\r\n", + "\r\n", + "print(\"Initial loss={}, accuracy={}: \".format(*get_loss_acc(train_x,train_labels)))\r\n", + "\r\n", + "def train_epoch(net, train_x, train_labels, loss=CrossEntropyLoss(), batch_size=4, lr=0.1):\r\n", + " for i in range(0,len(train_x),batch_size):\r\n", + " xb = train_x[i:i+batch_size]\r\n", + " yb = train_labels[i:i+batch_size]\r\n", + "\r\n", + " p = net.forward(xb)\r\n", + " l = loss.forward(p,yb)\r\n", + " dp = loss.backward(l)\r\n", + " dx = net.backward(dp)\r\n", + " net.update(lr)\r\n", + " \r\n", + "train_epoch(net,train_x,train_labels)\r\n", + " \r\n", + "print(\"Final loss={}, accuracy={}: \".format(*get_loss_acc(train_x,train_labels)))\r\n", + "print(\"Test loss={}, accuracy={}: \".format(*get_loss_acc(test_x,test_labels)))" + ], "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "Initial loss=0.6212072429381601, accuracy=0.6875: \n", "Final loss=0.44369925927417986, accuracy=0.8: \n", @@ -939,939 +969,144 @@ ] } ], - "source": [ - "net = Net()\n", - "net.add(Linear(2,2))\n", - "net.add(Softmax())\n", - "loss = CrossEntropyLoss()\n", - "\n", - "def get_loss_acc(x,y,loss=CrossEntropyLoss()):\n", - " p = net.forward(x)\n", - " l = loss.forward(p,y)\n", - " pred = np.argmax(p,axis=1)\n", - " acc = (pred==y).mean()\n", - " return l,acc\n", - "\n", - "print(\"Initial loss={}, accuracy={}: \".format(*get_loss_acc(train_x,train_labels)))\n", - "\n", - "def train_epoch(net, train_x, train_labels, loss=CrossEntropyLoss(), batch_size=4, lr=0.1):\n", - " for i in range(0,len(train_x),batch_size):\n", - " xb = train_x[i:i+batch_size]\n", - " yb = train_labels[i:i+batch_size]\n", - "\n", - " p = net.forward(xb)\n", - " l = loss.forward(p,yb)\n", - " dp = loss.backward(l)\n", - " dx = net.backward(dp)\n", - " net.update(lr)\n", - " \n", - "train_epoch(net,train_x,train_labels)\n", - " \n", - "print(\"Final loss={}, accuracy={}: \".format(*get_loss_acc(train_x,train_labels)))\n", - "print(\"Test loss={}, accuracy={}: \".format(*get_loss_acc(test_x,test_labels)))" - ] + "metadata": {} }, { "cell_type": "code", "execution_count": 22, + "source": [ + "def train_and_plot(n_epoch, net, loss=CrossEntropyLoss(), batch_size=4, lr=0.1):\r\n", + " fig, ax = plt.subplots(2, 1)\r\n", + " ax[0].set_xlim(0, n_epoch + 1)\r\n", + " ax[0].set_ylim(0,1)\r\n", + "\r\n", + " train_acc = np.empty((n_epoch, 3))\r\n", + " train_acc[:] = np.NAN\r\n", + " valid_acc = np.empty((n_epoch, 3))\r\n", + " valid_acc[:] = np.NAN\r\n", + "\r\n", + " for epoch in range(1, n_epoch + 1):\r\n", + "\r\n", + " train_epoch(net,train_x,train_labels,loss,batch_size,lr)\r\n", + " tloss, taccuracy = get_loss_acc(train_x,train_labels,loss)\r\n", + " train_acc[epoch-1, :] = [epoch, tloss, taccuracy]\r\n", + " vloss, vaccuracy = get_loss_acc(test_x,test_labels,loss)\r\n", + " valid_acc[epoch-1, :] = [epoch, vloss, vaccuracy]\r\n", + " \r\n", + " ax[0].set_ylim(0, max(max(train_acc[:, 2]), max(valid_acc[:, 2])) * 1.1)\r\n", + "\r\n", + " plot_training_progress(train_acc[:, 0], (train_acc[:, 2],\r\n", + " valid_acc[:, 2]), fig, ax[0])\r\n", + " plot_decision_boundary(net, fig, ax[1])\r\n", + " fig.canvas.draw()\r\n", + " fig.canvas.flush_events()\r\n", + "\r\n", + " return train_acc, valid_acc" + ], + "outputs": [], "metadata": { "slideshow": { "slide_type": "skip" } - }, - "outputs": [], - "source": [ - "def train_and_plot(n_epoch, net, loss=CrossEntropyLoss(), batch_size=4, lr=0.1):\n", - " fig, ax = plt.subplots(2, 1)\n", - " ax[0].set_xlim(0, n_epoch + 1)\n", - " ax[0].set_ylim(0,1)\n", - "\n", - " train_acc = np.empty((n_epoch, 3))\n", - " train_acc[:] = np.NAN\n", - " valid_acc = np.empty((n_epoch, 3))\n", - " valid_acc[:] = np.NAN\n", - "\n", - " for epoch in range(1, n_epoch + 1):\n", - "\n", - " train_epoch(net,train_x,train_labels,loss,batch_size,lr)\n", - " tloss, taccuracy = get_loss_acc(train_x,train_labels,loss)\n", - " train_acc[epoch-1, :] = [epoch, tloss, taccuracy]\n", - " vloss, vaccuracy = get_loss_acc(test_x,test_labels,loss)\n", - " valid_acc[epoch-1, :] = [epoch, vloss, vaccuracy]\n", - " \n", - " ax[0].set_ylim(0, max(max(train_acc[:, 2]), max(valid_acc[:, 2])) * 1.1)\n", - "\n", - " plot_training_progress(train_acc[:, 0], (train_acc[:, 2],\n", - " valid_acc[:, 2]), fig, ax[0])\n", - " plot_decision_boundary(net, fig, ax[1])\n", - " fig.canvas.draw()\n", - " fig.canvas.flush_events()\n", - "\n", - " return train_acc, valid_acc" - ] + } }, { "cell_type": "code", "execution_count": 23, + "source": [ + "import matplotlib.cm as cm\r\n", + "\r\n", + "def plot_decision_boundary(net, fig, ax):\r\n", + " draw_colorbar = True\r\n", + " # remove previous plot\r\n", + " while ax.collections:\r\n", + " ax.collections.pop()\r\n", + " draw_colorbar = False\r\n", + "\r\n", + " # generate countour grid\r\n", + " x_min, x_max = train_x[:, 0].min() - 1, train_x[:, 0].max() + 1\r\n", + " y_min, y_max = train_x[:, 1].min() - 1, train_x[:, 1].max() + 1\r\n", + " xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1),\r\n", + " np.arange(y_min, y_max, 0.1))\r\n", + " grid_points = np.c_[xx.ravel().astype('float32'), yy.ravel().astype('float32')]\r\n", + " n_classes = max(train_labels)+1\r\n", + " while train_x.shape[1] > grid_points.shape[1]:\r\n", + " # pad dimensions (plot only the first two)\r\n", + " grid_points = np.c_[grid_points,\r\n", + " np.empty(len(xx.ravel())).astype('float32')]\r\n", + " grid_points[:, -1].fill(train_x[:, grid_points.shape[1]-1].mean())\r\n", + "\r\n", + " # evaluate predictions\r\n", + " prediction = np.array(net.forward(grid_points))\r\n", + " # for two classes: prediction difference\r\n", + " if (n_classes == 2):\r\n", + " Z = np.array([0.5+(p[0]-p[1])/2.0 for p in prediction]).reshape(xx.shape)\r\n", + " else:\r\n", + " Z = np.array([p.argsort()[-1]/float(n_classes-1) for p in prediction]).reshape(xx.shape)\r\n", + " \r\n", + " # draw contour\r\n", + " levels = np.linspace(0, 1, 40)\r\n", + " cs = ax.contourf(xx, yy, Z, alpha=0.4, levels = levels)\r\n", + " if draw_colorbar:\r\n", + " fig.colorbar(cs, ax=ax, ticks = [0, 0.5, 1])\r\n", + " c_map = [cm.jet(x) for x in np.linspace(0.0, 1.0, n_classes) ]\r\n", + " colors = [c_map[l] for l in train_labels]\r\n", + " ax.scatter(train_x[:, 0], train_x[:, 1], marker='o', c=colors, s=60, alpha = 0.5)" + ], + "outputs": [], "metadata": { "slideshow": { "slide_type": "skip" } - }, - "outputs": [], - "source": [ - "import matplotlib.cm as cm\n", - "\n", - "def plot_decision_boundary(net, fig, ax):\n", - " draw_colorbar = True\n", - " # remove previous plot\n", - " while ax.collections:\n", - " ax.collections.pop()\n", - " draw_colorbar = False\n", - "\n", - " # generate countour grid\n", - " x_min, x_max = train_x[:, 0].min() - 1, train_x[:, 0].max() + 1\n", - " y_min, y_max = train_x[:, 1].min() - 1, train_x[:, 1].max() + 1\n", - " xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1),\n", - " np.arange(y_min, y_max, 0.1))\n", - " grid_points = np.c_[xx.ravel().astype('float32'), yy.ravel().astype('float32')]\n", - " n_classes = max(train_labels)+1\n", - " while train_x.shape[1] > grid_points.shape[1]:\n", - " # pad dimensions (plot only the first two)\n", - " grid_points = np.c_[grid_points,\n", - " np.empty(len(xx.ravel())).astype('float32')]\n", - " grid_points[:, -1].fill(train_x[:, grid_points.shape[1]-1].mean())\n", - "\n", - " # evaluate predictions\n", - " prediction = np.array(net.forward(grid_points))\n", - " # for two classes: prediction difference\n", - " if (n_classes == 2):\n", - " Z = np.array([0.5+(p[0]-p[1])/2.0 for p in prediction]).reshape(xx.shape)\n", - " else:\n", - " Z = np.array([p.argsort()[-1]/float(n_classes-1) for p in prediction]).reshape(xx.shape)\n", - " \n", - " # draw contour\n", - " levels = np.linspace(0, 1, 40)\n", - " cs = ax.contourf(xx, yy, Z, alpha=0.4, levels = levels)\n", - " if draw_colorbar:\n", - " fig.colorbar(cs, ax=ax, ticks = [0, 0.5, 1])\n", - " c_map = [cm.jet(x) for x in np.linspace(0.0, 1.0, n_classes) ]\n", - " colors = [c_map[l] for l in train_labels]\n", - " ax.scatter(train_x[:, 0], train_x[:, 1], marker='o', c=colors, s=60, alpha = 0.5)" - ] + } }, { "cell_type": "code", "execution_count": 24, + "source": [ + "def plot_training_progress(x, y_data, fig, ax):\r\n", + " styles = ['k--', 'g-']\r\n", + " # remove previous plot\r\n", + " while ax.lines:\r\n", + " ax.lines.pop()\r\n", + " # draw updated lines\r\n", + " for i in range(len(y_data)):\r\n", + " ax.plot(x, y_data[i], styles[i])\r\n", + " ax.legend(ax.lines, ['training accuracy', 'validation accuracy'],\r\n", + " loc='upper center', ncol = 2)" + ], + "outputs": [], "metadata": { "slideshow": { "slide_type": "skip" } - }, - "outputs": [], - "source": [ - "def plot_training_progress(x, y_data, fig, ax):\n", - " styles = ['k--', 'g-']\n", - " # remove previous plot\n", - " while ax.lines:\n", - " ax.lines.pop()\n", - " # draw updated lines\n", - " for i in range(len(y_data)):\n", - " ax.plot(x, y_data[i], styles[i])\n", - " ax.legend(ax.lines, ['training accuracy', 'validation accuracy'],\n", - " loc='upper center', ncol = 2)" - ] + } }, { "cell_type": "code", "execution_count": 27, - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, + "source": [ + "%matplotlib nbagg \r\n", + "\r\n", + "net = Net()\r\n", + "net.add(Linear(2,2))\r\n", + "net.add(Softmax())\r\n", + "\r\n", + "res = train_and_plot(30,net,lr=0.005)" + ], "outputs": [ { + "output_type": "display_data", "data": { - "application/javascript": [ - "/* Put everything inside the global mpl namespace */\n", - "window.mpl = {};\n", - "\n", - "\n", - "mpl.get_websocket_type = function() {\n", - " if (typeof(WebSocket) !== 'undefined') {\n", - " return WebSocket;\n", - " } else if (typeof(MozWebSocket) !== 'undefined') {\n", - " return MozWebSocket;\n", - " } else {\n", - " alert('Your browser does not have WebSocket support. ' +\n", - " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", - " 'Firefox 4 and 5 are also supported but you ' +\n", - " 'have to enable WebSockets in about:config.');\n", - " };\n", - "}\n", - "\n", - "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", - " this.id = figure_id;\n", - "\n", - " this.ws = websocket;\n", - "\n", - " this.supports_binary = (this.ws.binaryType != undefined);\n", - "\n", - " if (!this.supports_binary) {\n", - " var warnings = document.getElementById(\"mpl-warnings\");\n", - " if (warnings) {\n", - " warnings.style.display = 'block';\n", - " warnings.textContent = (\n", - " \"This browser does not support binary websocket messages. \" +\n", - " \"Performance may be slow.\");\n", - " }\n", - " }\n", - "\n", - " this.imageObj = new Image();\n", - "\n", - " this.context = undefined;\n", - " this.message = undefined;\n", - " this.canvas = undefined;\n", - " this.rubberband_canvas = undefined;\n", - " this.rubberband_context = undefined;\n", - " this.format_dropdown = undefined;\n", - "\n", - " this.image_mode = 'full';\n", - "\n", - " this.root = $('
');\n", - " this._root_extra_style(this.root)\n", - " this.root.attr('style', 'display: inline-block');\n", - "\n", - " $(parent_element).append(this.root);\n", - "\n", - " this._init_header(this);\n", - " this._init_canvas(this);\n", - " this._init_toolbar(this);\n", - "\n", - " var fig = this;\n", - "\n", - " this.waiting = false;\n", - "\n", - " this.ws.onopen = function () {\n", - " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", - " fig.send_message(\"send_image_mode\", {});\n", - " if (mpl.ratio != 1) {\n", - " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", - " }\n", - " fig.send_message(\"refresh\", {});\n", - " }\n", - "\n", - " this.imageObj.onload = function() {\n", - " if (fig.image_mode == 'full') {\n", - " // Full images could contain transparency (where diff images\n", - " // almost always do), so we need to clear the canvas so that\n", - " // there is no ghosting.\n", - " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", - " }\n", - " fig.context.drawImage(fig.imageObj, 0, 0);\n", - " };\n", - "\n", - " this.imageObj.onunload = function() {\n", - " fig.ws.close();\n", - " }\n", - "\n", - " this.ws.onmessage = this._make_on_message_function(this);\n", - "\n", - " this.ondownload = ondownload;\n", - "}\n", - "\n", - "mpl.figure.prototype._init_header = function() {\n", - " var titlebar = $(\n", - " '
');\n", - " var titletext = $(\n", - " '
');\n", - " titlebar.append(titletext)\n", - " this.root.append(titlebar);\n", - " this.header = titletext[0];\n", - "}\n", - "\n", - "\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", - "\n", - "}\n", - "\n", - "\n", - "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", - "\n", - "}\n", - "\n", - "mpl.figure.prototype._init_canvas = function() {\n", - " var fig = this;\n", - "\n", - " var canvas_div = $('
');\n", - "\n", - " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", - "\n", - " function canvas_keyboard_event(event) {\n", - " return fig.key_event(event, event['data']);\n", - " }\n", - "\n", - " canvas_div.keydown('key_press', canvas_keyboard_event);\n", - " canvas_div.keyup('key_release', canvas_keyboard_event);\n", - " this.canvas_div = canvas_div\n", - " this._canvas_extra_style(canvas_div)\n", - " this.root.append(canvas_div);\n", - "\n", - " var canvas = $('');\n", - " canvas.addClass('mpl-canvas');\n", - " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", - "\n", - " this.canvas = canvas[0];\n", - " this.context = canvas[0].getContext(\"2d\");\n", - "\n", - " var backingStore = this.context.backingStorePixelRatio ||\n", - "\tthis.context.webkitBackingStorePixelRatio ||\n", - "\tthis.context.mozBackingStorePixelRatio ||\n", - "\tthis.context.msBackingStorePixelRatio ||\n", - "\tthis.context.oBackingStorePixelRatio ||\n", - "\tthis.context.backingStorePixelRatio || 1;\n", - "\n", - " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", - "\n", - " var rubberband = $('');\n", - " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", - "\n", - " var pass_mouse_events = true;\n", - "\n", - " canvas_div.resizable({\n", - " start: function(event, ui) {\n", - " pass_mouse_events = false;\n", - " },\n", - " resize: function(event, ui) {\n", - " fig.request_resize(ui.size.width, ui.size.height);\n", - " },\n", - " stop: function(event, ui) {\n", - " pass_mouse_events = true;\n", - " fig.request_resize(ui.size.width, ui.size.height);\n", - " },\n", - " });\n", - "\n", - " function mouse_event_fn(event) {\n", - " if (pass_mouse_events)\n", - " return fig.mouse_event(event, event['data']);\n", - " }\n", - "\n", - " rubberband.mousedown('button_press', mouse_event_fn);\n", - " rubberband.mouseup('button_release', mouse_event_fn);\n", - " // Throttle sequential mouse events to 1 every 20ms.\n", - " rubberband.mousemove('motion_notify', mouse_event_fn);\n", - "\n", - " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", - " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", - "\n", - " canvas_div.on(\"wheel\", function (event) {\n", - " event = event.originalEvent;\n", - " event['data'] = 'scroll'\n", - " if (event.deltaY < 0) {\n", - " event.step = 1;\n", - " } else {\n", - " event.step = -1;\n", - " }\n", - " mouse_event_fn(event);\n", - " });\n", - "\n", - " canvas_div.append(canvas);\n", - " canvas_div.append(rubberband);\n", - "\n", - " this.rubberband = rubberband;\n", - " this.rubberband_canvas = rubberband[0];\n", - " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", - " this.rubberband_context.strokeStyle = \"#000000\";\n", - "\n", - " this._resize_canvas = function(width, height) {\n", - " // Keep the size of the canvas, canvas container, and rubber band\n", - " // canvas in synch.\n", - " canvas_div.css('width', width)\n", - " canvas_div.css('height', height)\n", - "\n", - " canvas.attr('width', width * mpl.ratio);\n", - " canvas.attr('height', height * mpl.ratio);\n", - " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", - "\n", - " rubberband.attr('width', width);\n", - " rubberband.attr('height', height);\n", - " }\n", - "\n", - " // Set the figure to an initial 600x600px, this will subsequently be updated\n", - " // upon first draw.\n", - " this._resize_canvas(600, 600);\n", - "\n", - " // Disable right mouse context menu.\n", - " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", - " return false;\n", - " });\n", - "\n", - " function set_focus () {\n", - " canvas.focus();\n", - " canvas_div.focus();\n", - " }\n", - "\n", - " window.setTimeout(set_focus, 100);\n", - "}\n", - "\n", - "mpl.figure.prototype._init_toolbar = function() {\n", - " var fig = this;\n", - "\n", - " var nav_element = $('
');\n", - " nav_element.attr('style', 'width: 100%');\n", - " this.root.append(nav_element);\n", - "\n", - " // Define a callback function for later on.\n", - " function toolbar_event(event) {\n", - " return fig.toolbar_button_onclick(event['data']);\n", - " }\n", - " function toolbar_mouse_event(event) {\n", - " return fig.toolbar_button_onmouseover(event['data']);\n", - " }\n", - "\n", - " for(var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " // put a spacer in here.\n", - " continue;\n", - " }\n", - " var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('
');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i= 3 moved mimebundle to data attribute of output\n data = data.data;\n }\n if (data['text/html'] == html_output) {\n return [cell, data, j];\n }\n }\n }\n }\n}\n\n// Register the function which deals with the matplotlib target/channel.\n// The kernel may be null if the page has been refreshed.\nif (IPython.notebook.kernel != null) {\n IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n}\n", "text/plain": [ "" ] }, - "metadata": {}, - "output_type": "display_data" + "metadata": {} }, { + "output_type": "display_data", "data": { "text/html": [ "" @@ -1880,855 +1115,78 @@ "" ] }, - "metadata": {}, - "output_type": "display_data" + "metadata": {} } ], - "source": [ - "%matplotlib nbagg \n", - "\n", - "net = Net()\n", - "net.add(Linear(2,2))\n", - "net.add(Softmax())\n", - "\n", - "res = train_and_plot(30,net,lr=0.005)" - ] - }, - { - "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } - }, + } + }, + { + "cell_type": "markdown", "source": [ "## Многослойная модель\n", "\n", " * С нашей архитектурой вычислительного графа легко описывать многослойные персептроны!\n", " * Нельзя забывать про передаточную функцию (мы будем использовать `tanh`)\n", " * В более глубоких сетях очень важна первоначальная активация весов" - ] + ], + "metadata": { + "slideshow": { + "slide_type": "slide" + } + } }, { "cell_type": "code", "execution_count": 28, - "metadata": {}, - "outputs": [], "source": [ - "class Tanh:\n", - " def forward(self,x):\n", - " y = np.tanh(x)\n", - " self.y = y\n", - " return y\n", - " def backward(self,dy):\n", + "class Tanh:\r\n", + " def forward(self,x):\r\n", + " y = np.tanh(x)\r\n", + " self.y = y\r\n", + " return y\r\n", + " def backward(self,dy):\r\n", " return (1.0-self.y**2)*dy" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "code", "execution_count": 33, - "metadata": {}, - "outputs": [], "source": [ - "net = Net()\n", - "net.add(Linear(2,10))\n", - "net.add(Tanh())\n", - "net.add(Linear(10,2))\n", - "net.add(Softmax())\n", + "net = Net()\r\n", + "net.add(Linear(2,10))\r\n", + "net.add(Tanh())\r\n", + "net.add(Linear(10,2))\r\n", + "net.add(Softmax())\r\n", "loss = CrossEntropyLoss()" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "code", "execution_count": 34, - "metadata": { - "scrolled": false, - "slideshow": { - "slide_type": "slide" - } - }, + "source": [ + "res = train_and_plot(30,net,lr=0.01)" + ], "outputs": [ { + "output_type": "display_data", "data": { - "application/javascript": [ - "/* Put everything inside the global mpl namespace */\n", - "window.mpl = {};\n", - "\n", - "\n", - "mpl.get_websocket_type = function() {\n", - " if (typeof(WebSocket) !== 'undefined') {\n", - " return WebSocket;\n", - " } else if (typeof(MozWebSocket) !== 'undefined') {\n", - " return MozWebSocket;\n", - " } else {\n", - " alert('Your browser does not have WebSocket support. ' +\n", - " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", - " 'Firefox 4 and 5 are also supported but you ' +\n", - " 'have to enable WebSockets in about:config.');\n", - " };\n", - "}\n", - "\n", - "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", - " this.id = figure_id;\n", - "\n", - " this.ws = websocket;\n", - "\n", - " this.supports_binary = (this.ws.binaryType != undefined);\n", - "\n", - " if (!this.supports_binary) {\n", - " var warnings = document.getElementById(\"mpl-warnings\");\n", - " if (warnings) {\n", - " warnings.style.display = 'block';\n", - " warnings.textContent = (\n", - " \"This browser does not support binary websocket messages. \" +\n", - " \"Performance may be slow.\");\n", - " }\n", - " }\n", - "\n", - " this.imageObj = new Image();\n", - "\n", - " this.context = undefined;\n", - " this.message = undefined;\n", - " this.canvas = undefined;\n", - " this.rubberband_canvas = undefined;\n", - " this.rubberband_context = undefined;\n", - " this.format_dropdown = undefined;\n", - "\n", - " this.image_mode = 'full';\n", - "\n", - " this.root = $('
');\n", - " this._root_extra_style(this.root)\n", - " this.root.attr('style', 'display: inline-block');\n", - "\n", - " $(parent_element).append(this.root);\n", - "\n", - " this._init_header(this);\n", - " this._init_canvas(this);\n", - " this._init_toolbar(this);\n", - "\n", - " var fig = this;\n", - "\n", - " this.waiting = false;\n", - "\n", - " this.ws.onopen = function () {\n", - " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", - " fig.send_message(\"send_image_mode\", {});\n", - " if (mpl.ratio != 1) {\n", - " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", - " }\n", - " fig.send_message(\"refresh\", {});\n", - " }\n", - "\n", - " this.imageObj.onload = function() {\n", - " if (fig.image_mode == 'full') {\n", - " // Full images could contain transparency (where diff images\n", - " // almost always do), so we need to clear the canvas so that\n", - " // there is no ghosting.\n", - " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", - " }\n", - " fig.context.drawImage(fig.imageObj, 0, 0);\n", - " };\n", - "\n", - " this.imageObj.onunload = function() {\n", - " fig.ws.close();\n", - " }\n", - "\n", - " this.ws.onmessage = this._make_on_message_function(this);\n", - "\n", - " this.ondownload = ondownload;\n", - "}\n", - "\n", - "mpl.figure.prototype._init_header = function() {\n", - " var titlebar = $(\n", - " '
');\n", - " var titletext = $(\n", - " '
');\n", - " titlebar.append(titletext)\n", - " this.root.append(titlebar);\n", - " this.header = titletext[0];\n", - "}\n", - "\n", - "\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", - "\n", - "}\n", - "\n", - "\n", - "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", - "\n", - "}\n", - "\n", - "mpl.figure.prototype._init_canvas = function() {\n", - " var fig = this;\n", - "\n", - " var canvas_div = $('
');\n", - "\n", - " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", - "\n", - " function canvas_keyboard_event(event) {\n", - " return fig.key_event(event, event['data']);\n", - " }\n", - "\n", - " canvas_div.keydown('key_press', canvas_keyboard_event);\n", - " canvas_div.keyup('key_release', canvas_keyboard_event);\n", - " this.canvas_div = canvas_div\n", - " this._canvas_extra_style(canvas_div)\n", - " this.root.append(canvas_div);\n", - "\n", - " var canvas = $('');\n", - " canvas.addClass('mpl-canvas');\n", - " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", - "\n", - " this.canvas = canvas[0];\n", - " this.context = canvas[0].getContext(\"2d\");\n", - "\n", - " var backingStore = this.context.backingStorePixelRatio ||\n", - "\tthis.context.webkitBackingStorePixelRatio ||\n", - "\tthis.context.mozBackingStorePixelRatio ||\n", - "\tthis.context.msBackingStorePixelRatio ||\n", - "\tthis.context.oBackingStorePixelRatio ||\n", - "\tthis.context.backingStorePixelRatio || 1;\n", - "\n", - " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", - "\n", - " var rubberband = $('');\n", - " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", - "\n", - " var pass_mouse_events = true;\n", - "\n", - " canvas_div.resizable({\n", - " start: function(event, ui) {\n", - " pass_mouse_events = false;\n", - " },\n", - " resize: function(event, ui) {\n", - " fig.request_resize(ui.size.width, ui.size.height);\n", - " },\n", - " stop: function(event, ui) {\n", - " pass_mouse_events = true;\n", - " fig.request_resize(ui.size.width, ui.size.height);\n", - " },\n", - " });\n", - "\n", - " function mouse_event_fn(event) {\n", - " if (pass_mouse_events)\n", - " return fig.mouse_event(event, event['data']);\n", - " }\n", - "\n", - " rubberband.mousedown('button_press', mouse_event_fn);\n", - " rubberband.mouseup('button_release', mouse_event_fn);\n", - " // Throttle sequential mouse events to 1 every 20ms.\n", - " rubberband.mousemove('motion_notify', mouse_event_fn);\n", - "\n", - " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", - " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", - "\n", - " canvas_div.on(\"wheel\", function (event) {\n", - " event = event.originalEvent;\n", - " event['data'] = 'scroll'\n", - " if (event.deltaY < 0) {\n", - " event.step = 1;\n", - " } else {\n", - " event.step = -1;\n", - " }\n", - " mouse_event_fn(event);\n", - " });\n", - "\n", - " canvas_div.append(canvas);\n", - " canvas_div.append(rubberband);\n", - "\n", - " this.rubberband = rubberband;\n", - " this.rubberband_canvas = rubberband[0];\n", - " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", - " this.rubberband_context.strokeStyle = \"#000000\";\n", - "\n", - " this._resize_canvas = function(width, height) {\n", - " // Keep the size of the canvas, canvas container, and rubber band\n", - " // canvas in synch.\n", - " canvas_div.css('width', width)\n", - " canvas_div.css('height', height)\n", - "\n", - " canvas.attr('width', width * mpl.ratio);\n", - " canvas.attr('height', height * mpl.ratio);\n", - " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", - "\n", - " rubberband.attr('width', width);\n", - " rubberband.attr('height', height);\n", - " }\n", - "\n", - " // Set the figure to an initial 600x600px, this will subsequently be updated\n", - " // upon first draw.\n", - " this._resize_canvas(600, 600);\n", - "\n", - " // Disable right mouse context menu.\n", - " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", - " return false;\n", - " });\n", - "\n", - " function set_focus () {\n", - " canvas.focus();\n", - " canvas_div.focus();\n", - " }\n", - "\n", - " window.setTimeout(set_focus, 100);\n", - "}\n", - "\n", - "mpl.figure.prototype._init_toolbar = function() {\n", - " var fig = this;\n", - "\n", - " var nav_element = $('
');\n", - " nav_element.attr('style', 'width: 100%');\n", - " this.root.append(nav_element);\n", - "\n", - " // Define a callback function for later on.\n", - " function toolbar_event(event) {\n", - " return fig.toolbar_button_onclick(event['data']);\n", - " }\n", - " function toolbar_mouse_event(event) {\n", - " return fig.toolbar_button_onmouseover(event['data']);\n", - " }\n", - "\n", - " for(var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " // put a spacer in here.\n", - " continue;\n", - " }\n", - " var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('
');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i= 3 moved mimebundle to data attribute of output\n data = data.data;\n }\n if (data['text/html'] == html_output) {\n return [cell, data, j];\n }\n }\n }\n }\n}\n\n// Register the function which deals with the matplotlib target/channel.\n// The kernel may be null if the page has been refreshed.\nif (IPython.notebook.kernel != null) {\n IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n}\n", "text/plain": [ "" ] }, - "metadata": {}, - "output_type": "display_data" + "metadata": {} }, { + "output_type": "display_data", "data": { "text/html": [ "" @@ -2737,21 +1195,18 @@ "" ] }, - "metadata": {}, - "output_type": "display_data" + "metadata": {} } ], - "source": [ - "res = train_and_plot(30,net,lr=0.01)" - ] - }, - { - "cell_type": "markdown", "metadata": { + "scrolled": false, "slideshow": { "slide_type": "slide" } - }, + } + }, + { + "cell_type": "markdown", "source": [ "## Важное замечание\n", "\n", @@ -2762,15 +1217,15 @@ "Сложная многослойная модель\n", "* низкий training loss - почти идеально приближает обучающую выборку (но может переобучиться)\n", "* validation loss >> training loss и может возрастать - плохо обобщает данные" - ] - }, - { - "cell_type": "markdown", + ], "metadata": { "slideshow": { "slide_type": "slide" } - }, + } + }, + { + "cell_type": "markdown", "source": [ "## Выводы\n", "\n", @@ -2778,7 +1233,26 @@ "* Более сложные модели (high capacity) могут переобучиться (надо следить за validation error)\n", "* Для более сложных моделей необходимо иметь больше данных\n", "* \"bias-variance trade-off\" - необходимо достичь компромисса между недообучением и переобучением (обучением на распознавание нерелевантного шума во входных данных)" - ] + ], + "metadata": { + "slideshow": { + "slide_type": "slide" + } + } + }, + { + "cell_type": "markdown", + "source": [ + "## Credits\r\n", + "\r\n", + "This notebook is a part of [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners), and has been prepared by [Dmitry Soshnikov](http://soshnikov.com). It is inspired by Neural Network Workshop at Microsoft Research Cambridge. Some code and illustrative materials are taken from presentations by [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) and [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), and from [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop) repository." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [], + "metadata": {} } ], "metadata": { @@ -2806,4 +1280,4 @@ }, "nbformat": 4, "nbformat_minor": 1 -} +} \ No newline at end of file diff --git a/3-NeuralNetworks/04-OwnFramework/README.md b/3-NeuralNetworks/04-OwnFramework/README.md new file mode 100644 index 00000000..ecd5f425 --- /dev/null +++ b/3-NeuralNetworks/04-OwnFramework/README.md @@ -0,0 +1,52 @@ +# Introduction to Neural Networks. Multi-Layered Perceptron + +In the previous section, we have learnt about simplest neural network model - one-layered perceptron. It was a liner two-class classification model. + +In this section we will extend this model into more flexible framework, allowing us to: + +* perform **multi-class classification** in addition to two-class +* solve **regression problems** in addition to classification +* separate classes that are not linearly separable + +We will also develop our own modular framework in Python that will allows us to construct different neural network architectures. + +## Formalization of Machine Learning + +Let's start with formalizing the Machine Learning problem. Suppose we have a training dataset **X** with labels **Y**, and we need to build a model *f* that will make most accurate predictions. The quality of predictions is measured by **Loss function** ℒ. The following loss functions are often used: + +* For regression problem, when we need to predict a number, we can use **absolute error** ∑i|f(x(i))-y(i)|, or **squared error** ∑i(f(x(i))-y(i))2 +* For classification, we use **0-1 loss** (which is essentially the same as **accuracy** of the model), or **logistic loss**. + +For one-level perceptron, function *f* was defined as a linear function *f(x)=wx+b* (here *w* is the weight matrix, *x* is the vector if input features, and *b* is bias vector). For different neural network architectures, this function can take more complex form. + +> In the case of classification, it is often desirable to get probabilities of corresponding classes as network output. To convert arbitrary numbers to probabilities (eg. to normalize the output), we often use **softmax** function σ, for the function *f* becomes *f=σ(wx+b)* + +In the definition of *f* above, *w* and *b* are called **parameters** θ=*w,b*. Given the dataset <**X**,**Y**>, we can compute an overall error on the whole dataset as a function of parameters θ. + +**The goal of neural network training is to minimize the error by varying parameters θ** + +## Gradient Descent Optimization + +There is a well-known method of function optimization called **gradient descent**. The idea is that we can compute a derivative (in multi-dimensional case call **gradient**) of loss function with respect to parameters, and vary parameters in such a way that the error would decrease. This can be formalized as follows: + +* Initialize parameters by some random values w(0), b(0) +* Repeat the following step many times: + - w(i+1) = w(i)-η∂ℒ/∂w + - b(i+1) = b(i)-η∂ℒ/∂b + +During training, the optimization steps are supposed to be calculated considering the whole dataset (remember that loss is calculated as a sum through all training samples). However, in real life we take small portions of the dataset called **minibatches**, and calculate gradients based on a subset of data. Because subset is taken randomly each time, such method is called **stochastic gradient descent** (SGD). + +## Multi-Layered Perceptrons and Back Propagation + +One-layer network, as we have seen above, is capable of classifying linearly separable classes. To build reacher model, we can combine several layers of the network. Mathematically it would just mean that the function *f* would have more complex form, such as *f(x) = σ(w1α(w2x+b2)+b1)*, where α is a **non-linear activation function**, and θ=<*w1,b1,w2,b2*> are parameters. + +The gradient descent algorithm would remain the same, but it would be more difficult to calculate gradients. Given the chain differentiation rule, we can calculate derivatives as + +* ∂ℒ/∂w1 = (∂ℒ/∂σ)(∂σ/∂w1) +* ∂ℒ/∂w2 = (∂ℒ/∂σ)(∂σ/∂α)(∂α/∂z) + + + +## [Proceed to Notebook](OwnFramework.ipynb) + +To see how we can use perceptron to solve some toy as well as real-life problems, and to continue learning - go to [OwnFramework](OwnFramework.ipynb) notebook. diff --git a/README.md b/README.md index 6a5713d7..d468d214 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ For a gentle introduction to *AI in the Cloud* topic you may consider taking [Ge 3Perceptron Text Notebook -4 Multi-Layered Perceptron and Creating our own FrameworkTextNotebook +4 Multi-Layered Perceptron and Creating our own FrameworkTextNotebook 5 Intro to Frameworks (PyTorch/Tensorflow) Text