{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Using TensorFlow backend.\n" ] } ], "source": [ "import keras\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from skimage import transform\n", "from sklearn.metrics import accuracy_score\n", "from keras import backend as K" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Данные:\n", "Будем работать с датасетом [FashionMNIST](https://github.com/zalandoresearch/fashion-mnist). " ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from keras.datasets import fashion_mnist\n", "\n", "(X_train, y_train), (X_test, y_test) = fashion_mnist.load_data()\n", "del y_train, y_test" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.imshow(X_train[9].reshape([28,28]))" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.imshow(transform.rotate(X_train[9].reshape([28,28]), 45))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задание.\n", "Ваша задача - определить, при каком минимальном угле поворота нейронная сеть фиксированной архитектуры перестает различать обычное и повертнутое изображение. Говоря формально, решаем задачу классификации, исходные изображения принадлежат классу `0`, повернутые - классу `1`. Оцените точность классификации по метрике `accuracy` и ее дисперсию в зависимости от угла поворота изображения и отобразите данную зависимость на графике.\n", "\n", "Функция `rotate_dataset` поворачивает поданный датасет на заданный угол. Функция `reset_weights` сбрасывает параметры модели.\n", "\n", "*Обращаем ваше внимание, что для качественной оценки данных зависимостей эксперименты для каждого размера выборки стоит повторять многократно на различных случайных подвыборках.*" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "base_indices = np.random.choice(np.arange(X_train.shape[0]), size=500, replace=False)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "base_dataset = X_train[base_indices].reshape([-1, 28,28])" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "def rotate_dataset(dataset, angle):\n", " return np.array(list(map(lambda x: transform.rotate(x, angle), dataset)))" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "def get_X_and_y(base_dataset, angle):\n", " rotated_datased = rotate_dataset(base_dataset, angle)\n", " whole_dataset = np.vstack((base_dataset, rotated_datased)).reshape(-1, 784)\n", " shuffled_indices = np.arange(len(whole_dataset))\n", " \n", " _labels = np.zeros(2*base_dataset.shape[0], dtype=bool)\n", " _labels[base_dataset.shape[0]:] = True\n", " _labels = _labels[:, None]\n", " \n", " whole_labels = np.array(np.hstack((_labels, ~_labels)), dtype=int)\n", " \n", " np.random.shuffle(shuffled_indices) \n", " whole_dataset = whole_dataset[shuffled_indices]\n", " whole_labels = whole_labels[shuffled_indices]\n", " \n", " return whole_dataset, whole_labels\n" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "def reset_weights(model):\n", " session = K.get_session()\n", " for layer in model.layers: \n", " if hasattr(layer, 'kernel_initializer'):\n", " layer.kernel.initializer.run(session=session)\n", " return" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "model = keras.models.Sequential()\n", "model.add(keras.layers.InputLayer([784]))\n", "model.add(keras.layers.Dense(64))\n", "model.add(keras.layers.Activation('relu'))\n", "model.add(keras.layers.Dropout(0.5))\n", "model.add(keras.layers.Dense(2))\n", "model.add(keras.layers.Activation('softmax'))\n", "model.compile('adam', 'categorical_crossentropy', metrics=['accuracy'])\n", "\n", "batch_size = 128\n", "n_epochs = 40" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "angle = 35" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "X, y = get_X_and_y(base_dataset, angle)\n", "X_test_whole, y_test_whole = get_X_and_y(X_test, angle)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "model.fit(X, y,\n", " batch_size=batch_size,\n", " epochs=n_epochs,\n", " verbose=0)\n", "\n", "y_test_predicted_whole = model.predict_classes(X_test_whole)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.9809" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "accuracy_score(y_test_whole[:, 1], model.predict_classes(X_test_whole))" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.986" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "accuracy_score(y[:, 1], model.predict_classes(X.reshape([-1, 784])))" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "reset_weights(model)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "### Your code here" ] } ], "metadata": { "kernelspec": { "display_name": "Py3 research env", "language": "python", "name": "py3_research" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.5" } }, "nbformat": 4, "nbformat_minor": 2 }