Найти в Дзене

9. Сверточные нейронные сети (CNN): взгляд сквозь слои 👁️‍🗨️🖼️ (Часть 2)

В прошлой части мы познакомились с теорией сверточных нейронных сетей. Сегодня мы применим эти знания на практике и построим 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. Предобработка данных #

В прошлой части мы познакомились с теорией сверточных нейронных сетей. Сегодня мы применим эти знания на практике и построим 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 #дляначинающих #технологии #дзен #канал