{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Отчет о проделанной работе\n", "\n", "## Введение\n", "\n", "Задача: Написать нейронную сеть для распознования набора данных Cifral10\n", "\n", "## Загрузка и предобработка данных\n", "\n", "В качестве набора данных для обучения используется набор данных (Cifral10)[https://www.cs.toronto.edu/%7Ekriz/cifar.html]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Загрузка данных" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Подготовка данных" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Нормализация\n", "x_train, x_test = x_train / 255.0, x_test / 255.0\n", "\n", "# Аугментация\n", "datagen = ImageDataGenerator(\n", " rotation_range=15,\n", " width_shift_range=0.1,\n", " height_shift_range=0.1,\n", " horizontal_flip=True\n", ")\n", "datagen.fit(x_train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Создание модели\n", "\n", "Для решения задачи используется сверточная нейронная сеть (CNN).\n", "\n", "### Архитектура модели\n", "\n", "1. **Входной слой**:\n", " - **Тип слоя**: Сверточный слой (Conv2D).\n", " - **Фильтры**: 32 фильтра.\n", " - **Размер ядра**: 3x3.\n", " - **Функция активации**: ReLU (Rectified Linear Unit).\n", "\n", "2. **Слой подвыборки (MaxPooling)**:\n", " - **Тип слоя**: Слой подвыборки (MaxPooling2D).\n", " - **Размер окна**: 2x2.\n", " - **Функция**: Уменьшает размерность выходных данных предыдущего слоя вдвое, выбирая максимальное значение в каждом окне 2x2.\n", "\n", "3. **Второй сверточный слой**:\n", " - **Тип слоя**: Сверточный слой (Conv2D).\n", " - **Фильтры**: 64 фильтра.\n", " - **Размер ядра**: 3x3.\n", " - **Функция активации**: ReLU.\n", "\n", "4. **Второй слой подвыборки (MaxPooling)**:\n", " - **Тип слоя**: Слой подвыборки (MaxPooling2D).\n", " - **Размер окна**: 2x2.\n", " - **Функция**: Уменьшает размерность выходных данных предыдущего слоя вдвое.\n", "\n", "5. **Третий сверточный слой**:\n", " - **Тип слоя**: Сверточный слой (Conv2D).\n", " - **Фильтры**: 64 фильтра.\n", " - **Размер ядра**: 3x3.\n", " - **Функция активации**: ReLU.\n", "\n", "6. **Слой преобразования (Flatten)**:\n", " - **Тип слоя**: Слой преобразования (Flatten).\n", " - **Функция**: Преобразует многомерные выходные данные предыдущего слоя в одномерный вектор.\n", "\n", "7. **Полносвязный слой (Dense)**:\n", " - **Тип слоя**: Полносвязный слой (Dense).\n", " - **Нейроны**: 64 нейрона.\n", " - **Функция активации**: ReLU.\n", "\n", "8. **Выходной слой (Dense)**:\n", " - **Тип слоя**: Полносвязный слой (Dense).\n", " - **Нейроны**: 10 нейронов (по одному для каждого класса в CIFAR-10).\n", " - **Функция активации**: Отсутствует (логиты).\n", "\n", "### Объяснение архитектуры\n", "\n", "1. **Сверточные слои (Conv2D)**:\n", " - Сверточные слои используются для извлечения признаков из изображений. Они применяют фильтры к входным данным, чтобы выделить важные характеристики, такие как края, текстуры и формы.\n", " - В данной архитектуре используются три сверточных слоя с различным количеством фильтров (32, 64, 64), что позволяет модели извлекать все более сложные признаки на каждом уровне.\n", "\n", "2. **Слои подвыборки (MaxPooling2D)**:\n", " - Слои подвыборки уменьшают размерность данных, сохраняя наиболее важные признаки. Это помогает снизить вычислительную сложность и предотвратить переобучение.\n", " - В данной архитектуре используются два слоя подвыборки, каждый из которых уменьшает размерность данных вдвое.\n", "\n", "3. **Слой преобразования (Flatten)**:\n", " - Слой преобразования преобразует многомерные данные в одномерный вектор, что необходимо для подачи данных в полносвязные слои.\n", "\n", "4. **Полносвязные слои (Dense)**:\n", " - Полносвязные слои используются для классификации извлеченных признаков. Они соединяют все нейроны предыдущего слоя с каждым нейроном текущего слоя.\n", " - В данной архитектуре используется один полносвязный слой с 64 нейронами и функцией активации ReLU, а также выходной слой с 10 нейронами (по одному для каждого класса)." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "model = models.Sequential([\n", " layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)),\n", " layers.MaxPooling2D((2, 2)),\n", " layers.Conv2D(64, (3, 3), activation='relu'),\n", " layers.MaxPooling2D((2, 2)),\n", " layers.Conv2D(64, (3, 3), activation='relu'),\n", " layers.Flatten(),\n", " layers.Dense(64, activation='relu'),\n", " layers.Dense(10)\n", "])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Компиляция и обучение модели\n", "\n", "Предварительно зададим, что будем использовать (оптимизатор)[https://www.tensorflow.org/api_docs/python/tf/keras/optimizers] использующий алгоритм (Adam)[https://www.tensorflow.org/api_docs/python/tf/keras/optimizers/Adam]. [1](https://education.yandex.ru/handbook/ml/article/optimizaciya-v-ml)\n", "\n", "В качестве (функции потерь)[https://www.tensorflow.org/api_docs/python/tf/keras/losses] будем использовать функцию (кросс-энтропии)[https://education.yandex.ru/handbook/ml/article/landshaft-funkcii-poter] для эффективного измерения разницы между предсказанными и истинными метками классов хорошо должна подойти (SparseCategoricalCrossentropy)[https://www.tensorflow.org/api_docs/python/tf/keras/losses/SparseCategoricalCrossentropy]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "model.compile(optimizer='adam',\n", " loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n", " metrics=['accuracy'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Test Accuracy: 0.1000\n", "Classification Report:\n", " precision recall f1-score support\n", "\n", " airplane 0.10 1.00 0.18 1000\n", " automobile 0.00 0.00 0.00 1000\n", " bird 0.00 0.00 0.00 1000\n", " cat 0.00 0.00 0.00 1000\n", " deer 0.00 0.00 0.00 1000\n", " dog 0.00 0.00 0.00 1000\n", " frog 0.00 0.00 0.00 1000\n", " horse 0.00 0.00 0.00 1000\n", " ship 0.00 0.00 0.00 1000\n", " truck 0.00 0.00 0.00 1000\n", "\n", " accuracy 0.10 10000\n", " macro avg 0.01 0.10 0.02 10000\n", "weighted avg 0.01 0.10 0.02 10000\n", "\n", "---\n", "\n", "Test Accuracy: 0.1018\n", "Classification Report:\n", " precision recall f1-score support\n", "\n", " airplane 0.04 0.01 0.01 1000\n", " automobile 0.15 0.33 0.21 1000\n", " bird 0.10 0.07 0.09 1000\n", " cat 0.11 0.05 0.07 1000\n", " deer 0.02 0.01 0.01 1000\n", " dog 0.07 0.07 0.07 1000\n", " frog 0.25 0.12 0.17 1000\n", " horse 0.11 0.17 0.14 1000\n", " ship 0.03 0.06 0.04 1000\n", " truck 0.16 0.12 0.14 1000\n", "\n", " accuracy 0.10 10000\n", " macro avg 0.11 0.10 0.09 10000\n", "weighted avg 0.11 0.10 0.09 10000\n", "\n", "\n", "Process finished with exit code 0" ] } ], "metadata": { "language_info": { "name": "python" } }, "nbformat": 4, "nbformat_minor": 2 }