{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Наша первая свёрточная нейросеть \n", "\n", "Пришло время построить нашу первую свёрточную нейросеть. Будем использовать для этого датасет [MNIST.](https://www.cs.toronto.edu/~kriz/cifar.html) Набор данных включает в себя изображения рукописных цифр. \n", "\n", "" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# подгружаем пакеты\n", "import numpy as np\n", "import random\n", "from tqdm import tqdm\n", "\n", "import keras\n", "from keras import backend as K\n", "\n", "%matplotlib inline\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. Смотрим на данные \n", "\n", "Скачаеми приготовим данные. Буквально через минуту в наших руках окажутся $60 000$ картинок размера $28 \\times 28$." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "from keras.datasets import mnist\n", "(x_tr, y_tr), (x_ts, y_ts) = mnist.load_data()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Train samples: (60000, 28, 28) (60000,)\n", "Test samples: (10000, 28, 28) (10000,)\n" ] } ], "source": [ "print(\"Train samples:\", x_tr.shape, y_tr.shape)\n", "print(\"Test samples:\", x_ts.shape, y_ts.shape)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Нарисуем несколько рандомных картинок из тренировочной выборки. " ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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FixYUOXrHH/88claPL8ungtFMXr27JmsXXPNNUHOe43Jm+UFRYrfh8+aNavkMU8//XSQf/e73yU1njW1K56RGs/l2mOPPZJjLrrooiBXZ55TlmXZ7Nmzgxw/++L/vTHziScAAAAACqHxBAAAAEAhNJ4AAAAAKITGEwAAAACFqBfDxT/66KMg5w3ZbtWqVZB/9rOfJTWLFy8O8syZM8uwu8pp0aJFkG+44YakJh68uGjRoiA//PDD5d8YNapHjx5BXrJkSVKTN3iVhqdTp07J2uTJk4McD8r9b2v/r/HjxydrDz30UJBPPPHEpGblypVBjocjZlmWDRo0KMg19WMM1J5mzZolay1btgxy27Ztk5rXX3+9ytf6/Oc/H+SmTZsmNa1bt97iMVmWZevXrw/ypEmTqrwXqi9+lowaNaos541/fOGkk04qecz9998f5FdeeaUse2ns4v8fXnfddUlN/FxYvnx5UnPPPfeUdV80buvWrStZc8ghh1T5vPFrSmXk/ejVv/71ryqfh8qJf7Tr17/+dZDjH9nJsnRI/N57753UzJ8/P8iPPvpoUjNt2rQgr169eot7bcx84gkAAACAQmg8AQAAAFAIjScAAAAAClEvZjxt3rw5yB9//HFSc8kllwT5jjvuKHRPVXX77bcHuUuXLiWPOffcc4Ncme8uU7fEs3TiOV558yY+/PDDIrdEHdG3b99kbd999w1yfL9kWZaNHTs2yMOHDw/y9OnTS177oosuStYGDx5c8tqf+9znSp6b+u3oo48O8pgxY5Kagw8+OMgvv/xyUvOHP/whyO+++25S853vfCfIO+20U5D/85//JMf86U9/CvLChQuTmvfeey9Zo/4bNmxYkPNmi8Xvk2688cYCd9R4xHNK47lpBx10UMlz/PjHPy7rniD2q1/9KshHHXVUUnPKKacEOX7vE/99LU/z5s1Lnve8885Lar70pS+VPDelxe9BsizLbr311i0ec9VVVyVrM2bMCPKFF164dRujJJ94AgAAAKAQGk8AAAAAFELjCQAAAIBCaDwBAAAAUIh6MVx848aNQc4b2LZkyZKa2k5JEyZMSNZOPvnkkseNGDEiyPEQVeqfffbZp7a3QB2xww47BPn8889PatavXx/kAQMGJDXxMMQrr7yyDLtLB2pOnDgxqenUqVNZrkXdEb+eXn755UHOG9h5wAEHBLlz585JzeOPPx7kvB9SOP7444O8fPnyIOcNF6dxiAf1ZlmWDRw4sORxb775ZpDr0nvD+qxNmzZBPuGEE0oeM23atCDHA8mh3OIfn4qHjWdZlvXr1y/I8XPlnnvuSY7Zc889gzx16tSkpnv37kH+9a9/vcW9Un3xe5Asy7IOHTrUyLXjHwHKsiw77rjjgvzOO+8E+b777it0T/WJTzwBAAAAUAiNJwAAAAAKofEEAAAAQCHqxYynWG1+Z7958+bJ2ujRo4N89tlnlzzPxRdfnKzdcMMN1d8YddKZZ55Z21ugjrjsssuCnPc98T//+c9Bjuc5Falv375BrqioSGry9kz9Ed+DWZZlw4YNC/LRRx8d5Jdeeik5pm3btkG+9957k5rFixdXfYOUTcuWLYPcp0+fIPfu3bvkOaZPn56sPfbYY0GOZ3BWVzw/Lm82S7NmzYIcz9HIsiz79re/XZb9EFq3bl2Q4+fC5z73ueSYb37zm0HOm8GycuXKMuwO8s2ZMydZi2ePxTN4Fy5cmBwT37u77bZbUhM/Gyszk47q+frXv17lY+I5plmWZTfddFOVz9OiRYtkrV27dkGOXxd/9rOflTzv73//+2QtnrG5aNGiymyxTvOJJwAAAAAKofEEAAAAQCE0ngAAAAAohMYTAAAAAIVoUpE3QTavsEmTovdSJ8VDxO68886k5tRTTw1y3p/VBRdcEOR4YFiWZdknn3xSjR0Wo5K3RbU1lvvpL3/5S5D322+/IJ900knJMQ899FCRW6oVRd9PWVb376lly5YFOW9QdzzksiaHi8c2b96crMX/Hps2bVpT20l4RpXWr1+/II8ZMyapiYfKL126tNA91VX1+Rm1zTbpf0OcMmVKkOP3KdV1yy23BPn8888vy3mvvfbaIF9yySUlj8n7kZYbb7yxLPsph4b0jNpll12CvGLFipLHxPfgGWecUdY9NTYN6X6qTZ/5zGeC/Le//S3IeX8O8Z/95ZdfntTEz56PPvqomjusGfX5Na99+/bJ2tSpU4Pcq1evslzr5ZdfDnKXLl3Kct7KWL16dZDvueeepObSSy+tqe2UVJl7yieeAAAAACiExhMAAAAAhdB4AgAAAKAQ29b2Buqanj17BnnChAlBzvtu57vvvhvkgQMHJjWPPvpokOvSPCdqTjyLI753aLjimU7xzKcsq92ZTrG872rXxEwAqmePPfZI1u6+++4gH3nkkUlNY53p1JDkzTqKZzpt2LAhyLNnz06OiWdZDBkyJKkZNmxYkPPey8T7iV/3fvjDHybHXHTRRclabNy4cUG++eabSx4D/023bt2C3KFDh7Kc909/+lOQ4zkt1JxmzZola9ddd12Q4zlEeXOJRo8eHeSf/vSnZdgd1bVmzZpkbcCAAUE+4IADynKtomY8nXDCCUGO521mWZbttttuQe7fv39S07p16yD/6Ec/CvLatWuru8VC+MQTAAAAAIXQeAIAAACgEBpPAAAAABSiUc94Gjx4cLI2cuTIIO+yyy5Bjr+7nWVZ1rt37yD7PnfjtNNOOyVrO+64Y5D/8Y9/BPn5558vdE/UHfHcgPnz59fSTvLFz8O8OQdPP/10TW2HEuLXpscffzyp+fe//x3kk046KalZvHhxeTdG4dq3bx/kCy64IKlZtGhRkC+55JIgP/PMMyWvs+uuuyZrJ598cpDjuRpZls7GPPzww4N8zTXXlLz2xx9/nKw99thjQd60aVPJ81D/xXNOjj322CB37949Oeboo48Oct58wk996lNBbtWqVcm9xK+Leee99957g3z66aeXPC/lsf322wd56tSpSU08W2fFihVB3n333ZNj8u4x6paVK1cG+Xe/+10h11m+fHlZzhPv7/bbb09qZs2aFeSdd945qRk0aFCQH3nkkSDHr5u1zSeeAAAAACiExhMAAAAAhdB4AgAAAKAQGk8AAAAAFKLBDhdv3bp1sjZ9+vQgxwMKsyzL1qxZE+RTTz01yNOmTSvD7miI9ttvv2QtHlL44osvBvm9994rckvUIfEQ0r59+yY1Q4cOrantJLp27RrkvKGp8f1L7YkHK+cNRL377ruDHA95zrIse+KJJ4LctGnTIK9fvz455sQTT6zsNinAwIEDg9yxY8ek5oADDgjyqlWrqnyd+D1TlqXDxeNB51mWZY8++miQ4x/ZqIxzzjknWZs3b17J4+L3fvF+X3755eSYuvZDD3VRPLj3wQcfDHLeDxfEf/bxgPssS58vV111VVIT3+9t27bd4l6zrHJDwIsS/3Pnvc8777zzamg3jUv//v2DnPda9Yc//CHI3//+94M8ZcqU5JhOnToFebvttktqNm7cWNltQmLp0qXJWq9evYL81FNPJTUdOnQIcjw833BxAAAAABoFjScAAAAA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jScAAAAACqHxBAAAAEAhGsxw8cqYOHFikIcPH57UrFu3LsgPPvhgyfPGg8IPO+ywpKZ9+/ZBfuGFF5KaeIhrXg1QPx155JFBvu222wq5zpgxY5K1888/P8hNmjRJalatWrXFTPU899xzQT7mmGOSms985jOFXHvXXXcN8ve///2kpnXr1kHeZZddgvzss8+WvM6dd96ZrB133HGV2WLgkUceCfL48eOrfA5q1j777JOsHXLIIVt93rz3Z/EPxNDwtGjRIlk744wzgnzjjTcGebvttit53nfffTdZmzp1atU2R40ZNWpUslZqMHeWZVnPnj2DPGfOnDLtqOriYeh54v3V5n6pvvh18JRTTinkOqtXry7kvDXJJ54AAAAAKITGEwAAAACF0HgCAAAAoBD1csbT2rVrk7URI0YEOe/7wc2aNQvyXnvtVfJa++23X5DzZqNUVFSUPM/mzZuDfP/99yc1ZjrVb3vvvXeydsQRR1T5PPG8l7fffru6W6IOiZ8Tffv2TWrie2jGjBklzxufp1evXiWvnWfs2LEla9h6S5curdRaESZMmJCsdejQIcjxrIK8vcXzC7761a+WYXdZNm/evCB/8sknZTkv5dOxY8cgV+YZFdtmm/S/eb755ptB/uMf/5jUuB8annim01133ZXUnHrqqVt9nXjOapZl2Z/+9Kcgn3DCCUnNihUrtvralBbPQ6rOPKcsq1szkmbPnl2yZu7cuTWwE4pW1Pvn119/Pch9+vQp5Do1ySeeAAAAACiExhMAAAAAhdB4AgAAAKAQ9XLGU973/K+99tog//a3v01qdt111yB/85vfTGpat269xWvvvvvuyVr83eQ8119/fZDj/VL/xLMJbrzxxqSmXbt2VT7vt771rSA/88wzVT4Hdc+SJUuC3LVr16Tma1/7WpDz5jXFc+ZefPHFIN9xxx3JMYMGDQryG2+8kdRMnTo1WaPhW7169RZzPM8py7Lsl7/8ZZBbtWpVrWvfcsstQb7pppuqdR5qTzy/srri54/XvcZh3333DXI55jnladq0abJ20EEHBXnBggVJzZ577lnIfghVZqbT6NGjg1yX5jllWeVmOsV7zptHDP+/uOeQ936spmaElotPPAEAAABQCI0nAAAAAAqh8QQAAABAITSeAAAAAChEvRwuXhnPP/98ybW8AeSxeLDXm2++mdRUVFQE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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "cols = 8\n", "rows = 2\n", "fig = plt.figure(figsize=(2 * cols - 1, 2.5 * rows - 1))\n", "for i in range(cols):\n", " for j in range(rows):\n", " random_index = np.random.randint(0, len(y_tr))\n", " ax = fig.add_subplot(rows, cols, i * rows + j + 1)\n", " ax.grid('off')\n", " ax.axis('off')\n", " ax.imshow(x_tr[random_index, :], cmap = 'gray')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Отлично! Как вы помните, если пронормаровать данные, то сетка будет сходиться на порядок быстрее. \n", "\n", "Также, как вы помните из предыдущих скриптов, картинка - это тензор из циферок. Каждая циферка сообщает нам о яркости конкретного пикселя. Яркость измеряется по шкале от 0 до 255. В связи с этим фактом, нормализация будет немного странной: \n", "\n", "$$\n", "x_{norm} = \\frac{x}{255}\n", "$$" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "# делай раз\n", "x_train = x_tr/255\n", "x_test = x_ts/255\n", "\n", "# Оставляем одну размерность на число каналов\n", "x_train = np.reshape(x_train, (len(x_train), 28, 28, 1)) \n", "x_test = np.reshape(x_test, (len(x_test), 28, 28, 1)) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Также мы помним, что классы нужно конвертировать одним горячи кодированием (one-hot encoding) в набор из дамми-переменных. \n", "\n", "```\n", "0 → [1, 0, 0, 0, 0, 0, 0, 0, 0]\n", "1 → [0, 1, 0, 0, 0, 0, 0, 0, 0]\n", "2 → [0, 0, 1, 0, 0, 0, 0, 0, 0]\n", "3 → [0, 0, 0, 1, 0, 0, 0, 0, 0]\n", "etc...\n", "```" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0., 0., 0., ..., 1., 0., 0.],\n", " [0., 0., 1., ..., 0., 0., 0.],\n", " [0., 1., 0., ..., 0., 0., 0.],\n", " ...,\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.]])" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# делай два! \n", "y_train = keras.utils.to_categorical(y_tr,10)\n", "y_test = keras.utils.to_categorical(y_ts,10)\n", "\n", "# Размерность после конвертации будет вот такой: (?, NUM_CLASSES)\n", "y_test" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(60000, 28, 28, 1)\n", "(10000, 28, 28, 1)\n" ] } ], "source": [ "print(x_train.shape)\n", "print(x_test.shape)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. Выбираем для нашей нейросети архитектуру\n", "\n", "Свёрточная нейронная сеть строится из нескольких разных типов слоёв: \n", "\n", "* [Conv2D](https://keras.io/layers/convolutional/#conv2d) - Конволюция:\n", " - **filters**: число выходных каналов; \n", " - **kernel_size**: размер окна для свёртки;\n", " - **padding**: padding=\"same\" добавляет нулевую каёмку по краям картинки, чтбы после свёртки размеры картинки не изменялись; padding='valid' ничего не добавляет;\n", " - **activation**: \"relu\", \"tanh\", etc.\n", " - **input_shape**: размер входа\n", "* [MaxPooling2D](https://keras.io/layers/pooling/#maxpooling2d) - макспулинг\n", "* [Flatten](https://keras.io/layers/core/#flatten) - разворачивает картинку в вектор \n", "* [Dense](https://keras.io/layers/core/#dense) - полносвязный слой (fully-connected layer)\n", "* [Activation](https://keras.io/layers/core/#activation) - функция активации\n", "* [LeakyReLU](https://keras.io/layers/advanced-activations/#leakyrelu) - leaky relu активация\n", "* [Dropout](https://keras.io/layers/core/#dropout) - дропаут.\n", "\n", "\n", "В модели, которую мы определим ниже, на вход будет идти тензоры размера __(None, 28, 28, 1)__ и __(None, 10)__. На выходе мы будем получать вероятноть того, что объект относится к конкретному классу. Разменость __None__ заготовлена для размерности батча. " ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# подгружаем важные строительные блоки\n", "from keras.models import Sequential\n", "from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Activation, Dropout, InputLayer, LeakyReLU, Input" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.1 Полносвязная сетка \n", "\n", "Соберём двухслойную полносвязную сетку: \n", "\n", "* Вход\n", "* Развернём картинку в вектор \n", "* Полносвязный слой с 64 нейронами\n", "* RELU \n", "* Полносвязный слой с 32 нейронами \n", "* Dropout с вероятностью 0.5 \n", "* RELU \n", "* Полносвязный слой с 16 нейронами \n", "* Dropout с вероятностью 0.5 \n", "* RELU \n", "* Слой с 10 нейронами для клссов, в качестве активации используйте Softmax" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "model_1 = Sequential( )\n", "\n", "# 1. Добавляем входной слой с указанной формой входных данных\n", "model_1.add(Input(shape=(28, 28))) # Задаём форму входных данных через Input\n", "\n", "# 2. Первый полносвязный слой с 64 нейронами и функцией активации ReLU\n", "model_1.add(Flatten()) # Разворачиваем входное изображение в вектор\n", "model_1.add(Dense(64))\n", "model_1.add(Activation('relu'))\n", "\n", "# 3. Второй полносвязный слой с 32 нейронами и функцией активации ReLU\n", "model_1.add(Dense(32))\n", "model_1.add(Dropout(0.5)) # Dropout с вероятностью 0.5 для регуляризации\n", "model_1.add(Activation('relu'))\n", "\n", "# 4. Третий полносвязный слой с 16 нейронами и функцией активации ReLU\n", "model_1.add(Dense(16))\n", "model_1.add(Dropout(0.5)) # Dropout с вероятностью 0.5 для регуляризации\n", "model_1.add(Activation('relu'))\n", "\n", "# 5. Выходной слой с 10 нейронами (для классификации на 10 классов) и функцией активации Softmax\n", "model_1.add(Dense(10))\n", "model_1.add(Activation('softmax'))\n", "\n", "model_1.compile(\"adam\", \"categorical_crossentropy\", metrics=[\"accuracy\"])" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Model: \"sequential\"\n",
       "
\n" ], "text/plain": [ "\u001b[1mModel: \"sequential\"\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓\n",
       "┃ Layer (type)                          Output Shape                         Param # ┃\n",
       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩\n",
       "│ flatten (Flatten)                    │ (None, 784)                 │               0 │\n",
       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
       "│ dense (Dense)                        │ (None, 64)                  │          50,240 │\n",
       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
       "│ activation (Activation)              │ (None, 64)                  │               0 │\n",
       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
       "│ dense_1 (Dense)                      │ (None, 32)                  │           2,080 │\n",
       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
       "│ dropout (Dropout)                    │ (None, 32)                  │               0 │\n",
       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
       "│ activation_1 (Activation)            │ (None, 32)                  │               0 │\n",
       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
       "│ dense_2 (Dense)                      │ (None, 16)                  │             528 │\n",
       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
       "│ dropout_1 (Dropout)                  │ (None, 16)                  │               0 │\n",
       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
       "│ activation_2 (Activation)            │ (None, 16)                  │               0 │\n",
       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
       "│ dense_3 (Dense)                      │ (None, 10)                  │             170 │\n",
       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
       "│ activation_3 (Activation)            │ (None, 10)                  │               0 │\n",
       "└──────────────────────────────────────┴─────────────────────────────┴─────────────────┘\n",
       "
\n" ], "text/plain": [ "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓\n", "┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n", "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩\n", "│ flatten (\u001b[38;5;33mFlatten\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m784\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ dense (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m50,240\u001b[0m │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ activation (\u001b[38;5;33mActivation\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ dense_1 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m2,080\u001b[0m │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ dropout (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ activation_1 (\u001b[38;5;33mActivation\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ dense_2 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16\u001b[0m) │ \u001b[38;5;34m528\u001b[0m │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ dropout_1 (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ activation_2 (\u001b[38;5;33mActivation\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ dense_3 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m10\u001b[0m) │ \u001b[38;5;34m170\u001b[0m │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ activation_3 (\u001b[38;5;33mActivation\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m10\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", "└──────────────────────────────────────┴─────────────────────────────┴─────────────────┘\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
 Total params: 53,018 (207.10 KB)\n",
       "
\n" ], "text/plain": [ "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m53,018\u001b[0m (207.10 KB)\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
 Trainable params: 53,018 (207.10 KB)\n",
       "
\n" ], "text/plain": [ "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m53,018\u001b[0m (207.10 KB)\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
 Non-trainable params: 0 (0.00 B)\n",
       "
\n" ], "text/plain": [ "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "model_1.summary()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Можно визуализировать внутренними средствами keras сетку, которую мы собираем. " ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "G\n", "\n", "\n", "\n", "2429137156816\n", "\n", "\n", "\n", "\n", "flatten\n", " (Flatten)\n", "\n", "\n", "Input shape: \n", "(None, 28, 28)\n", "\n", "\n", "Output shape: \n", "(None, 784)\n", "\n", "\n", "\n", "2429137149568\n", "\n", "\n", "\n", "\n", "dense\n", " (Dense)\n", "\n", "\n", "Input shape: \n", "(None, 784)\n", "\n", "\n", "Output shape: \n", "(None, 64)\n", "\n", "\n", "\n", "2429137156816->2429137149568\n", "\n", "\n", "\n", "\n", "\n", "2429137149328\n", "\n", "\n", "\n", "\n", "activation\n", " (Activation)\n", "\n", "\n", "Input shape: \n", "(None, 64)\n", "\n", "\n", "Output shape: \n", "(None, 64)\n", "\n", "\n", "\n", "2429137149568->2429137149328\n", "\n", "\n", "\n", "\n", "\n", "2429137157632\n", "\n", "\n", "\n", "\n", "dense_1\n", " (Dense)\n", "\n", "\n", "Input shape: \n", "(None, 64)\n", "\n", "\n", "Output shape: \n", "(None, 32)\n", "\n", "\n", "\n", "2429137149328->2429137157632\n", "\n", "\n", "\n", "\n", "\n", "2429137123472\n", "\n", "\n", "\n", "\n", "dropout\n", " (Dropout)\n", "\n", "\n", "Input shape: \n", "(None, 32)\n", "\n", "\n", "Output shape: \n", "(None, 32)\n", "\n", "\n", "\n", "2429137157632->2429137123472\n", "\n", "\n", "\n", "\n", "\n", "2429137166288\n", "\n", "\n", "\n", "\n", "activation_1\n", " (Activation)\n", "\n", "\n", "Input shape: \n", "(None, 32)\n", "\n", "\n", "Output shape: \n", "(None, 32)\n", "\n", "\n", "\n", "2429137123472->2429137166288\n", "\n", "\n", "\n", "\n", "\n", "2429137172000\n", "\n", "\n", "\n", "\n", "dense_2\n", " (Dense)\n", "\n", "\n", "Input shape: \n", "(None, 32)\n", "\n", "\n", "Output shape: \n", "(None, 16)\n", "\n", "\n", "\n", "2429137166288->2429137172000\n", "\n", "\n", "\n", "\n", "\n", "2429137114592\n", "\n", "\n", "\n", "\n", "dropout_1\n", " (Dropout)\n", "\n", "\n", "Input shape: \n", "(None, 16)\n", "\n", "\n", "Output shape: \n", "(None, 16)\n", "\n", "\n", "\n", "2429137172000->2429137114592\n", "\n", "\n", "\n", "\n", "\n", "2429137118768\n", "\n", "\n", "\n", "\n", "activation_2\n", " (Activation)\n", "\n", "\n", "Input shape: \n", "(None, 16)\n", "\n", "\n", "Output shape: \n", "(None, 16)\n", "\n", "\n", "\n", "2429137114592->2429137118768\n", "\n", "\n", "\n", "\n", "\n", "2429137179888\n", "\n", "\n", "\n", "\n", "dense_3\n", " (Dense)\n", "\n", "\n", "Input shape: \n", "(None, 16)\n", "\n", "\n", "Output shape: \n", "(None, 10)\n", "\n", "\n", "\n", "2429137118768->2429137179888\n", "\n", "\n", "\n", "\n", "\n", "2429137187472\n", "\n", "\n", "\n", "\n", "activation_3\n", " (Activation)\n", "\n", "\n", "Input shape: \n", "(None, 10)\n", "\n", "\n", "Output shape: \n", "(None, 10)\n", "\n", "\n", "\n", "2429137179888->2429137187472\n", "\n", "\n", "\n", "\n", "" ], "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import SVG\n", "from keras.utils import model_to_dot\n", "\n", "SVG(model_to_dot(model_1, show_shapes=True, dpi=60).create(prog='dot', format='svg'))" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/5\n", "\u001b[1m1500/1500\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m13s\u001b[0m 6ms/step - accuracy: 0.4364 - loss: 1.5832 - val_accuracy: 0.9202 - val_loss: 0.4038\n", "Epoch 2/5\n", "\u001b[1m1500/1500\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m8s\u001b[0m 5ms/step - accuracy: 0.7256 - loss: 0.8545 - val_accuracy: 0.9391 - val_loss: 0.2817\n", "Epoch 3/5\n", "\u001b[1m1500/1500\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m8s\u001b[0m 5ms/step - accuracy: 0.7768 - loss: 0.7073 - val_accuracy: 0.9490 - val_loss: 0.2270\n", "Epoch 4/5\n", "\u001b[1m1500/1500\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m8s\u001b[0m 5ms/step - accuracy: 0.8016 - loss: 0.6395 - val_accuracy: 0.9555 - val_loss: 0.2025\n", "Epoch 5/5\n", "\u001b[1m1500/1500\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m8s\u001b[0m 5ms/step - accuracy: 0.8178 - loss: 0.5896 - val_accuracy: 0.9560 - val_loss: 0.2100\n" ] } ], "source": [ "# обучаем 5 эпох\n", "hist = model_1.fit(x_train, y_train, validation_split=0.2, epochs=5, verbose=1)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(hist.history['loss'])\n", "plt.plot(hist.history['val_loss'])\n", "plt.legend(['Train loss', 'Validation loss'])" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m313/313\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 4ms/step - accuracy: 0.9520 - loss: 0.2394\n", "\n", "Loss, Accuracy = [0.2147352546453476, 0.9567999839782715]\n" ] } ], "source": [ "print(\"\\nLoss, Accuracy = \", model_1.evaluate(x_test, y_test))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* Посмотрите на качество получившейся модели. Вернитесь по коду вверх и раскоментируйте строки, где картинки нормируются к отрезку $[0;1]$. Переобучите сетку. Что произошло с качеством? \n", "* Теперь попробуйте использовать в качестве функции активации линейную функцию. Что произошло с качеством модели? " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Можно посмотреть, где именно сетка ошибается. " ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m313/313\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step\n" ] } ], "source": [ "y_pred = model_1.predict(x_test)\n", "y_pred_classes = y_pred.argmax(axis=1)\n", "\n", "errors = y_pred_classes != y_ts\n", "\n", "x_err = x_ts[errors]\n", "y_err = y_ts[errors]\n", "y_pred = y_pred_classes[errors]" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "image/png": "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2F4vj7p16zpcx/ieaevWrVp86NAhh2vA+ipUqKDF5cuXN80ZPXq0Fue1flW+ztgryNhH6rfffjMdM27cOC1esGCBS3I5deqUFg8aNMg054svvnDJuWAtpUqV0mJ7f+N36tTJ6XWNvbtefvllh8fUr1/fNDZy5EgtPn36tNO55CXcYQUAAAAAAABLYcMKAAAAAAAAlsKGFQAAAAAAACyFHla5YPwss7FflT0JCQmmsXfffdfhnPT0dC1+4403spMiPMBeD6uuXbtq8ZEjR0xzRo0aleW69j4vbexhBWSlX79+3k4BWXjhhRe0uF27dqY5Bw4c0OKKFStq8WOPPWY65vr161r8+eefm+Y8+uijWnz06FHTnLCwMC029hOyp3Llylps7PUoYu4hM3bsWIfrIm958sknTWOOelbZq4NJkyZpcVpaWu4SA2BpN2/e1GJ7fcgAV2rRooVpzPh3dp06dRyus27dOtOYsQ9adhh7Y9nrg2zssdW+fXunz5OXcIcVAAAAAAAALIUNKwAAAAAAAFgKG1YAAAAAAACwFDasAAAAAAAAYCk0XXezK1euaPHs2bNNc4zN3uw1K92+fbsW79q1ywXZAfBl5cqV83YKyILxv4+9puv2xhwxNrfu3Lmzw2Puvfdeh3Oys46RUso0NmLECC1euXKlac6+ffucPhc8o0iRIqYx43uUatWqOVxn7dq1WjxmzJhc5YX8x3itmzp1qsNj5s2b56504OPsfckJ8r7nn3/eNGZssm7vvcw777yjxUOGDDHNuX37ttP5vP/++1o8efJk05zWrVtr8T//+U/TnClTpmhxRkaG07lYBXdYAQAAAAAAwFLYsAIAAAAAAIClsGEFAAAAAAAAS6GHlRPKli2rxd26ddNie59v/cc//qHFO3fuNM1ZtGiRFttsNtOcb7/9Ntt5wrM+//xz01irVq20+NixY06vGxAQkOOckD+FhIRocadOnZxe49NPPzWNnTx5Msc54e6MPXx69OhhmlO+fPks17h48aJpzNjXJTg42DTnl19+0eLQ0FDTnN27d2d5bnu2bNmixb169TLNMfY3iouLM82hh5V1lChRQot79uxpmhMTE6PF9t4PHTx4UItfeeUVF2SH/MzY469JkyZabO/6ePnyZbfmBN9hfE/VqFEjh8cYexeLiKSlpbksJ+Re0aJFtTg7/13fffdd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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "cols = 8\n", "rows = 2\n", "fig = plt.figure(figsize=(2 * cols - 1, 2.5 * rows - 1))\n", "for i in range(cols):\n", " for j in range(rows):\n", " random_index = np.random.randint(0, len(y_err))\n", " ax = fig.add_subplot(rows, cols, i * rows + j + 1)\n", " ax.grid('off')\n", " ax.axis('off')\n", " ax.imshow(x_err[random_index, : ], cmap='gray')\n", " ax.set_title('real_class: {} \\n predict class: {}'.format(y_err[random_index], y_pred[random_index]))\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.2 Свёрточная сетка \n", "\n", "Теперь давайте соберём свёртоную сеть: \n", "\n", "* Свёртка с ядром $5 \\times 5$, same padding и $32$ каналами\n", "* ReLU\n", "* Макспулинг размера $2 \\times 2$\n", "* Свёртка с ядром $5 \\times 5$ и $16$ каналами и same padding\n", "* ReLU\n", "* Макспулинг размера $2 \\times 2$ с шагом (strides) $2$ по обеим осям \n", "* Дальше используйте старую архитектуру " ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "model_2 = Sequential( )\n", "\n", "# Входной слой с указанием формы входных данных\n", "model_2.add(InputLayer(shape=(28, 28, 1)))\n", "\n", "# Первый свёрточный слой с ядром 5x5, 32 каналами, активацией ReLU и same padding\n", "model_2.add(Conv2D(32, (5, 5), padding='same'))\n", "model_2.add(Activation('relu'))\n", "\n", "# Макспулинг 2x2\n", "model_2.add(MaxPooling2D(pool_size=(2, 2)))\n", "\n", "# Второй свёрточный слой с ядром 5x5, 16 каналами, активацией ReLU и same padding\n", "model_2.add(Conv2D(16, (5, 5), padding='same'))\n", "model_2.add(Activation('relu'))\n", "\n", "# Макспулинг 2x2 с шагом 2 по обеим осям\n", "model_2.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))\n", "\n", "# Разворачиваем вектор для полносвязных слоев\n", "model_2.add(Flatten())\n", "\n", "# Полносвязный слой с 64 нейронами и активацией ReLU\n", "model_2.add(Dense(64))\n", "model_2.add(Activation('relu'))\n", "\n", "# Полносвязный слой с 32 нейронами и активацией ReLU\n", "model_2.add(Dense(32))\n", "model_2.add(Activation('relu'))\n", "\n", "# Полносвязный слой с 16 нейронами и активацией ReLU\n", "model_2.add(Dense(16))\n", "model_2.add(Activation('relu'))\n", "\n", "# Выходной слой для 10 классов с активацией softmax\n", "model_2.add(Dense(10))\n", "model_2.add(Activation('softmax'))\n", "\n", "model_2.compile(\"adam\", \"categorical_crossentropy\", metrics=[\"accuracy\"])" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [], "source": [ "model_2 = Sequential()\n", "\n", "# Входной слой с уменьшением числа фильтров\n", "model_2.add(InputLayer(shape=(28, 28, 1)))\n", "model_2.add(Conv2D(16, (3, 3), padding='same'))\n", "model_2.add(Activation('relu'))\n", "model_2.add(MaxPooling2D(pool_size=(2, 2)))\n", "\n", "# Уменьшаем количество фильтров во втором слое\n", "model_2.add(Conv2D(8, (3, 3), padding='same'))\n", "model_2.add(Activation('relu'))\n", "model_2.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))\n", "\n", "# Уменьшаем число нейронов в полносвязных слоях\n", "model_2.add(Flatten())\n", "model_2.add(Dense(32))\n", "model_2.add(Activation('relu'))\n", "model_2.add(Dense(16))\n", "model_2.add(Activation('relu'))\n", "\n", "# Выходной слой с 10 классами\n", "model_2.add(Dense(10))\n", "model_2.add(Activation('softmax'))\n", "\n", "# Компиляция модели\n", "model_2.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Model: \"sequential_4\"\n",
       "
\n" ], "text/plain": [ "\u001b[1mModel: \"sequential_4\"\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓\n",
       "┃ Layer (type)                          Output Shape                         Param # ┃\n",
       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩\n",
       "│ conv2d_6 (Conv2D)                    │ (None, 28, 28, 16)          │             160 │\n",
       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
       "│ activation_22 (Activation)           │ (None, 28, 28, 16)          │               0 │\n",
       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
       "│ max_pooling2d_6 (MaxPooling2D)       │ (None, 14, 14, 16)          │               0 │\n",
       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
       "│ conv2d_7 (Conv2D)                    │ (None, 14, 14, 8)           │           1,160 │\n",
       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
       "│ activation_23 (Activation)           │ (None, 14, 14, 8)           │               0 │\n",
       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
       "│ max_pooling2d_7 (MaxPooling2D)       │ (None, 7, 7, 8)             │               0 │\n",
       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
       "│ flatten_4 (Flatten)                  │ (None, 392)                 │               0 │\n",
       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
       "│ dense_16 (Dense)                     │ (None, 32)                  │          12,576 │\n",
       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
       "│ activation_24 (Activation)           │ (None, 32)                  │               0 │\n",
       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
       "│ dense_17 (Dense)                     │ (None, 16)                  │             528 │\n",
       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
       "│ activation_25 (Activation)           │ (None, 16)                  │               0 │\n",
       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
       "│ dense_18 (Dense)                     │ (None, 10)                  │             170 │\n",
       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
       "│ activation_26 (Activation)           │ (None, 10)                  │               0 │\n",
       "└──────────────────────────────────────┴─────────────────────────────┴─────────────────┘\n",
       "
\n" ], "text/plain": [ "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓\n", "┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n", "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩\n", "│ conv2d_6 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m16\u001b[0m) │ \u001b[38;5;34m160\u001b[0m │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ activation_22 (\u001b[38;5;33mActivation\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m16\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ max_pooling2d_6 (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m14\u001b[0m, \u001b[38;5;34m14\u001b[0m, \u001b[38;5;34m16\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ conv2d_7 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m14\u001b[0m, \u001b[38;5;34m14\u001b[0m, \u001b[38;5;34m8\u001b[0m) │ \u001b[38;5;34m1,160\u001b[0m │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ activation_23 (\u001b[38;5;33mActivation\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m14\u001b[0m, \u001b[38;5;34m14\u001b[0m, \u001b[38;5;34m8\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ max_pooling2d_7 (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m7\u001b[0m, \u001b[38;5;34m7\u001b[0m, \u001b[38;5;34m8\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ flatten_4 (\u001b[38;5;33mFlatten\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m392\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ dense_16 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m12,576\u001b[0m │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ activation_24 (\u001b[38;5;33mActivation\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ dense_17 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16\u001b[0m) │ \u001b[38;5;34m528\u001b[0m │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ activation_25 (\u001b[38;5;33mActivation\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ dense_18 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m10\u001b[0m) │ \u001b[38;5;34m170\u001b[0m │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ activation_26 (\u001b[38;5;33mActivation\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m10\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", "└──────────────────────────────────────┴─────────────────────────────┴─────────────────┘\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
 Total params: 14,594 (57.01 KB)\n",
       "
\n" ], "text/plain": [ "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m14,594\u001b[0m (57.01 KB)\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
 Trainable params: 14,594 (57.01 KB)\n",
       "
\n" ], "text/plain": [ "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m14,594\u001b[0m (57.01 KB)\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
 Non-trainable params: 0 (0.00 B)\n",
       "
\n" ], "text/plain": [ "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "model_2.summary()" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/30\n", "\u001b[1m1500/1500\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m14s\u001b[0m 7ms/step - accuracy: 0.7611 - loss: 0.7332 - val_accuracy: 0.9593 - val_loss: 0.1340\n", "Epoch 2/30\n", "\u001b[1m1500/1500\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m10s\u001b[0m 6ms/step - accuracy: 0.9602 - loss: 0.1302 - val_accuracy: 0.9665 - val_loss: 0.1053\n", "Epoch 3/30\n", "\u001b[1m1500/1500\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m10s\u001b[0m 6ms/step - accuracy: 0.9716 - loss: 0.0955 - val_accuracy: 0.9769 - val_loss: 0.0775\n", "Epoch 4/30\n", "\u001b[1m1500/1500\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m11s\u001b[0m 7ms/step - accuracy: 0.9766 - loss: 0.0741 - val_accuracy: 0.9772 - val_loss: 0.0788\n", "Epoch 5/30\n", "\u001b[1m1500/1500\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m10s\u001b[0m 7ms/step - accuracy: 0.9799 - loss: 0.0632 - val_accuracy: 0.9804 - val_loss: 0.0644\n", "Epoch 6/30\n", "\u001b[1m1500/1500\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m10s\u001b[0m 6ms/step - accuracy: 0.9823 - loss: 0.0578 - val_accuracy: 0.9790 - val_loss: 0.0741\n", "Epoch 7/30\n", "\u001b[1m1500/1500\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m10s\u001b[0m 6ms/step - accuracy: 0.9837 - loss: 0.0514 - val_accuracy: 0.9790 - val_loss: 0.0670\n", "Epoch 8/30\n", "\u001b[1m1500/1500\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m10s\u001b[0m 7ms/step - accuracy: 0.9860 - loss: 0.0435 - val_accuracy: 0.9791 - val_loss: 0.0725\n", "Epoch 9/30\n", "\u001b[1m1500/1500\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m10s\u001b[0m 7ms/step - accuracy: 0.9880 - loss: 0.0386 - val_accuracy: 0.9844 - val_loss: 0.0597\n", "Epoch 10/30\n", "\u001b[1m1500/1500\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m10s\u001b[0m 7ms/step - accuracy: 0.9886 - loss: 0.0359 - val_accuracy: 0.9855 - val_loss: 0.0504\n", "Epoch 11/30\n", "\u001b[1m1500/1500\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m10s\u001b[0m 7ms/step - accuracy: 0.9905 - loss: 0.0312 - val_accuracy: 0.9823 - val_loss: 0.0624\n", "Epoch 12/30\n", "\u001b[1m1500/1500\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m11s\u001b[0m 7ms/step - accuracy: 0.9910 - loss: 0.0284 - val_accuracy: 0.9837 - val_loss: 0.0567\n", "Epoch 13/30\n", "\u001b[1m1500/1500\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m10s\u001b[0m 7ms/step - accuracy: 0.9906 - loss: 0.0282 - val_accuracy: 0.9836 - val_loss: 0.0594\n", "Epoch 14/30\n", "\u001b[1m1500/1500\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m10s\u001b[0m 7ms/step - accuracy: 0.9913 - loss: 0.0272 - val_accuracy: 0.9847 - val_loss: 0.0535\n", "Epoch 15/30\n", "\u001b[1m1500/1500\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m10s\u001b[0m 7ms/step - accuracy: 0.9909 - loss: 0.0261 - val_accuracy: 0.9834 - val_loss: 0.0632\n" ] } ], "source": [ "# обучаем 5 эпох\n", "# hist = model_2.fit(x_train, y_train, validation_split=0.2, epochs=5, verbose=1)\n", "\n", "from keras.callbacks import EarlyStopping\n", "\n", "# Обучение на большем числе эпох, с ранней остановкой\n", "early_stopping_monitor = EarlyStopping(patience=5, restore_best_weights=True)\n", "hist = model_2.fit(x_train, y_train, epochs=30, batch_size=32, validation_split=0.2, callbacks=[early_stopping_monitor])" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiwAAAGdCAYAAAAxCSikAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABXr0lEQVR4nO3deVxU9eI+8GcWmGEd9k0WUVFcUBFckDQrQy1Nb4u0iFmWWWqRfcu8Zmn3V+Qt0yy17N7i2qJkZVmpiS0uaWkoZmqKhUIKsogM6wAz5/fHYQZHFmdwNuB5v5oXM2fO8jlIzMNnlQiCIICIiIjIgUntXQAiIiKiq2FgISIiIofHwEJEREQOj4GFiIiIHB4DCxERETk8BhYiIiJyeAwsRERE5PAYWIiIiMjhye1dAEvR6XQ4f/48PDw8IJFI7F0cIiIiMoEgCKioqEBISAik0tbrUTpNYDl//jzCwsLsXQwiIiJqh/z8fISGhrb6fqcJLB4eHgDEG/b09LRzaYiIiMgUarUaYWFhhs/x1nSawKJvBvL09GRgISIi6mCu1p2DnW6JiIjI4TGwEBERkcNjYCEiIiKH12n6sBARkeUIgoCGhgZotVp7F4U6OJlMBrlcfs1TjjCwEBGRkbq6OhQUFKC6utreRaFOwtXVFcHBwXB2dm73ORhYiIjIQKfTITc3FzKZDCEhIXB2duZknNRugiCgrq4OxcXFyM3NRVRUVJuTw7WFgYWIiAzq6uqg0+kQFhYGV1dXexeHOgEXFxc4OTnh7NmzqKurg1KpbNd52OmWiIiaae9fwUQtscTPE38iiYiIyOG1K7CsWbMGkZGRUCqViIuLw549e1rdd+/evUhMTISvry9cXFwQHR2NFStWGO2Tnp4OiUTS7FFbW9ue4hEREVEnY3YfloyMDKSmpmLNmjVITEzEO++8gwkTJuD48eMIDw9vtr+bmxvmzp2LgQMHws3NDXv37sUjjzwCNzc3zJo1y7Cfp6cnTp48aXRse9u5iIiIrtWYMWMwePBgrFy50q7nIJHZgeX111/HzJkz8dBDDwEAVq5ciW+//RZr165FWlpas/1jY2MRGxtreN29e3d8/vnn2LNnj1FgkUgkCAoKas89EBFRF3a1UUz3338/0tPTzT7v559/Dicnp3aWiizNrCahuro6ZGVlISkpyWh7UlIS9u3bZ9I5Dh8+jH379uH666832l5ZWYmIiAiEhoZi4sSJOHz4cJvn0Wg0UKvVRg9r+N++M1jw6W/ILamyyvmJiOjaFBQUGB4rV66Ep6en0bY33njDaP/6+nqTzuvj43PVFYTJdswKLCUlJdBqtQgMDDTaHhgYiMLCwjaPDQ0NhUKhQHx8PObMmWOooQGA6OhopKenY8uWLdiwYQOUSiUSExORk5PT6vnS0tKgUqkMj7CwMHNuxWSbD59Dxq/5OFlonUBEROTIBEFAdV2DXR6CIJhUxqCgIMNDpVIZauyDgoJQW1sLLy8vfPLJJxgzZgyUSiU+/PBDlJaW4p577kFoaChcXV0RExODDRs2GJ13zJgxSE1NNbzu3r07Xn75ZTz44IPw8PBAeHg41q1bZ9b3s6ysDNOnT4e3tzdcXV0xYcIEo8+6s2fPYtKkSfD29oabmxv69++PrVu3Go6977774O/vDxcXF0RFReH999836/odWbvmYbmy+k0QhKtWye3ZsweVlZX4+eef8eyzz6JXr1645557AAAjRozAiBEjDPsmJiZiyJAhePPNN7Fq1aoWz7dw4ULMnz/f8FqtVlsltIT7uCI7/xLyLnLGRyLqemrqtej3/Ld2ufbxF8fB1dky04UtWLAAy5cvx/vvvw+FQoHa2lrExcVhwYIF8PT0xDfffIOUlBT06NEDw4cPb/U8y5cvx7/+9S/885//xKeffopHH30Uo0ePRnR0tEnlmDFjBnJycrBlyxZ4enpiwYIFuOWWW3D8+HE4OTlhzpw5qKurw+7du+Hm5objx4/D3d0dALB48WIcP34c27Ztg5+fH06fPo2amhqLfH86ArN+Evz8/CCTyZrVphQVFTWrdblSZGQkACAmJgYXLlzAkiVLDIHlSlKpFEOHDm2zhkWhUEChUJhT/HaJ8BUnTjpbysBCRNRRpaam4vbbbzfa9n//93+G5/PmzcP27duxadOmNgPLLbfcgsceewyAGIJWrFiBH3/80aTAog8qP/30E0aOHAkA+OijjxAWFoYvvvgCd911F/Ly8nDHHXcgJiYGANCjRw/D8Xl5eYiNjUV8fDwAscanKzErsDg7OyMuLg6ZmZn4xz/+YdiemZmJyZMnm3weQRCg0WjafD87O9vwD2ZPYT5iYGENCxF1RS5OMhx/cZzdrm0p+g95Pa1Wi1deeQUZGRk4d+4cNBoNNBoN3Nzc2jzPwIEDDc/1TU9FRUUmleHEiROQy+VGgcjX1xd9+vTBiRMnAACPP/44Hn30UezYsQNjx47FHXfcYbjmo48+ijvuuAOHDh1CUlISpkyZYgg+XYHZdW3z589HSkoK4uPjkZCQgHXr1iEvLw+zZ88GIDbVnDt3DuvXrwcArF69GuHh4Yb0uXfvXrz22muYN2+e4ZxLly7FiBEjEBUVBbVajVWrViE7OxurV6+2xD1ekwgGFiLqwiQSicWaZezpyiCyfPlyrFixAitXrkRMTAzc3NyQmpqKurq6Ns9z5aghiUQCnU5nUhla65NzebeKhx56COPGjcM333yDHTt2IC0tDcuXL8e8efMwYcIEnD17Ft988w127tyJm266CXPmzMFrr71m0vU7OrN/CpOTk1FaWooXX3wRBQUFGDBgALZu3YqIiAgAYm/tvLw8w/46nQ4LFy5Ebm4u5HI5evbsiVdeeQWPPPKIYZ9Lly5h1qxZKCwshEqlQmxsLHbv3o1hw4ZZ4BavTXhjk9C5sho0aHWQyzg5MBFRR7dnzx5MnjwZ06ZNAyB+VuXk5KBv375Wu2a/fv3Q0NCAX375xVAzUlpailOnThldNywsDLNnz8bs2bOxcOFCvPvuu4Y/8v39/TFjxgzMmDEDo0aNwtNPP83A0pbHHnvM0IZ3pSvHus+bN8+oNqUlK1asaDb7raMI9FDCWS5FXYMOBeW1hiYiIiLquHr16oXPPvsM+/btg7e3N15//XUUFhZaNbBERUVh8uTJePjhh/HOO+/Aw8MDzz77LLp162boVpGamooJEyagd+/eKCsrw/fff28o0/PPP4+4uDj0798fGo0GX3/9tVXL62hYXXAVUqkEYd4uANgsRETUWSxevBhDhgzBuHHjMGbMGAQFBWHKlClWv+7777+PuLg4TJw4EQkJCRAEAVu3bjU0NWm1WsyZMwd9+/bF+PHj0adPH6xZswaA2I904cKFGDhwIEaPHg2ZTIaNGzdavcyOQiKYOtDdwanVaqhUKpSXl8PT09Oi537g/QP44WQx0m6PwT3Dmi8/QETUWdTW1iI3N9ewXhyRJbT1c2Xq5zdrWEwQ4St21uLQZiIiIvtgYDGBvt9KPpuEiIiI7IKBxQT6oc1nL3I9ISIiIntgYDGBfmhzHpuEiIiI7IKBxQRh3mJgUdc24FJ125MKERERkeUxsJjAxVmGAA9x3SIObSYiIrI9BhYThftwEUQiIiJ7YWAxkaEfC2tYiIiIbI6BxUThHNpMRNSpjRkzBqmpqYbX3bt3x8qVK9s8RiKR4Isvvrjma1vqPG1ZsmQJBg8ebNVrWBMDi4kifNkkRETkiCZNmoSxY8e2+N7+/fshkUhw6NAhs8978OBBzJo161qLZ6S10FBQUIAJEyZY9FqdDQOLifQ1LGwSIiJyLDNnzsT333+Ps2fPNnvvvffew+DBgzFkyBCzz+vv7w9XV9sseBsUFASFQmGTa3VUDCwmCvcRp+cvKK9BXYPOzqUhIiK9iRMnIiAgAOnp6Ubbq6urkZGRgZkzZ6K0tBT33HMPQkND4erqipiYGGzYsKHN817ZJJSTk4PRo0dDqVSiX79+yMzMbHbMggUL0Lt3b7i6uqJHjx5YvHgx6uvrAQDp6elYunQpjhw5AolEAolEYijzlU1CR48exY033ggXFxf4+vpi1qxZqKysNLw/Y8YMTJkyBa+99hqCg4Ph6+uLOXPmGK5lCp1OhxdffBGhoaFQKBQYPHgwtm/fbni/rq4Oc+fORXBwMJRKJbp37460tDTD+0uWLEF4eDgUCgVCQkLw+OOPm3zt9pBb9eydiJ+7M1ycZKip1+LcpRpE+rnZu0hERNYnCEC9nWqWnVwBieSqu8nlckyfPh3p6el4/vnnIWk8ZtOmTairq8N9992H6upqxMXFYcGCBfD09MQ333yDlJQU9OjRA8OHD7/qNXQ6HW6//Xb4+fnh559/hlqtNurvoufh4YH09HSEhITg6NGjePjhh+Hh4YFnnnkGycnJ+P3337F9+3bs3LkTAKBSqZqdo7q6GuPHj8eIESNw8OBBFBUV4aGHHsLcuXONQtkPP/yA4OBg/PDDDzh9+jSSk5MxePBgPPzww1e9HwB44403sHz5crzzzjuIjY3Fe++9h9tuuw3Hjh1DVFQUVq1ahS1btuCTTz5BeHg48vPzkZ+fDwD49NNPsWLFCmzcuBH9+/dHYWEhjhw5YtJ124uBxUQSiQThPq44eaECZ0urGFiIqGuorwZeDrHPtf95HnA27Xftgw8+iFdffRU//vgjbrjhBgBic9Dtt98Ob29veHt74//+7/8M+8+bNw/bt2/Hpk2bTAosO3fuxIkTJ3DmzBmEhoYCAF5++eVm/U6ee+45w/Pu3bvjqaeeQkZGBp555hm4uLjA3d0dcrkcQUFBrV7ro48+Qk1NDdavXw83N/H+33rrLUyaNAnLli1DYGAgAMDb2xtvvfUWZDIZoqOjceutt+K7774zObC89tprWLBgAe6++24AwLJly/DDDz9g5cqVWL16NfLy8hAVFYXrrrsOEokEERERhmPz8vIQFBSEsWPHwsnJCeHh4Rg2bJhJ120vNgmZQT+0mSOFiIgcS3R0NEaOHIn33nsPAPDnn39iz549ePDBBwEAWq0WL730EgYOHAhfX1+4u7tjx44dyMvLM+n8J06cQHh4uCGsAEBCQkKz/T799FNcd911CAoKgru7OxYvXmzyNS6/1qBBgwxhBQASExOh0+lw8uRJw7b+/ftDJpMZXgcHB6OoqMika6jVapw/fx6JiYlG2xMTE3HixAkAYrNTdnY2+vTpg8cffxw7duww7HfXXXehpqYGPXr0wMMPP4zNmzejoaHBrPs0F2tYzMDJ44ioy3FyFWs67HVtM8ycORNz587F6tWr8f777yMiIgI33XQTAGD58uVYsWIFVq5ciZiYGLi5uSE1NRV1daYttyIIQrNtkiuaq37++WfcfffdWLp0KcaNGweVSoWNGzdi+fLlZt2HIAjNzt3SNZ2cnJq9p9OZ18fyyutcfu0hQ4YgNzcX27Ztw86dOzF16lSMHTsWn376KcLCwnDy5ElkZmZi586deOyxx/Dqq69i165dzcplKaxhMUMEJ48joq5GIhGbZezxMKH/yuWmTp0KmUyGjz/+GP/73//wwAMPGD589+zZg8mTJ2PatGkYNGgQevTogZycHJPP3a9fP+Tl5eH8+abwtn//fqN9fvrpJ0RERGDRokWIj49HVFRUs5FLzs7O0Gq1V71WdnY2qqqqjM4tlUrRu3dvk8vcFk9PT4SEhGDv3r1G2/ft24e+ffsa7ZecnIx3330XGRkZ+Oyzz3Dx4kUAgIuLC2677TasWrUKP/74I/bv34+jR49apHwtYQ2LGcI4tJmIyGG5u7sjOTkZ//znP1FeXo4ZM2YY3uvVqxc+++wz7Nu3D97e3nj99ddRWFho9OHclrFjx6JPnz6YPn06li9fDrVajUWLFhnt06tXL+Tl5WHjxo0YOnQovvnmG2zevNlon+7duyM3NxfZ2dkIDQ2Fh4dHs+HM9913H1544QXcf//9WLJkCYqLizFv3jykpKQY+q9YwtNPP40XXngBPXv2xODBg/H+++8jOzsbH330EQBgxYoVCA4OxuDBgyGVSrFp0yYEBQXBy8sL6enp0Gq1GD58OFxdXfHBBx/AxcXFqJ+LpbGGxQwRlwWWlqoHiYjIvmbOnImysjKMHTsW4eHhhu2LFy/GkCFDMG7cOIwZMwZBQUGYMmWKyeeVSqXYvHkzNBoNhg0bhoceeggvvfSS0T6TJ0/Gk08+iblz52Lw4MHYt28fFi9ebLTPHXfcgfHjx+OGG26Av79/i0OrXV1d8e233+LixYsYOnQo7rzzTtx000146623zPtmXMXjjz+Op556Ck899RRiYmKwfft2bNmyBVFRUQDEALhs2TLEx8dj6NChOHPmDLZu3QqpVAovLy+8++67SExMxMCBA/Hdd9/hq6++gq+vr0XLeDmJ0Ek+edVqNVQqFcrLy+Hp6WmVa2gatIhevB2CAPz63Fj4uXOSHyLqXGpra5Gbm4vIyEgolUp7F4c6ibZ+rkz9/GYNixkUchlCVC4A2PGWiIjIlhhYzBTmIwYWDm0mIiKyHQYWM3FoMxERke0xsJgpwlecyIcjhYiIiGyHgcVMTUObq66yJxEREVkKA4uZIjgXCxF1AZ1kACk5CEv8PDGwmEnfh+WCWoPa+rZnKyQi6mj006pXV/OPMrIc/c/TtUzbz5luzeTl6gQPpRwVtQ3Iv1iNqEAPexeJiMhiZDIZvLy8DIvoubq6trquDdHVCIKA6upqFBUVwcvLy2ixRnMxsJhJIpEg3McVx86rkcfAQkSdUFBQEACYvPIv0dV4eXkZfq7ai4GlHSJ8xcDCoc1E1BlJJBIEBwcjICAA9fX19i4OdXBOTk7XVLOix8DSDlwEkYi6AplMZpEPGiJLYKfbdghnYCEiIrIpBpZ2iPDh5HFERES2xMDSDpfXsOh0nKuAiIjI2hhY2iHESwmZVIK6Bh2KKjT2Lg4REVGnx8DSDnKZFN28xFWb2SxERERkfQws7RThq1+1mWsKERERWRsDSzvphzbns4aFiIjI6hhY2km/COJZBhYiIiKra1dgWbNmDSIjI6FUKhEXF4c9e/a0uu/evXuRmJgIX19fuLi4IDo6GitWrGi232effYZ+/fpBoVCgX79+2Lx5c3uKZjOci4WIiMh2zA4sGRkZSE1NxaJFi3D48GGMGjUKEyZMQF5eXov7u7m5Ye7cudi9ezdOnDiB5557Ds899xzWrVtn2Gf//v1ITk5GSkoKjhw5gpSUFEydOhW//PJL++/Mygyz3XJ6fiIiIquTCIJg1kQiw4cPx5AhQ7B27VrDtr59+2LKlClIS0sz6Ry333473Nzc8MEHHwAAkpOToVarsW3bNsM+48ePh7e3NzZs2GDSOdVqNVQqFcrLy+Hp6WnGHbWPurYeA5fsAAD8vnQc3BVc5YCIiMhcpn5+m1XDUldXh6ysLCQlJRltT0pKwr59+0w6x+HDh7Fv3z5cf/31hm379+9vds5x48a1eU6NRgO1Wm30sCVPpRO8XZ0AsJaFiIjI2swKLCUlJdBqtQgMDDTaHhgYiMLCwjaPDQ0NhUKhQHx8PObMmYOHHnrI8F5hYaHZ50xLS4NKpTI8wsLCzLkViwj35RT9REREttCuTrcSicTotSAIzbZdac+ePfj111/x9ttvY+XKlc2aesw958KFC1FeXm545Ofnm3kX1y6cQ5uJiIhswqyOF35+fpDJZM1qPoqKiprVkFwpMjISABATE4MLFy5gyZIluOeeewAAQUFBZp9ToVBAoVCYU3yLaxrazMnjiIiIrMmsGhZnZ2fExcUhMzPTaHtmZiZGjhxp8nkEQYBG07QGT0JCQrNz7tixw6xz2kPT0OYaO5eEiIioczN7aMv8+fORkpKC+Ph4JCQkYN26dcjLy8Ps2bMBiE01586dw/r16wEAq1evRnh4OKKjowGI87K89tprmDdvnuGcTzzxBEaPHo1ly5Zh8uTJ+PLLL7Fz507s3bvXEvdoNeG++qHNrGEhIiKyJrMDS3JyMkpLS/Hiiy+ioKAAAwYMwNatWxEREQEAKCgoMJqTRafTYeHChcjNzYVcLkfPnj3xyiuv4JFHHjHsM3LkSGzcuBHPPfccFi9ejJ49eyIjIwPDhw+3wC1aj76G5e+yGmh1AmTStvvxEBERUfuYPQ+Lo7L1PCwAoNUJ6Lt4O+q0Oux55gbDZHJERERkGqvMw0LGZFIJQn1cAHCkEBERkTUxsFyjcC6CSEREZHUMLNcogosgEhERWR0DyzUKY2AhIiKyOgaWaxShn56f6wkRERFZDQPLNQpnDQsREZHVMbBcI31gKa+pR3l1vZ1LQ0RE1DkxsFwjF2cZ/D3ENY1Yy0JERGQdDCwWEM5FEImIiKyKgcUCOLSZiIjIuhhYLMAwtJkjhYiIiKyCgcUCInxZw0JERGRNDCwWwKHNRERE1sXAYgHhjTUs5y/VoK5BZ+fSEBERdT4MLBbg766A0kkKnSCGFiIiIrIsBhYLkEgkXLWZiIjIihhYLCTcp3FNIQYWIiIii2NgsRBDx9tSTh5HRERkaQwsFsKhzURERNbDwGIhhj4snDyOiIjI4hhYLEQ/tDn/YjUEQbBzaYiIiDoXBhYLCfV2gUQCVNVpcbGqzt7FISIi6lQYWCxEIZch2FMJgEObiYiILI2BxYL0iyDmM7AQERFZFAOLBbHjLRERkXUwsFgQhzYTERFZBwOLBYUZJo9jYCEiIrIkBhYLivDl9PxERETWwMBiQfo+LIXqWtTWa+1cGiIios6DgcWCvF2d4KGQAwD+LmMtCxERkaUwsFiQRCJp6sfCZiEiIiKLYWCxMP1IIQ5tJiIishwGFgsLZw0LERGRxTGwWBiHNhMREVkeA4uFcfI4IiIiy2NgsbDLm4R0OsHOpSEiIuocGFgsLMTLBTKpBJoGHYorNfYuDhERUafAwGJhTjIpQryUADhSiIiIyFIYWKwgwodT9BMREVkSA4sVNI0UqrJzSYiIiDoHBhYr4EghIiIiy2pXYFmzZg0iIyOhVCoRFxeHPXv2tLrv559/jptvvhn+/v7w9PREQkICvv32W6N90tPTIZFImj1qa2vbUzy74+RxRERElmV2YMnIyEBqaioWLVqEw4cPY9SoUZgwYQLy8vJa3H/37t24+eabsXXrVmRlZeGGG27ApEmTcPjwYaP9PD09UVBQYPRQKpXtuys7Y2AhIiKyLIkgCGZNFjJ8+HAMGTIEa9euNWzr27cvpkyZgrS0NJPO0b9/fyQnJ+P5558HINawpKam4tKlS+YUxYharYZKpUJ5eTk8PT3bfR5LUNfWY+CSHQCAY0vHwa1xBWciIiIyZurnt1k1LHV1dcjKykJSUpLR9qSkJOzbt8+kc+h0OlRUVMDHx8doe2VlJSIiIhAaGoqJEyc2q4G5kkajgVqtNno4Ck+lE7xcnQCwloWIiMgSzAosJSUl0Gq1CAwMNNoeGBiIwsJCk86xfPlyVFVVYerUqYZt0dHRSE9Px5YtW7BhwwYolUokJiYiJyen1fOkpaVBpVIZHmFhYebcitVFsFmIiIjIYtrV6VYikRi9FgSh2baWbNiwAUuWLEFGRgYCAgIM20eMGIFp06Zh0KBBGDVqFD755BP07t0bb775ZqvnWrhwIcrLyw2P/Pz89tyK1XARRCIiIssxq3OFn58fZDJZs9qUoqKiZrUuV8rIyMDMmTOxadMmjB07ts19pVIphg4d2mYNi0KhgEKhML3wNsahzURERJZjVg2Ls7Mz4uLikJmZabQ9MzMTI0eObPW4DRs2YMaMGfj4449x6623XvU6giAgOzsbwcHB5hTPoehHCp1lYCEiIrpmZg9fmT9/PlJSUhAfH4+EhASsW7cOeXl5mD17NgCxqebcuXNYv349ADGsTJ8+HW+88QZGjBhhqJ1xcXGBSqUCACxduhQjRoxAVFQU1Go1Vq1ahezsbKxevdpS92lz4Y3T8+czsBAREV0zswNLcnIySktL8eKLL6KgoAADBgzA1q1bERERAQAoKCgwmpPlnXfeQUNDA+bMmYM5c+YYtt9///1IT08HAFy6dAmzZs1CYWEhVCoVYmNjsXv3bgwbNuwab89+whubhP4uq4ZWJ0AmvXofHyIiImqZ2fOwOCpHmocFALQ6AdGLt6FeK2DvghsQ6u1q7yIRERE5HKvMw0Kmk0klCPNmx1siIiJLYGCxIg5tJiIisgwGFivi0GYiIiLLYGCxIg5tJiIisgwGFivSBxYObSYiIro2DCxWpB/afJZ9WIiIiK4JA4sV6WtYymvqUV5db+fSEBERdVwMLFbk6iyHn7u43lF+GWtZiIiI2ouBxcrCfVwAsFmIiIjoWjCwWFmEr7imEIc2ExERtR8Di5UZJo+7WGXnkhAREXVcDCxWFuHDyeOIiIiuFQOLlXFoMxER0bVjYLEyfQ3L+Us1qNfq7FwaIiKijomBxcr8PRRQyKXQCcC5shp7F4eIiKhDYmCxMolEYphAjv1YiIiI2oeBxQa4ajMREdG1YWCxgTDWsBAREV0TBhYbMAxt5kghIiKidmFgsQHD0GbWsBAREbULA4sNhPuI0/PnX6yGIAh2Lg0REVHHw8BiA6HeLpBIgEpNAy5W1dm7OERERB0OA4sNKJ1kCPJUAmDHWyIiovZgYLERjhQiIiJqPwYWGwnnSCEiIqJ2Y2CxEa7aTERE1H4MLDbCoc1ERETtx8BiI/omoXwGFiIiIrMxsNiIPrAUqmtRW6+1c2mIiIg6FgYWG/Fxc4a7Qg5BAP4uq7F3cYiIiDoUBhYbkUgklw1trrJzaYiIiDoWBhYb4iKIRERE7cPAYkMcKURERNQ+DCw2FMaRQkRERO3CwGJDnDyOiIiofRhYbCj8ssAiCIKdS0NERNRxMLDYUDdvF0glQG29DsUVGnsXh4iIqMNgYLEhJ5kUIV4uANjxloiIyBwMLDYW4cuhzUREROZiYLExfT8W1rAQERGZjoHFxsJ93ABwaDMREZE52hVY1qxZg8jISCiVSsTFxWHPnj2t7vv555/j5ptvhr+/Pzw9PZGQkIBvv/222X6fffYZ+vXrB4VCgX79+mHz5s3tKZrDM9SwlHJ6fiIiIlOZHVgyMjKQmpqKRYsW4fDhwxg1ahQmTJiAvLy8FvffvXs3br75ZmzduhVZWVm44YYbMGnSJBw+fNiwz/79+5GcnIyUlBQcOXIEKSkpmDp1Kn755Zf235mDahrazAUQiYiITCURzJwQZPjw4RgyZAjWrl1r2Na3b19MmTIFaWlpJp2jf//+SE5OxvPPPw8ASE5OhlqtxrZt2wz7jB8/Ht7e3tiwYYNJ51Sr1VCpVCgvL4enp6cZd2Rb5TX1GLR0BwDg+Ivj4Oost3OJiIiI7MfUz2+zaljq6uqQlZWFpKQko+1JSUnYt2+fSefQ6XSoqKiAj4+PYdv+/fubnXPcuHFtnlOj0UCtVhs9OgKVixNULk4AOOMtERGRqcwKLCUlJdBqtQgMDDTaHhgYiMLCQpPOsXz5clRVVWHq1KmGbYWFhWafMy0tDSqVyvAICwsz407si0ObiYiIzNOuTrcSicTotSAIzba1ZMOGDViyZAkyMjIQEBBwTedcuHAhysvLDY/8/Hwz7sC+wrimEBERkVnM6kDh5+cHmUzWrOajqKioWQ3JlTIyMjBz5kxs2rQJY8eONXovKCjI7HMqFAooFApziu8wuAgiERGRecyqYXF2dkZcXBwyMzONtmdmZmLkyJGtHrdhwwbMmDEDH3/8MW699dZm7yckJDQ7544dO9o8Z0fWNLSZgYWIiMgUZg9RmT9/PlJSUhAfH4+EhASsW7cOeXl5mD17NgCxqebcuXNYv349ADGsTJ8+HW+88QZGjBhhqElxcXGBSqUCADzxxBMYPXo0li1bhsmTJ+PLL7/Ezp07sXfvXkvdp0MJb+zDwsnjiIiITGN2H5bk5GSsXLkSL774IgYPHozdu3dj69atiIiIAAAUFBQYzcnyzjvvoKGhAXPmzEFwcLDh8cQTTxj2GTlyJDZu3Ij3338fAwcORHp6OjIyMjB8+HAL3KLj0dew5JdVQ6sza1Q5ERFRl2T2PCyOqqPMwwIAWp2A6MXbUK8V8NOzN6Jb4wrOREREXY1V5mEhy5BJJQj15tBmIiIiUzGw2EnT0GauKURERHQ1DCx2wqHNREREpmNgsRMObSYiIjIdA4udcGgzERGR6RhY7MRQw8LAQkREdFUMLHaiDyyXqutRXlNv59IQERE5NgYWO3FTyOHn7gyAzUJERERXw8BiR1y1mYiIyDQMLHbEoc1ERESmYWCxIw5tJiIiMg0Dix2F+7oBYB8WIiKiq2FgsaOmoc2cnp+IiKgtDCx2FNE4edz5S7Wo1+rsXBoiIiLHxcBiR/7uCijkUmh1As5fqrF3cYiIiBwWA4sdSaUSDm0mIiIyAQOLnUVwpBAREdFVMbDYmb6GhSOFiIiIWsfAYmf6jrdsEiIiImodA4udcfI4IiKiq2NgsTN9DUv+xWoIgmDn0hARETkmBhY7C/UWA0uFpgFl1fV2Lg0REZFjYmCxM6WTDEGeSgDsx0JERNQaBhYH0NSPhVP0ExERtYSBxQFwaDMREVHbGFgcgL7jLUcKERERtYyBxQGEc3p+IiKiNjGwOIBwXzYJERERtYWBxQHoa1gK1LXQNGjtXBoiIiLHw8DiAHzdnOHmLIMgAH+X1di7OERERA6HgcUBSCQSw0ihPHa8JSIiaoaBxUFwEUQiIqLWMbA4CC6CSERE1DoGFgfBoc1EREStY2BxEOG+bgCAvIucnp+IiOhKDCwO4vIaFkEQ7FwaIiIix8LA4iC6eblAKgFq63UortTYuzhEREQOhYHFQTjLpQhWuQDg0GYiIqIrMbA4EA5tJiIiahkDiwPh0GYiIqKWMbA4EC6CSERE1LJ2BZY1a9YgMjISSqUScXFx2LNnT6v7FhQU4N5770WfPn0glUqRmprabJ/09HRIJJJmj9ra2vYUr8My1LAwsBARERkxO7BkZGQgNTUVixYtwuHDhzFq1ChMmDABeXl5Le6v0Wjg7++PRYsWYdCgQa2e19PTEwUFBUYPpVJpbvE6NE4eR0RE1DKzA8vrr7+OmTNn4qGHHkLfvn2xcuVKhIWFYe3atS3u3717d7zxxhuYPn06VCpVq+eVSCQICgoyenQ1ET7i5HHFFRpU1zXYuTRERESOw6zAUldXh6ysLCQlJRltT0pKwr59+66pIJWVlYiIiEBoaCgmTpyIw4cPt7m/RqOBWq02enR0KlcneCrlAID8izV2Lg0REZHjMCuwlJSUQKvVIjAw0Gh7YGAgCgsL212I6OhopKenY8uWLdiwYQOUSiUSExORk5PT6jFpaWlQqVSGR1hYWLuv70giDFP0s1mIiIhIr12dbiUSidFrQRCabTPHiBEjMG3aNAwaNAijRo3CJ598gt69e+PNN99s9ZiFCxeivLzc8MjPz2/39R1J09BmrilERESkJzdnZz8/P8hksma1KUVFRc1qXa6FVCrF0KFD26xhUSgUUCgUFrumo+DQZiIioubMqmFxdnZGXFwcMjMzjbZnZmZi5MiRFiuUIAjIzs5GcHCwxc7ZUXBoMxERUXNm1bAAwPz585GSkoL4+HgkJCRg3bp1yMvLw+zZswGITTXnzp3D+vXrDcdkZ2cDEDvWFhcXIzs7G87OzujXrx8AYOnSpRgxYgSioqKgVquxatUqZGdnY/Xq1Ra4xY4lgkObiYiImjE7sCQnJ6O0tBQvvvgiCgoKMGDAAGzduhUREREAxInirpyTJTY21vA8KysLH3/8MSIiInDmzBkAwKVLlzBr1iwUFhZCpVIhNjYWu3fvxrBhw67h1jqmsMbA8vfFGmh1AmTS9vcNIiIi6iwkgiAI9i6EJajVaqhUKpSXl8PT09PexWm3Bq0O0Yu3o0EnYN+zNyLEy8XeRSIiIrIaUz+/uZaQg5HLpAj1FkMKF0EkIiISMbA4IH2zEEcKERERiRhYHFCELzveEhERXY6BxQFxaDMREZExBhYHFO7D6fmJiIgux8DigPQ1LHmcnp+IiAgAA4tD0k/PX1ZdD3VtvZ1LQ0REZH8MLA7IXSGHr5szACCPQ5uJiIgYWK6q+iJw4iubX5ZDm4mIiJowsLSlrhr46E4gYxrw89s2vbR+aDNHChERETGwtE2uBMKGi8+3LwB+eBmw0UoG4VwEkYiIyICBpS1SKTDuZeCG58TXu5YB254BdDqrXzqcTUJEREQGDCxXI5EA1z8N3PIaAAlwYB2weRagte7oHcPkcex0S0RExMBismEPA3f8B5DKgaObgI33in1crCTCV5w87tylGjRorV+jQ0RE5MgYWMwRcydwz0ZA7gLk7AA+vB2ouWSVSwV4KOAsl0KrE3D+Uq1VrkFERNRRMLCYK+pmYPoXgEIF5O0H0icCFRcsfhmpVIIwbxcA7HhLRETEwNIe4SOAB7YCbgHAhaPAe+OAsjMWv4y+WejsRU7RT0REXRsDS3sFDQBmfgt4RQBlucB744ELxy16CQ5tJiIiEjGwXAufHsCD3wIB/YCKAuD9CUD+QYudvmkRRAYWIiLq2hhYrpVnMDDjGyB0KFB7CVg/Gfjze4ucmjUsREREIgYWS3D1AaZ/CfS8EaivAj6aChz74ppPq5+eP6+0GoKNZtglIiJyRAwsluLsBtyTAfT/B6CrBz59AMhKv6ZT6hdArNA04FK1dSeqIyIicmQMLJYkdwbu+C8Q9wAg6ICvngD2rmj36ZROMgR6KgCwWYiIiLo2BhZLk8qAiSuAUU+Jr3cuAXYsbveiiYYp+hlYiIioC2NgsQaJBLjpeSDp/4mv960CtswDtA1mn0rfLLTtaAGn6Ccioi6LgcWaRs4DJq8GJFLg8AfApzOABo1Zp/hHbDdIJcC23wvx2EeHUFuvtU5ZiYiIHBgDi7XFTgOmrgdkzsCJr4CP7gI0FSYfPirKH2unxcFZLsWO4xfwYPpBVGrMr6khIiLqyBhYbKHvJOC+TwFndyB3F/C/24DqiyYfPq5/ENIfGAo3Zxn2/VmK+979GRer6qxYYCIiIsfCwGIrPa4H7t8CuPgA5w+JU/mXnzP58JE9/bBh1gh4uzrhyN/lmPrOfhSU11ixwERERI6DgcWWusUBD24HPLsBJSfFRRNLTpt8+MBQL2yanYBglRKniypx59r9+Ku40ooFJiIicgwMLLbm30dcf8i3F1CeL4aWgiMmH94rwAOfPjoSPfzccO5SDe56ez9+P1duxQITERHZHwOLPXiFAQ9sB4IHAdUlQPpE4MxPJh/ezcsFn8xOQP8QT5RW1eGedT/jl79KrVhgIiIi+2JgsRd3f+D+r4GI6wCNGvjwduDkNpMP93NXYMOsERgW6YMKTQOmv3cA3524YMUCExER2Q8Diz0pPYFpnwJ9bgEaaoGN9wFHMkw+3FPphPUPDsPYvgHQNOgw64MsfHHY9I68REREHQUDi705uQBTPwAG3QMIWmDzLODnt00+XOkkw9ppcbg9thu0OgGpGdlI/ynXigUmIiKyPQYWRyCTA5PXACMeE19vXwD88LLJ6w85yaR47a5BmDGyOwBgyVfHsSLzFIR2rl9ERETkaBhYHIVUCox7GbjhOfH1rmXAtmcAnWnrB0mlErwwqR+eHNsbAPDGdzlY+tVx6HQMLURE1PExsDgSiQS4/mngltcASIAD68QmIm29iYdL8MTYKCy9rT8AIH3fGTy16QjquWgiERF1cAwsjmjYw8Ad/wGkcuDoJmDjvUBdtcmH3z+yO964ezDkUgk2Hz6H2R9kcdFEIiLq0BhYHFXMncDdGwC5C5CzA/hgilnrD00e3A3rpsdBIZfiuz+KMP29A1DXmlZTQ0RE5GgYWBxZ7yRg+heAUgXk/yKuP3Qp3+TDb4wOxAczh8NDIceB3Iu4Z93PKKnUWK+8REREVtKuwLJmzRpERkZCqVQiLi4Oe/bsaXXfgoIC3HvvvejTpw+kUilSU1Nb3O+zzz5Dv379oFAo0K9fP2zevLk9Ret8wkeIU/nr1x/6783AhWMmHz4s0gcbZo2An7szjp1X46639+PvMtObl4iIiByB2YElIyMDqampWLRoEQ4fPoxRo0ZhwoQJyMvLa3F/jUYDf39/LFq0CIMGDWpxn/379yM5ORkpKSk4cuQIUlJSMHXqVPzyyy/mFq9zCugLzNwB+EcDFQXAexPMmsp/QDcVNs0eiW5eLsgtqcKda/cj50KFFQtMRERkWRLBzMk6hg8fjiFDhmDt2rWGbX379sWUKVOQlpbW5rFjxozB4MGDsXLlSqPtycnJUKvV2LataWr68ePHw9vbGxs2bDCpXGq1GiqVCuXl5fD09DT9hjqSmjJgwz1A3n5ApgDueBfoN9nkwwvLa5Hy31+QU1QJb1cnpD8wDIPCvKxXXiIioqsw9fPbrBqWuro6ZGVlISkpyWh7UlIS9u3b176SQqxhufKc48aNa/OcGo0GarXa6NHpuXgDKZuB6ImAVgN8cj9w4F2TDw9SKfHJIwkYFOaFsup63Pvuz9h3usSKBSYiIrIMswJLSUkJtFotAgMDjbYHBgaisLCw3YUoLCw0+5xpaWlQqVSGR1hYWLuv36E4uQBT1wPxDwIQgK3/B3z3L5NnxfV2c8ZHDw1HYi9fVNVpMeP9g/j2WPv/7YiIiGyhXZ1uJRKJ0WtBEJpts/Y5Fy5ciPLycsMjP9/00TMdnlQG3Po6cMMi8fWe14AtcwFtg0mHuyvkeG/GUIzvH4Q6rQ6PfpiFT37tQt8/IiLqcMwKLH5+fpDJZM1qPoqKiprVkJgjKCjI7HMqFAp4enoaPboUiQS4/hlg0ipAIgUOf2jWBHMKuQxv3RuL5Pgw6ATgmU9/w7u7/7JyoYmIiNrHrMDi7OyMuLg4ZGZmGm3PzMzEyJEj212IhISEZufcsWPHNZ2zy4i7H0j+CJArgZxvgfW3AVWlJh0ql0nxyh0xeGR0DwDAS1tP4NVv/+CiiURE5HDMbhKaP38+/vOf/+C9997DiRMn8OSTTyIvLw+zZ88GIDbVTJ8+3eiY7OxsZGdno7KyEsXFxcjOzsbx48cN7z/xxBPYsWMHli1bhj/++APLli3Dzp07W52zha4QfQswfYvYKffvg8B744CysyYdKpFIsPCWvlgwPhoAsPqHP7Hoi9+h5aKJRETkQMwe1gyIE8f9+9//RkFBAQYMGIAVK1Zg9OjRAIAZM2bgzJkz+PHHH5su0kJflIiICJw5c8bw+tNPP8Vzzz2Hv/76Cz179sRLL72E22+/3eQydYlhzVdTfBL48A6gPB9wDwKmfQoExZh8+Me/5GHRF0chCMDEgcF4fepgOMs5GTIREVmPqZ/f7QosjoiBpZH6vBhaio4DCk/g7o+ByFEmH/71b+fxZEY26rUCru/tj7XThsDVWW7FAhMRUVdmlXlYqAPwDAEe2AZEJAIaNfDh7cAx05c5mDgwBP+5fyhcnGTYdaoYKf89gPJqLppIRET2xcDSGbl4AdM+B/reBmjrgE0PAL+8Y/Lh1/f2x4cPDYfKxQlZZ8uQvG4/CsprrFdeIiKiq2Bg6ayclMBd6cDQhwEIwLZngJ1LTZ5gLi7CG588koAADwX+KKzAmFd/xNKvjuGCutaqxSYiImoJ+7B0doIA7FkOfP8v8fWge4HbVgEyJ5MOzyutRmrGYRzKuwQAcJZLcc/QMMwe0xPBKhcrFZqIiLoKdrolY4c/BLY8DghaoNfNwNT/Ac5uJh0qCAL2ni7BGztz8OvZMgCAs0yKqUND8eiYXujmxeBCRETtw8BCzZ36VlwwsaEG6BYH3PsJ4OZn8uGCIGD/n6VY+V0ODuReBAA4ySS4My4Mj43piTAfV2uVnIiIOikGFmpZ/kHg46lAzUXApyeQ8jng3d3s0/z8VylWfZeDfX+Ks+rKpRLcPqQb5tzQCxG+ptXcEBERMbBQ60pygA9uB8rzAPdA4L5NQPCgdp3q4JmLWPVdDvbklAAAZFIJpgzuhrk39kKkH4MLERG1jYGF2qYuAD66C7hwFHD2AO7+EOgxpt2nyzpbhlXf5WDXqWIAgFQCTB4s1rj0CnC3UKGJiKizYWChq6stBzbeB5zZA0idgH+8DcTceU2nzM6/hDe/y8F3fxQBEBeVnjQwBPNu7IWoQA9LlJqIiDoRBhYyTYMG+HwWcPwL8fX4V4ARj17zaY/+XY5V3+cg8/gFAGJwuWVAMObd1AvRQfz3ISIiEQMLmU6nA7Y/CxxonA038QngpiWA9NrnFTx2vhxvfnca248VGraN7x+EeTf1Qv8Q1TWfn4iIOjYGFjKPIAA/rQR2LhFfD7wbmPyWyRPMXc0fhWq8+d1pbP29wDDZ7s39AvH4jVGICWVwISLqqhhYqH2yPwa+nCtOMNfzJmDqekBhuU6zpy5U4K3vT+Or384bgsuN0QF4/KYoDA7zsth1iIioY2BgofbLyQQ+mQ7UVwMhscC9mwB3f/PPIwhAfU3jowqoqxbPWV+N88Wl2JGdi9/PFEAJDVygQT8/ORLCXBDkohP3q6tqPLYaCOgr9q3x6WH5+yUiIrthYKFr83cW8PFdQHWpGBLiZojh4fIQ0eJzfTBp3A4L/nhJpEC/yWIfm5BYy52XiIjshoGFrl3JaeDDfwCX8q79XHIl4OQqrl/k5NLseaWgwNGiOhwrbkCVoECN4IxAPx+M7h+BngEq4PfPgNOZTeeLvF4MLj1vFIcgERFRh8TAQpZRcUFc7bm2HHB2FYOGk2vj88bAYfTcrXGfK55LZSZdLv9iNdb8+Cc+zcpHvVb80RwW6YOHrovE9aoiKA68BRz9VOxjAwBBMUBiKtBvCiCTW+d7QEREVsPAQh3a32XVeHvXn/jk4N+o0+oAAC5OMozu7Ycp3XW44dImKH/7sLHZCYBXOJAwD4idJgYoIiLqEBhYqFMoKK/Bf/fkYuvRApwvrzVsl0kluCFchkddf8Tg8xshqxVXj4aLDzD8EWDYLMDVx06ltpCaS2IH6JPfAKWngaBBQNgwIHwE4BtlkXlyiIjsjYGFOhVBEHDsvBo7jl/AjmOF+KOwwvCeEhrM9T6AFN2XUGnOixudXIHYFCBhDuAdYadSt0P538DJbcAfXwNn9gK6hpb3c/EGQoc1BZiQIZ23Zqm2HCj9U+z87eJl79IQkYUxsFCnln+x2hBeDp65CJ0AyKDFBOkBzFN8gz7CXwAAQSKDZMDtYgfdoBg7l7oFggAUHQf+2CqGlIJs4/f9o4HoW4GggUDhb0DeL8C5LKChxng/qVzcJ3yEGGLCRgCewTa7DYvQNgAX/wQu/A5cONb4OC6uKg4Achdg4F1A/EwgZLBdi0pElsPAQl3Gxao6fP9HETKPF2LXqWLU1muRKP0ds2VfYZTsd8N+DZE3Qj76SaD7KPuOLNI2APm/AH98Izb3lJ257E2JGDr63CIGFd+eLRxf3xRe8hsfFQXN91OFA+HDgbDGR2B/kzs/W11l0WWh5JgYUopPAlpNy/srVWJNi163eGDoQ0D/fwBOStuUmYisgoGFuqSaOi32ni5B5vFC7DxRhODqk5gt/wq3SH+BTCL+qJeqBkA++kmoYv9huw/wumrgz++Bk1vFJp+ai03vyZVAjxuA6FuA3hPMn6RPEIDy/MsCzM9iCBB0xvs5uwOh8WLtS9gwIHQooLTy/yv1tUDxH2Itkj6YXDgGVBW3vL+TGxDYTwxXAf3Fr4H9AKUXkPczcPA/wPEvAV29uL+Lj9jROv4BTipI1EExsFCXp9UJyDpbhszjhTj6+xHcUvEZpsp+hFIiftgVyEKQ03MGwm6YichgP8sXoKoEOLVdbO7583vjZhwXb6D3eLEWpeeN4hBwS6pVi01H+hqY/INAXcUVO0nEQBA2vKkpySuifbVP+tBkCCWNAaX0dNMQ9Cuv7dOjMZAMaAopXt2v3pm4sgg4tB749X1A/XfT+XrdJNa6RCU5Tk0SEV0VAwvRZQRBQE5RJXYfPgGPI//FuOqv4CWpAgAUCypsUU5CZcz9GD0wCoNCvSCVtrPJ6OJfjf1RvhFrOi6v5fAKB/rcKoaU8ATbzhuj0wJFJ8Qy5R8QaysunW2+n3tQU0fesOFivxi5s/E+tWrxXPraEn3tiUbd8rVdvBtDSf+mmpOA6GsPaTotcOpbsdblz++atqvCgfgZQOz09i0pQUQ2xcBC1IbC4hLkf/cOInPS4actAgBUCkps0N6IL5VTMLB/PyT1C0RCT18o5G38tS4IwPnDjf1Rtoof3pcLGghETxSbewIHONasvBWFYu2Lvimp4EhTU4ueXAl0ixPLrq9BaSnoAGLHX78+TcFEX3PiEWz9+y79E8h6Hzj8IVBT1lgeJ6D/FLHWJWy4Y33viciAgYXIFNp6VB/+BPW7V0KlPgUAqBdk+FKXiLcbJqLQuTuu7+OPpH6BGBXlDx83Z6ChDji7tzGkbAPU55rOJ5EB3RPFkNJnglir0lHU14jhK6+xFib/F+O+NpfzCGlqxtHXnvhGNa+NsbX6GuDYZrHW5VxW0/aA/sDQmcDAqYDCw37lI6JmGFiIzCEIwOmd0O1dCenZvYbNO7WxeLthEv4QwjFG9humuh/B8IYsKLSVTcc6uQFRY8XmnqibO/6EdXqCAJTkiMGl6IQYvvS1Jx3hHs8fBg7+V1zKQd9/yNkDGHS3GF4C+tq3fEQEgIHF3sWhjuzvX4Gf3oBw4itIGleb1kIKGZr6oxQLKuyRDkVJt5sQNHg8rusbKta+kOOpKQOyN4i1Lhf/bNoecR0w9EEgepL9a4aIujAGFqJrVXIa2P8mkP0xoK1Dg3dP5HiPxleaIfjwb3+oNU0BRiIBBoZ6YUxvf4zp44+BoV6QtbfjLlmHTgfk7hKDy8mtTR2i3QKAuPuBuBmAKtSuRSRySBUXxP9nTu8E7nzf4gGfgYXIUqoviiNgvLsbNtVrdTh0tgw/nirGjyeLcaLAeISMt6sTRjeGl1FR/vBzV9i40NSm8nPAof8BWelA5QVxm0QqTtg3dCYQOYZrNelVFgO/bQTOZ4tD0YMGiP2WvCP5PerMSv8UZ98+8TXw90GgsbYZ0z4XpxCwIAYWIhu6oK7FrpPF+PFUEfbklKCitmkNIIkEiOmmwpje/ri+TwAGh7H2xWFo68Vfygf/C5zZ07Tdp6cYXAbfKw7L7mq0DeJQ8UPrxbmEWlrTytkdCOjXFGCCYsTXCnfbl5eu3eUjHv/4Wpzw8XLd4sQpGQYmW7wmkoGFyE4atDocyruEH08W4ceTxTh+Re2Ll6sTRkX5NwYY1r44jKI/gF/fA45saJpTRq4EBtwphpduQ+xbPlso/VMcGn5kg/FyD93ixIkOy84CF46K36sWl1GQAD6RTQEmcIAYaFRhHFbuiLT1wNmfGkPKN8YjHqVycRmT6Ma5ozxDrFYMBhYiB1GkrsWPp4qx62Qx9uQUQ11r/NdqTDcVxvQRm48Gh3mz9sXeNJXA0U1iX5cLTWtRIaC/OFS9zwRxdezO0hxSVw2c2AIc+kAcrq/n4iOOqIpNEYewX07bAJTmAIW/iwGm8Hfxe6VvXruSUtU4/H1AU41MQF/AycV699UeOi1QXSrOplxVLD70z6tLAPdAcW6l4IFik1hHDGF1VeLM2ye+FmvPai81vacf8Rg9URzxaKPaRQYWIgfUoNXhcH5T7cux88a1LyoXJ4yK8sOYPgG4vrc//D1Y+2I3giDOR3PwP8DxLwBtXdN7bv5A1Digz3hxHaiO1gwiCMD5Q2JI+f2zy2YpblziIDZF7M9jbufKymLjAFP4O1BysuUmJYkM8O1l3KQUOADwCLJsEGjQtBxAWnpeXQpDX42rUajEMgcPbAwxgwC/3radwdpUVaWNy4R83bhMSG3Te65+YgiPngj0uN4uIZKBhagDKKqoxe5TJfjxpNj3pbzGeKbZAd08MaZ3AEZF+aF/NxXcFQ74y7ArqL4I5OwQJwo8/Z3xukwyBRA5Smwy6T0e8AqzXzmvpqoUOPqJGFSKjjVt94oQQ8rgeyw/UqpBI67ErQ8w+kDT2qSErr7Nm5T8+jSFJ0EANBWmBZCqEkBT3vJ1WiURy+AeALj5iaPI3APEGqfyPKDgN3FG68sDrJ5cKfbjCW4MMEGDxNope9QklZ0VR/ac+BrI29d8mZDoSUDfieIs0HZee4uBhaiDadDqcOTvS/jxpDjy6Oi55r9ow31c0TfYA9FBnugb7Im+wR4I83Zt/9pHZL6GOvED4OR24NQ2oOyM8fuBMWLNS+/xjtF0pNMCf/0ghpSTW5s+aGUKoN9tYlDpPsq25RQEsY/MlU1KpaebrzIOiMss+PQQZzKuKjKuITCF1EmsFXP3FwNIa8/1weRqtSTaerFTasFvQOFvjV+PtrDAKMSaJL/el4WYgWIYc/Ey7x6uRhDEpTP0nWYLfzN+PyimcZmQWx1umRAGFqIOrrhCg92nivHjqWIcyC3FBXVLnRwBN2cZ+gR5oG+wJ6KDPdEv2AN9gjxZG2MLgiDWHpzaJgaYvw8Yf+C6BQC9k4DeE4CeN1h+Ve62lJ0BDn8kziNkWNUa4odmbAoQc6fjjYCqrxFrLy5vUrpwrOVaEic3sQbEPaAxbPiL4aOl50ov639A63RAWa64Jpc+xBQcEfu+tMQrQvy3CB4o1sQEDxSbw8y6placiVofUi4PzxIpED6ysdPsLUbTMjgaBhaiTuZiVR3+KFTjREEF/ihQ40ShGqcuVKKuoYW/SCHWxkQ3Bpm+weJX1sZYWVUpcDqzjaaj0UDvcWKfAWtMUldfK35wHVovTpKnp/QS11GKTRE/GDsSQRAX3izJARSeTSHFluGvvfQ1SYaamCPi8/K8lve/vFNva51762vFf9sTX4k/Z5cHIrkS6HmjGFJ6jxe/Vx0AAwtRF9Cg1SG3pAonCitwokAtBpmCChSqW64y19fGRAc3NikFeaBPkAc8lE42LnkX0FAnDhk9tV38YLlylWtD09EEICT22ppkCo6ITT5HPwFqL6uN6DFGDCnREwEnZfvPT5ZVfVFsQrq8JqY0p+XmsMs796rPATk7gfqqpveVKjGcRE8Uw0pH6wAOKweWNWvW4NVXX0VBQQH69++PlStXYtSoUa3uv2vXLsyfPx/Hjh1DSEgInnnmGcyePdvwfnp6Oh544IFmx9XU1ECpNO1/MgYWoiZlVXU4UajGHwWNQaawAicvVLRaGxPm44K+QU1NStFBngj3YW2MxQiC2Ofh1PaWm47cA4GoJPGDx9Smo5oycWHHQ+uN+yt4hgKx9wGD7wO8Iyx/L2QdddVi81fhkaYQ01rnXo8QsRal70QgIhGQdew/OKwWWDIyMpCSkoI1a9YgMTER77zzDv7zn//g+PHjCA8Pb7Z/bm4uBgwYgIcffhiPPPIIfvrpJzz22GPYsGED7rjjDgBiYHniiSdw8uRJo2ODgkxvz2NgIWpbg1aHM6VVOK5vUmoMMgXlLdfGuOprY4LEEBMb7o3oIA/IZZ1k/hF7qioVRx2d2gac/r7lpiN9x93Lm450OuDMbnFyt+NbmiZvkzmLH2CxKWKtip1HfZCFaOvFPlKFjZ16nd2a5gFyoE6z18pqgWX48OEYMmQI1q5da9jWt29fTJkyBWlpac32X7BgAbZs2YITJ04Yts2ePRtHjhzB/v37AYiBJTU1FZcuXTKnKEYYWIjap6yqDn8UVjT2j2msjSmsgKaF2hg3ZxkGh3shLsIH8RHeiA33YnPStbpa01FQjBhcpE5A9kfG7wcOEEPKwKmAq49ty01kIaZ+fps1jKCurg5ZWVl49tlnjbYnJSVh3759LR6zf/9+JCUlGW0bN24c/vvf/6K+vh5OTuIvu8rKSkRERECr1WLw4MH417/+hdjY2FbLotFooNE0jZpQq9Wt7ktErfN2c0ZCT18k9PQ1bBNrY6obA4wav59T41BeGSpqG/DT6VL8dLoUgPhHXp9AD8R390Z8hA/iIrwR6u0CSSf668/q5M5iM1DPG4Dxr4hNRye3Aae+FZuOCo+KDz2FpzjCJzZF7PvC7zV1EWYFlpKSEmi1WgQGBhptDwwMRGFhYYvHFBYWtrh/Q0MDSkpKEBwcjOjoaKSnpyMmJgZqtRpvvPEGEhMTceTIEURFRbV43rS0NCxdutSc4hORieQyKXoFuKNXgDsmDRLXENHpBOQUVeLXsxeRdaYMv54tQ97F6sbamQp8+LM48iHQU2EIL/HdvdE32BNObEYyjUQiTlkf0BcYNf+ypqPt4pDfAXcAfScBzq72LimRzbVrooYr/3oSBKHNv6ha2v/y7SNGjMCIESMM7ycmJmLIkCF48803sWrVqhbPuXDhQsyfP9/wWq1WIyzMgWeYJOrgpFIJ+jSOKrpvuNiZs0hdi6yzYnj59WwZjp0rxwW1Bt8cLcA3R8XF81ycZBgUphJDTHdvDAn3hsqFzUgmcfMVZ58dfI+9S0Jkd2YFFj8/P8hksma1KUVFRc1qUfSCgoJa3F8ul8PX17fFY6RSKYYOHYqcnJxWy6JQKKBQcJ0VInsK8FRiQkwwJsQEAwBq6rQ48vclZJ0tMzzKa+rx818X8fNf4lTsEgnQO8ADcd29ER8hNiWF+bAZiYjaZlZgcXZ2RlxcHDIzM/GPf/zDsD0zMxOTJ09u8ZiEhAR89dVXRtt27NiB+Ph4Q/+VKwmCgOzsbMTExJhTPCKyMxdnGUb08MWIHuIfIzqdgD+LK8UamDNlyDp7EWdKq3HygjjM+uNfxGYkfw8F4sLFJqS4CG/0D1HBWc5mJCJq0u5hzW+//TYSEhKwbt06vPvuuzh27BgiIiKwcOFCnDt3DuvXrwfQNKz5kUcewcMPP4z9+/dj9uzZRsOaly5dihEjRiAqKgpqtRqrVq3CBx98gJ9++gnDhg0zqVwcJUTUMRRXaHAoT6x9+fXMRRw9V456rfGvIYVcikFhXmINTGMzkpermSsHE1GHYJVRQgCQnJyM0tJSvPjiiygoKMCAAQOwdetWRESIbdoFBQXIy2uadjgyMhJbt27Fk08+idWrVyMkJASrVq0yhBUAuHTpEmbNmoXCwkKoVCrExsZi9+7dJocVIuo4/D0UGNc/COP6i/Ms1dZrcfRcuaEGJutsGcqq63Eg9yIO5Dat6BuiUiLC1w3d/dzQ3de18asbInxdoXTivCNEnR2n5icihyIIAv4srjKEl1/PluGv4qo2jwlWKdGdYYaoQ+JaQkTUaVyqrsNfJVU4U1KFM6XVjV+rkFtShYrahjaPbQozro0hxg2RfgwzRI6CgYWIOj1BEFBWXY8zpcZh5mxjmFGbEGYifF0RaaiRYZghsjUGFiLq0iwZZiJ83eDnroDSSQqlXAaFkxRKJxkUcuOv+vcUcimHaROZiIGFiKgVgiDgUnU9ctsZZkzhLJdCqQ80lwedy77qw47i8tDjJIVC3vyrt6sTega4I8BDwTBEnYrVRgkREXV0EokE3m7O8HZzxpBwb6P3Lg8zYoCpxtnSKlyqrkdtvRaaBh1q67Woa/xa26CDpvGrVtf0919dgw51DTqLhJ/LeSjl4rIJ/u6G5RN6Bbgj1NsVMimDDHVerGEhIrKQeq3OEGj0Xy9/rqnXQdOgRe1lX43eNxxjvJ+mXofiSg3OllZB18pvbIVcih76ENP4NSrQHd193TgJHzk01rAQEdmYk0wKJ5kU7grr/GrVNGhxpqQaOUUVOF1UaXj8VVIFTYMOJwrUOFFgvHK9TCpBhI8regY0hZmoQHf09HeHm5XKSWQNrGEhIurgtDoBf5dVI+dCJU4XNwWZP4sqUaFpvUkqRKU0BJmoAA9D85KPG2cVJtthp1sioi5OEARcUGsaA0zFZWGmCiWVmlaP83FzRi9/d/QMcEdUY4jp4e+GQE8lnGRsXiLLYmAhIqJWXaquM2pWOl1ciZwLlTh3qabN43zdnOHvoUCgpxIB+q+eCgR4iF8DPZXwd1ew3wyZjIGFiIjMVl3XgL+Kq4zCTE5RBfIuVjdbpLItPm7OCPBQIMBTiUAPhSHM6LcFeCjg76GAQs4J+ro6drolIiKzuTrLMaCbCgO6qYy263QCyqrrUFShwQV1LYoqNChq/Nr0WoOiilrUawVcrKrDxao6/FFY0eb1vF2dxFqZK2ttLgs2AZ4MNsTAQkREJpBKJfB1V8DXXYG+wa3/FazTCbhUU4+iilpcUIthplgfatQaXKgQvxZXaFCn1aGsuh5l1fVXDTYqFyco5OIoLLlMArlUArm08blM2vha0vL7UnEfJ5m4TSaViM9lUjhJJZA17uckE5/r9zM6ViqBj5szQrxcEOipZJOXHTCwEBGRxUgbP9h93JwRHdT6fvoJ+vQBpq1amzqtDuU19ba7iauQSAA/dwVCVEoEq1wQ7KVESOPXYJULQryUCPBQciI/C2NgISIim7t8tuGrBZvymnoUV2igaZxNuEGnQ71WQINWfG74qhO31Wsbn+sENGj174vP6xu/anWCeA7DceJ+9ToBWsP5jc9ZUqnB+fJa1DXoUFwh1hId+bu8xXLLpBIEeigQ7OWCYJUSIY1f9YEmWOUCXzdnSBlqTMbAQkREDksikcDL1Rlero4xN4wgCCitqkPBpVqcL69BwaUaFJTX4nx5reF5oboWWp2A843bW+MskyJIpTQONF4uhpqbEC8lVC5OXDuqEQMLERGRiSQSCfzcFfBzVyAmVNXiPlqdgOIKTWOgqUVBeQ3O6782BpviSrGpK+9iNfIuVrd6PRcnmaHJyUMph0QCSCBB43+QSCTQxxnJldsa35BActl7Ta/1x+CK95sf0xSYZl4XiTAf13Z+964NAwsREZEFyaQSBKmUCFIpgfCW96lr0OGCuhYF5VcEmsavBeW1uFhVh5p6Lf4qrsJfxVW2vYlW3DY4hIGFiIioq3CWSxHm49rmh39tvVYMNJfEmpmaugYIAARBbJrSPwfQ+Fx8IQiA+K7+edO2y2deEwSh2fuXH4Nm1xAQ5Km03DfBTAwsREREDkjpJEOknxsi/dzsXRSHwIHkRERE5PAYWIiIiMjhMbAQERGRw2NgISIiIofHwEJEREQOj4GFiIiIHB4DCxERETk8BhYiIiJyeAwsRERE5PAYWIiIiMjhMbAQERGRw2NgISIiIofHwEJEREQOr9Os1qxfVlutVtu5JERERGQq/ee2/nO8NZ0msFRUVAAAwsLC7FwSIiIiMldFRQVUKlWr70uEq0WaDkKn0+H8+fPw8PCARCKx2HnVajXCwsKQn58PT09Pi523I+nq34Oufv8Avwe8/659/wC/B9a8f0EQUFFRgZCQEEilrfdU6TQ1LFKpFKGhoVY7v6enZ5f8Ib1cV/8edPX7B/g94P137fsH+D2w1v23VbOix063RERE5PAYWIiIiMjhMbBchUKhwAsvvACFQmHvothNV/8edPX7B/g94P137fsH+D1whPvvNJ1uiYiIqPNiDQsRERE5PAYWIiIicngMLEREROTwGFiIiIjI4TGwXMWaNWsQGRkJpVKJuLg47Nmzx95Fsom0tDQMHToUHh4eCAgIwJQpU3Dy5El7F8tu0tLSIJFIkJqaau+i2NS5c+cwbdo0+Pr6wtXVFYMHD0ZWVpa9i2UTDQ0NeO655xAZGQkXFxf06NEDL774InQ6nb2LZjW7d+/GpEmTEBISAolEgi+++MLofUEQsGTJEoSEhMDFxQVjxozBsWPH7FNYK2jr/uvr67FgwQLExMTAzc0NISEhmD59Os6fP2+/AlvB1X4GLvfII49AIpFg5cqVNikbA0sbMjIykJqaikWLFuHw4cMYNWoUJkyYgLy8PHsXzep27dqFOXPm4Oeff0ZmZiYaGhqQlJSEqqoqexfN5g4ePIh169Zh4MCB9i6KTZWVlSExMRFOTk7Ytm0bjh8/juXLl8PLy8veRbOJZcuW4e2338Zbb72FEydO4N///jdeffVVvPnmm/YumtVUVVVh0KBBeOutt1p8/9///jdef/11vPXWWzh48CCCgoJw8803G9Zy6+jauv/q6mocOnQIixcvxqFDh/D555/j1KlTuO222+xQUuu52s+A3hdffIFffvkFISEhNioZAIFaNWzYMGH27NlG26Kjo4Vnn33WTiWyn6KiIgGAsGvXLnsXxaYqKiqEqKgoITMzU7j++uuFJ554wt5FspkFCxYI1113nb2LYTe33nqr8OCDDxptu/3224Vp06bZqUS2BUDYvHmz4bVOpxOCgoKEV155xbCttrZWUKlUwttvv22HElrXlfffkgMHDggAhLNnz9qmUDbW2vfg77//Frp16yb8/vvvQkREhLBixQqblIc1LK2oq6tDVlYWkpKSjLYnJSVh3759diqV/ZSXlwMAfHx87FwS25ozZw5uvfVWjB071t5FsbktW7YgPj4ed911FwICAhAbG4t3333X3sWymeuuuw7fffcdTp06BQA4cuQI9u7di1tuucXOJbOP3NxcFBYWGv1OVCgUuP7667vk70RA/L0okUi6TK0jIC40nJKSgqeffhr9+/e36bU7zeKHllZSUgKtVovAwECj7YGBgSgsLLRTqexDEATMnz8f1113HQYMGGDv4tjMxo0bcejQIRw8eNDeRbGLv/76C2vXrsX8+fPxz3/+EwcOHMDjjz8OhUKB6dOn27t4VrdgwQKUl5cjOjoaMpkMWq0WL730Eu655x57F80u9L/3WvqdePbsWXsUya5qa2vx7LPP4t577+1SiyEuW7YMcrkcjz/+uM2vzcByFRKJxOi1IAjNtnV2c+fOxW+//Ya9e/fauyg2k5+fjyeeeAI7duyAUqm0d3HsQqfTIT4+Hi+//DIAIDY2FseOHcPatWu7RGDJyMjAhx9+iI8//hj9+/dHdnY2UlNTERISgvvvv9/exbMb/k4UO+Defffd0Ol0WLNmjb2LYzNZWVl44403cOjQIbv8m7NJqBV+fn6QyWTNalOKioqa/YXRmc2bNw9btmzBDz/8gNDQUHsXx2aysrJQVFSEuLg4yOVyyOVy7Nq1C6tWrYJcLodWq7V3Ea0uODgY/fr1M9rWt2/fLtHpHACefvppPPvss7j77rsRExODlJQUPPnkk0hLS7N30ewiKCgIALr878T6+npMnToVubm5yMzM7FK1K3v27EFRURHCw8MNvxfPnj2Lp556Ct27d7f69RlYWuHs7Iy4uDhkZmYabc/MzMTIkSPtVCrbEQQBc+fOxeeff47vv/8ekZGR9i6STd100004evQosrOzDY/4+Hjcd999yM7Ohkwms3cRrS4xMbHZUPZTp04hIiLCTiWyrerqakilxr8iZTJZpx7W3JbIyEgEBQUZ/U6sq6vDrl27usTvRKAprOTk5GDnzp3w9fW1d5FsKiUlBb/99pvR78WQkBA8/fTT+Pbbb61+fTYJtWH+/PlISUlBfHw8EhISsG7dOuTl5WH27Nn2LprVzZkzBx9//DG+/PJLeHh4GP6qUqlUcHFxsXPprM/Dw6NZfx03Nzf4+vp2mX48Tz75JEaOHImXX34ZU6dOxYEDB7Bu3TqsW7fO3kWziUmTJuGll15CeHg4+vfvj8OHD+P111/Hgw8+aO+iWU1lZSVOnz5teJ2bm4vs7Gz4+PggPDwcqampePnllxEVFYWoqCi8/PLLcHV1xb333mvHUltOW/cfEhKCO++8E4cOHcLXX38NrVZr+L3o4+MDZ2dnexXboq72M3BlSHNyckJQUBD69Olj/cLZZCxSB7Z69WohIiJCcHZ2FoYMGdJlhvUCaPHx/vvv27todtPVhjULgiB89dVXwoABAwSFQiFER0cL69ats3eRbEatVgtPPPGEEB4eLiiVSqFHjx7CokWLBI1GY++iWc0PP/zQ4v/3999/vyAI4tDmF154QQgKChIUCoUwevRo4ejRo/YttAW1df+5ubmt/l784Ycf7F10i7naz8CVbDmsWSIIgmD9WERERETUfuzDQkRERA6PgYWIiIgcHgMLEREROTwGFiIiInJ4DCxERETk8BhYiIiIyOExsBAREZHDY2AhIiIih8fAQkRERA6PgYWIiIgcHgMLEREROTwGFiIiInJ4/x+aBegTc8BhswAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(hist.history['loss'])\n", "plt.plot(hist.history['val_loss'])\n", "plt.legend(['Train loss', 'Validation loss'])" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m313/313\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 3ms/step - accuracy: 0.9858 - loss: 0.0517\n", "\n", "Loss, Accuracy = [0.040652498602867126, 0.9890000224113464]\n" ] } ], "source": [ "print(\"\\nLoss, Accuracy = \", model_2.evaluate(x_test, y_test))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Как видите, точность довольно сильно подскочила. Попробуйте поиграться числом параметров и слоёв так, чтобы их стало меньше, а качество сетки стало лучше. Попробуйте обучать нейросетку большее количество эпох. \n", "\n", "Снова посмотрим на ошибки. " ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m313/313\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 3ms/step\n" ] } ], "source": [ "y_pred = model_2.predict(x_test)\n", "y_pred_classes = y_pred.argmax(axis=1)\n", "\n", "errors = y_pred_classes != y_ts\n", "\n", "x_err = x_ts[errors]\n", "y_err = y_ts[errors]\n", "y_pred = y_pred_classes[errors]" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABKwAAAFeCAYAAACoxYf8AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABx50lEQVR4nO3dd3hU1fbw8TWQHgiEJNIJV0oCQuhFQBBQEQFFRECkSFGKFVREQHpTEOHqDy9XhAByFUFpKuGKBq5ILyKKcEV6kR56ICH7/cPXXPc5Q5KZnJk5mXw/z5M/1s46e3YmizMnmzlrHEopJQAAAAAAAIBNFPD1AgAAAAAAAIC/YsMKAAAAAAAAtsKGFQAAAAAAAGyFDSsAAAAAAADYChtWAAAAAAAAsBU2rAAAAAAAAGArbFgBAAAAAADAVtiwAgAAAAAAgK2wYQUAAAAAAABb8bsNq8TERHE4HHLo0CFL5z106JA4HA5JTEy0dF5PWrhwodSqVUtCQkIkOjpaunbtKkePHvX1svIcasq5bt26icPhkLZt2/p6KXkK9fQ/nKOsQU39DzWVe9TTH8qXLy8Oh8PpV0hIiK+Xl2dQT/+jlJK5c+dK/fr1JTw8XCIiIqR27dqyfPlyXy8tT6GmnOO63D3U0//Y9RzldxtW+MO7774r3bp1k7p168ry5cvlzTfflLVr18o999wjFy5c8PXykMd9+eWXsmzZMomIiPD1UpBHcY6C1agpWGnp0qWyceNG7WvRokUiIvLoo4/6eHXIiwYMGCADBgyQli1byooVK2Tx4sXStWtXuXbtmq+XhjyO63JYwa7nqABfPfC1a9ckLCzMVw/v127cuCFvvPGGtGvXTj744IPM8apVq0qjRo1k6tSpMmHCBB+u0DOoKe+4ePGi9OvXT8aNGyczZszw9XI8hnryHM5RsFp+rCnqybNq1aplGlu9erWIiPTt29fby/E46smzli1bJrNmzZJFixZJp06dMsdbtWrlw1V5FjXlHVyXwwp2Pkd55R1Wo0ePFofDITt27JCOHTtKZGSkVKhQQUT+eOvZzJkzpWbNmhIaGiqRkZHSsWNHOXDggDbH119/LY888oiUKVNGQkJCpGLFitKvXz85e/asJWs8fvy4PPPMM1K2bFkJCgqSUqVKSceOHeXUqVO3PWb//v3Sq1cvqVSpkoSFhUnp0qWlXbt2snv3bi0vIyNDxo8fL3FxcRIaGipFixaVhIQE7aRy5syZzMcPDg6WmJgYady4saxZs8bln+Wnn36SixcvykMPPaSN33333VKsWDH57LPPXJ7Tbqgp79bUX7388stSsmRJeeGFF3I1j51QT5yjrEZNUVNWop5895r3pz9vlbjzzjulRYsWlszpK9ST9+tpxowZUr58ee0PQX9CTXFdbiXqiXPUX3n1HVYdOnSQLl26SP/+/eXq1asiItKvXz9JTEyUF154Qd588005f/68jB07Vho1aiS7du2S4sWLi4jIb7/9Jnfffbf07dtXihQpIocOHZJp06ZJkyZNZPfu3RIYGOj2uo4fPy716tWTtLQ0GTZsmCQkJMi5c+dk9erVcuHChcw1GJ04cUKioqJk8uTJEhMTI+fPn5d58+ZJgwYNZOfOnRIXFyciIm+99ZaMHj1aRowYIU2bNpW0tDTZu3evpKSkZM7VvXt32bFjh0yYMEEqV64sKSkpsmPHDjl37lxmztq1a6V58+YyatQoGT169G1/nps3b4qISHBwsOl7wcHB8uuvv0pqaqpf9GCgprxTU39as2aNzJ8/X7Zu3SoFCxZ0+/mxK+qJc5TVqClqykrUk3df8/5qzZo1cvjwYRk/frw4HA6XnyM7op68U0/p6emyceNGeeihh2TatGkyY8YMOXbsmMTGxsrAgQPl5ZdfpqaEmhLhutyIeuIcJSIiygtGjRqlRESNHDlSG9+4caMSEfX2229r40ePHlWhoaFqyJAhTufLyMhQaWlp6vDhw0pE1PLlyzO/N3fuXCUi6uDBgzleX+/evVVgYKDas2fPbXMOHjyoRETNnTv3tjnp6enq5s2bqlKlSmrQoEGZ423btlU1a9bMcg2FChVSL730UpY5a9euVQULFlRjxozJMu/cuXOqQIECqk+fPtr4/v37lYgoEVEnTpzIcg67o6a8W1NKKXX58mVVvnx59frrr2eOxcbGqjZt2mR7rN1RT5yjrEZNUVNWop68/5pn1LlzZ1WwYEF17Ngxl4+1G+rJu/V08uRJJSIqIiJClSlTRs2bN0998803qn///kpE1LBhw7I8Pi+gprgutxL1xDnqr7zadP2xxx7T4i+++EIcDod069ZN0tPTM79KlCghNWrUkLVr12bmnj59Wvr37y9ly5aVgIAACQwMlNjYWBER+eWXX3K1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LZ43b54pp1y5clpsVUN1d3K+/vprLXZWP8YPmYmLizPlGB/L2e/s3LlzWmxsnpzdB+tYyZ/PUe40XTc2trab/fv3m8b+9re/abHxQyis+uConMhL56icGDBggBYbP6zB2c+7ZMkSLV6wYIEpJyd//1nBuAcgIvLkk09qsbP6+P333z22JlfRdB0AAAAAAAB+hQ0rAAAAAAAA2AobVgAAAAAAALAVe9/kmwN9+/bV4qefftqU8/PPP2tx7969PbqmvzL2owoJCTHlGO+tddbvyNibJid+++03l49B9ox9CzZt2mTK6d69uxZ///33ppzt27dr8dSpU7Od99q1a1rsrNfU448/rsUff/yxKceoYsWK2ebA/urUqaPF5cuX1+KXXnrJe4uBbRj70IiY+wX997//NeUkJiZqcenSpbX4+PHjuV8c/ILxuqVnz56mHGPfkLNnz2rxsWPHrF8YcuUf//iHFhv7VYmIFCig/993RkZGlt93lpOTfjY5yWnVqpUWG/sfOZvHWW8VY46xVkVEmjVrpsV79+7Ndn3IPWd1YLx+9qXg4GDT2KxZs7TY2K9KxPzv5OrVq9YuLB97//33s4xffvll0zEtWrTQ4lWrVplyjH/Tf/PNN+4uUVO8eHEtrlGjhinHWFN26lflCbzDCgAAAAAAALbChhUAAAAAAABshQ0rAAAAAAAA2AobVgAAAAAAALAVh3LWbdDVSXLQCNEq0dHRWrxlyxYtjo2NNR1z6dIlLR40aJApZ8+ePdk+trGZo7HhorOn0th0PSgoKNvHcYexGbeISLVq1bT48OHDljyWBSWTJW/WkxWcNcN75513tNhYKyLm5/H69etafP78edMxOWkWGhoaqsXFihXLdp733ntPi1988UXTMZ7i6XoSyXs15a6VK1dqcYMGDbS4QoUKpmMuX77s0TX5Qn4/R5UtW1aLnTVUv/fee7XYeN4QEZk9e7YW33XXXVp848YNN1eYt+T3esqJsLAwLXb2uvPWW29pcZ8+fbTY+BroLuOHT4iYP+TEl/LSa96tW7e0OCcNyo05ztbirRx31isisn79ei0ePHiwKWfHjh2mMV/x53NUyZIltXjDhg2mnCtXrmixsw+vOn36dK7XEhgYaBozXt8PGTLElGNs4O3MokWLtHj48OFafOjQoRys0Bp56RzlLTExMaYx456Ds78HjRo1aqTFzurZaPPmzaYx476F8YMs7Ca3NcU7rAAAAAAAAGArbFgBAAAAAADAVtiwAgAAAAAAgK0E+HoBrjL2hDLe2+xMRESEFn/44YeWrKVAAX2/z6r7R1NTU01jxnuXjX25xo8fbzrGqp5VyNquXbtMY8b71Z31sKpdu7YWd+7cWYud1XaZMmW02N17gl955RUt/vLLL92aB77jrE/Lfffdp8UXLlzQYn/sVwWzhx56SIuDg4OzPaZr166mMWNvxPzSswquM742OTvXDBw4UIs91cOkY8eOprFvv/1Wi4sUKeKRx/Y3xudy/vz5ppxChQppsfFa2Hit7CwnJ7VgVY7xvDZx4kRTzqRJk7KdB95x8uRJLU5JSTHlVK9eXYuTkpJMOUOHDs31Wl5//XXT2D333JPtcRs3btTiqVOnmnKMf0t4s2cVsnfmzJlsx7Zt25btPFbtQeQ3vMMKAAAAAAAAtsKGFQAAAAAAAGyFDSsAAAAAAADYikO52wTnr5N4qA9BTqxdu1aLq1SpYsqJjo72yGPnpIeV8V55Y08ZEZH3339fi3/44QdTzqpVq9xYoWdYUDJZ8mU92Z2xn0SbNm1MOcbfz1dffWXKWbJkibULywVP15OIf9ZUz549TWNz587V4pdfflmL33nnHY+uyS7y+zmqaNGiWvzdd9+Zcnbv3q3F7dq1yzanUaNGuV9cHpTf68kdXbp0MY0Z6/Ls2bNa/OOPP5qOuXLlihafO3fOlNO3b18tNl53iYhUrVpVi1999VVTjrfk5de8Rx991DRm7KEaFxeX7VqMz4G7OXv27NHi9evXa/HevXtNx6xevTrbnLwmP52jxo0bZxp76aWXtDgsLMyUY8Vz5Ox5MNZccnKyKefNN9/U4uvXr+d6LZ6Ul89RsKfc1hTvsAIAAAAAAICtsGEFAAAAAAAAW2HDCgAAAAAAALbChhUAAAAAAABsJc83XTcqW7asaWzZsmVaXKFChWznWbFihWls8+bNLq/H2Mzxm2++cXkOu8lPzR3heTR3dI+zc9Tf/vY3La5Vq5YWp6ene3RNdsE5Sle6dGnT2CuvvKLFjRs3NuU899xzWrxlyxZrF5ZHUE/WiIqK0uLt27drsbNGycam6+fPnzflGBsYO2uofvLkSS0+fPhw1ov1IF7zYLX8fo6KiYnR4vDwcFPOgAEDtLhu3bqmnG3btmX5OP/5z39MY8a/61JTU7OcIy/gHAWr0XQdAAAAAAAAfoUNKwAAAAAAANgKG1YAAAAAAACwFb/rYQXPy+/3ysNa3CufM3fddZcW796925Rz6dIlLX7ssce02B966OUE5yhYiXryjB49emhx9erVTTl16tTR4kqVKplyKleurMXGnlZ2w2serMY5ClbiHAWr0cMKAAAAAAAAfoUNKwAAAAAAANgKG1YAAAAAAACwFTasAAAAAAAAYCsBvl4AACB7tWvXzjbngw8+0OL80mQdQN4zf/58Xy8BAADYHO+wAgAAAAAAgK2wYQUAAAAAAABbYcMKAAAAAAAAtuJQSqlcT+JwWLEW5BEWlEyWqKf8xdP1JEJN5Teco2Al6glW4jUPVuMcBStxjoLVcltTvMMKAAAAAAAAtsKGFQAAAAAAAGyFDSsAAAAAAADYChtWAAAAAAAAsBU2rAAAAAAAAGArbFgBAAAAAADAVtiwAgAAAAAAgK2wYQUAAAAAAABbcSillK8XAQAAAAAAAPyJd1gBAAAAAADAVtiwAgAAAAAAgK2wYQUAAAAAAABbYcMKAAAAAAAAtsKGFQAAAAAAAGyFDSsAAAAAAADYChtWAAAAAAAAsBU2rAAAAAAAAGArbFgBAAAAAADAVv4fiv97VCsfFl4AAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "cols = 8\n", "rows = 2\n", "fig = plt.figure(figsize=(2 * cols - 1, 2.5 * rows - 1))\n", "for i in range(cols):\n", " for j in range(rows):\n", " random_index = np.random.randint(0, len(y_err))\n", " ax = fig.add_subplot(rows, cols, i * rows + j + 1)\n", " ax.grid('off')\n", " ax.axis('off')\n", " ax.imshow(x_err[random_index, : ], cmap='gray')\n", " ax.set_title('real_class: {} \\n predict class: {}'.format(y_err[random_index], y_pred[random_index]))\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.12.4" } }, "nbformat": 4, "nbformat_minor": 4 }