You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
11 KiB
11 KiB
{
"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
}