В прошлой части мы познакомились с теорией сверточных нейронных сетей. Сегодня мы применим эти знания на практике и построим CNN для классификации изображений MNIST с помощью Keras.
1. Подготовка данных:
Как и в прошлый раз, мы будем использовать набор данных MNIST. Но теперь нам нужно изменить форму входных данных, чтобы они соответствовали формату, ожидаемому CNN (batch_size, height, width, channels). Для MNIST это (batch_size, 28, 28, 1), т.к. изображения 28x28 пикселей и одноканальные (grayscale).
__________________________________________________________________________________________
import numpy as np
from sklearn.model_selection import train_test_split
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
from tensorflow.keras.utils import to_categorical
# 1. Загрузка данных MNIST
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# 2. Предобработка данных
# Решейпим изображения для соответствия формату (batch_size, height, width, channels)
img_rows, img_cols = 28, 28 X_train = X_train.reshape(X_train.shape[0], img_rows, img_cols, 1)
X_test = X_test.reshape(X_test.shape[0], img_rows, img_cols, 1)
input_shape = (img_rows, img_cols, 1)
# Приводим значения пикселей к диапазону от 0 до 1
X_train = X_train.astype('float32') / 255 X_test = X_test.astype('float32') / 255
# One-hot encoding целевых переменных
num_classes = 10 y_train = to_categorical(y_train, num_classes)
y_test = to_categorical(y_test, num_classes)
___________________________________________________________________________________Python
2. Создание модели CNN:
__________________________________________________________________________________________
# 3. Создание модели CNN
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=input_shape)) # 32 фильтра размера 3x3 model.add(MaxPooling2D(pool_size=(2, 2))) # Уменьшение размерности в 2 раза model.add(Conv2D(64, (3, 3), activation='relu')) # 64 фильтра размера 3x3 model.add(MaxPooling2D(pool_size=(2, 2))) # Уменьшение размерности в 2 раза model.add(Flatten()) # Преобразование многомерных карт признаков в вектор model.add(Dense(128, activation='relu')) # Полносвязный слой с 128 нейронами model.add(Dense(num_classes, activation='softmax')) # Выходной слой с 10 нейронами (по одному на цифру)
# Вывод структуры модели
model.summary()
___________________________________________________________________________________Python
Разберем код:
- Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=input_shape) – добавляет сверточный слой с 32 фильтрами размера 3x3, функцией активации ReLU и входной формой (28, 28, 1).
- MaxPooling2D(pool_size=(2, 2)) – добавляет слой подвыборки с размером окна 2x2.
- Flatten() – преобразует многомерные карты признаков в одномерный вектор.
- model.summary() - выводит информацию о структуре модели, включая количество параметров в каждом слое. Это полезно для понимания сложности модели и ее вычислительной нагрузки.
3. Компиляция и обучение модели:
_________________________________________________________________________________________
# 4. Компиляция и обучение модели
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X_train, y_train, batch_size=128, epochs=10, verbose=1, validation_data=(X_test, y_test))
# 5. Оценка модели
score = model.evaluate(X_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
___________________________________________________________________________________Python
4. Полный код:
__________________________________________________________________________________________
import numpy as np
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
from tensorflow.keras.utils import to_categorical
# 1. Загрузка данных MNIST
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# 2. Предобработка данных
img_rows, img_cols = 28, 28 X_train = X_train.reshape(X_train.shape[0], img_rows, img_cols, 1)
X_test = X_test.reshape(X_test.shape[0], img_rows, img_cols, 1)
input_shape = (img_rows, img_cols, 1)
X_train = X_train.astype('float32') / 255 X_test = X_test.astype('float32') / 255 num_classes = 10 y_train = to_categorical(y_train, num_classes)
y_test = to_categorical(y_test, num_classes)
# 3. Создание модели CNN
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=input_shape))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(num_classes, activation='softmax'))
# 4. Компиляция и обучение модели
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X_train, y_train, batch_size=128, epochs=10, verbose=1, validation_data=(X_test, y_test))
# 5. Оценка модели
score = model.evaluate(X_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
___________________________________________________________________________________Python
5. Результат:
Вы должны увидеть accuracy около 0.99 или выше. CNN значительно превосходят по точности логистическую регрессию и обычные нейронные сети для задачи классификации изображений.
6. Что дальше?
- Увеличение глубины сети: Добавление большего количества сверточных и полносвязных слоев.
- Использование других архитектур: Исследование других архитектур CNN, таких как ResNet, Inception или VGGNet.
- Использование аугментации данных: Увеличение размера обучающего набора данных путем применения различных преобразований к изображениям, таким как повороты, сдвиги и масштабирование.
- Перенос обучения (Transfer Learning): Использование предварительно обученных CNN на больших наборах данных, таких как ImageNet, и их адаптация для решения вашей задачи.
Вопрос дня: Какие другие приложения CNN вам кажутся наиболее перспективными? Поделитесь в комментариях! 👇
#сверточныесети #cnn #keras #tensorflow #глубокоеобучение #deeplearning #искусственныйинтеллект #ai #ml #компьютерноезрение #mnist #python #дляначинающих #технологии #дзен #канал