Forums
Как выглядит код сверточной нейронной сети на практике сегодня - Printable Version

+- Forums (http://onevseforum.ru)
+-- Forum: My Category (http://onevseforum.ru/forumdisplay.php?fid=1)
+--- Forum: Компьютеры (http://onevseforum.ru/forumdisplay.php?fid=3)
+--- Thread: Как выглядит код сверточной нейронной сети на практике сегодня (/showthread.php?tid=1341)



Как выглядит код сверточной нейронной сети на практике сегодня - denkil - 08-18-2025

Увидеть код сверточной нейронной сети (CNN) вживую – это лучший способ понять, как они работают. Теория важна, но практика незаменима. Я покажу примеры кода CNN на Python с использованием библиотек TensorFlow и Keras, которые являются стандартом в области глубокого обучения. Мы разберем основные строительные блоки CNN и посмотрим, как они реализуются на практике. Это не просто фрагменты кода, а полноценные примеры, готовые к использованию.
Разработка CNN требует понимания основных концепций, таких как свертки, пулинг, функции активации и слои. Но, кроме того, необходимо уметь преобразовывать эти концепции в работающий код, используя подходящие инструменты и библиотеки.
Практическая реализация CNN с использованием TensorFlow и Keras
  1. Импорт необходимых библиотек (Import Libraries):
Первым шагом является импорт необходимых библиотек: TensorFlow и Keras. Keras – это высокоуровневый API для TensorFlow, который упрощает создание и обучение нейронных сетей.
Python
import tensorflow as tf
from tensorflow.keras import layers, models
from tensorflow.keras.datasets import cifar10 # Используем cifar10 для демонстрации
from tensorflow.keras.utils import to_categorical
import matplotlib.pyplot as plt
  1. Загрузка и подготовка данных (Load and Prepare Data):
В этом примере мы будем использовать набор данных CIFAR-10, который содержит 60000 цветных изображений размером 32x32 пикселя, разделенных на 10 классов.
Python
(train_images, train_labels), (test_images, test_labels) = cifar10.load_data()


# Нормализация изображений (приведение значений пикселей к диапазону от 0 до 1)
train_images = train_images.astype('float32') / 255.0
test_images = test_images.astype('float32') / 255.0


# Преобразование меток классов в категориальное представление (one-hot encoding)
train_labels = to_categorical(train_labels, num_classes=10)
test_labels = to_categorical(test_labels, num_classes=10)


print(f"Размер тренировочного набора изображений: {train_images.shape}")
print(f"Размер тренировочного набора меток: {train_labels.shape}")
print(f"Размер тестового набора изображений: {test_images.shape}")
print(f"Размер тестового набора меток: {test_labels.shape}")
  1. Создание модели CNN (Define the CNN Model):
Теперь мы определим архитектуру CNN. В этом примере мы создадим простую CNN с несколькими сверточными слоями, слоями пулинга и полносвязными слоями.
Python
model = models.Sequential()


# Сверточный слой 1
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3))) # 32 фильтра, ядро 3x3
model.add(layers.MaxPooling2D((2, 2))) # Слой пулинга для уменьшения размерности


# Сверточный слой 2
model.add(layers.Conv2D(64, (3, 3), activation='relu')) # 64 фильтра, ядро 3x3
model.add(layers.MaxPooling2D((2, 2))) # Слой пулинга для уменьшения размерности


# Сверточный слой 3
model.add(layers.Conv2D(64, (3, 3), activation='relu')) # 64 фильтра, ядро 3x3


# Преобразование трехмерного тензора в одномерный вектор
model.add(layers.Flatten())


# Полносвязный слой 1
model.add(layers.Dense(64, activation='relu')) # 64 нейрона
# Выходной слой
model.add(layers.Dense(10, activation='softmax')) # 10 классов (softmax для многоклассовой классификации)


model.summary() # Вывод структуры модели
    • Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)): Добавляет сверточный слой с 32 фильтрами, ядром свертки размером 3x3, функцией активации ReLU и входной формой (32, 32, 3), соответствующей размеру изображений CIFAR-10.
    • MaxPooling2D((2, 2)): Добавляет слой максимального пулинга с окном размером 2x2, который уменьшает размерность признаковых карт и снижает вычислительную нагрузку.
    • Flatten(): Преобразует трехмерный тензор, полученный после сверточных слоев, в одномерный вектор, который можно подать на вход полносвязному слою.
    • Dense(64, activation='relu'): Добавляет полносвязный слой с 64 нейронами и функцией активации ReLU.
    • Dense(10, activation='softmax'): Добавляет выходной полносвязный слой с 10 нейронами (по одному на каждый класс) и функцией активации Softmax, которая выдает вероятностное распределение по классам.
    • model.summary(): Выводит информацию о структуре модели, включая количество слоев, типы слоев, размеры выходных данных и количество параметров.
  1. Компиляция модели (Compile the Model):
Перед обучением необходимо скомпилировать модель, указав оптимизатор, функцию потерь и метрики оценки.
Python
model.compile(optimizer='adam',
loss='categorical_crossentropy', # categorical_crossentropy для многоклассовой классификации
metrics=['accuracy'])
    • optimizer='adam': Указывает, что мы будем использовать оптимизатор Adam.
    • loss='categorical_crossentropy': Указывает, что мы будем использовать функцию потерь categorical crossentropy, которая подходит для задач многоклассовой классификации.
    • metrics=['accuracy']: Указывает, что мы будем использовать метрику accuracy для оценки производительности модели.
  1. Обучение модели (Train the Model):
Теперь мы можем обучить модель на тренировочных данных.
Python
history = model.fit(train_images, train_labels, epochs=10,
validation_data=(test_images, test_labels))


# Вывод графиков обучения
plt.plot(history.history['accuracy'], label='accuracy')
plt.plot(history.history['val_accuracy'], label = 'val_accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.ylim([0.5, 1])
plt.legend(loc='lower right')
plt.show()
    • model.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels)): Запускает процесс обучения модели на тренировочных данных.
      • train_images и train_labels – это тренировочные данные и метки соответственно.
      • epochs=10 – это количество эпох обучения (количество раз, которое модель проходит через весь тренировочный набор данных).
      • validation_data=(test_images, test_labels) – это валидационные данные и метки, используемые для оценки производительности модели на каждой эпохе.
    • После обучения выводится график, показывающий динамику изменения точности на тренировочном и валидационном наборах данных.
  1. Оценка модели (Evaluate the Model):
После обучения мы можем оценить производительность модели на тестовых данных.
Python
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)


print(f"Точность на тестовом наборе данных: {test_acc}")
    • model.evaluate(test_images, test_labels, verbose=2): Оценивает производительность модели на тестовом наборе данных.
      • test_images и test_labels – это тестовые данные и метки соответственно.
      • verbose=2 – это уровень детализации выводимой информации.
    • В результате выполнения этого кода будет выведена точность модели на тестовом наборе данных.
  1. Сохранение и загрузка модели (Save and Load the Model):
После обучения модель можно сохранить для дальнейшего использования.
Python
# Сохранение модели
model.save('cifar10_model.h5')


# Загрузка модели
loaded_model = models.load_model('cifar10_model.h5')


# Проверка загруженной модели
test_loss, test_acc = loaded_model.evaluate(test_images, test_labels, verbose=2)
print(f"Точность загруженной модели на тестовом наборе данных: {test_acc}")
    • model.save('cifar10_model.h5'): Сохраняет модель в файл cifar10_model.h5.
    • models.load_model('cifar10_model.h5'): Загружает модель из файла cifar10_model.h5.
Расширенный пример с использованием Batch Normalization и Dropout
Чтобы улучшить обобщающую способность и ускорить обучение, можно добавить слои Batch Normalization и Dropout.
Python
model = models.Sequential()


# Сверточный слой 1
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))
model.add(layers.BatchNormalization()) # Добавляем Batch Normalization
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Dropout(0.25)) # Добавляем Dropout


# Сверточный слой 2
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.BatchNormalization()) # Добавляем Batch Normalization
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Dropout(0.25)) # Добавляем Dropout



# Сверточный слой 3
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.BatchNormalization()) # Добавляем Batch Normalization
model.add(layers.Dropout(0.25)) # Добавляем Dropout


# Преобразование трехмерного тензора в одномерный вектор
model.add(layers.Flatten())


# Полносвязный слой 1
model.add(layers.Dense(64, activation='relu'))
model.add(layers.BatchNormalization()) # Добавляем Batch Normalization
model.add(layers.Dropout(0.5)) # Добавляем Dropout


# Выходной слой
model.add(layers.Dense(10, activation='softmax'))


model.summary()
  • layers.BatchNormalization(): Нормализует выходные данные каждого слоя, что помогает стабилизировать обучение и ускорить сходимость.
  • layers.Dropout(0.25): Случайно отключает 25% нейронов во время обучения, что помогает предотвратить переобучение.
  • Dropout(0.5): Отключает 50% нейронов во время обучения.
Чтобы найти больше информации и получить отзывы о разработке CNN, посетите специализированные форумы и сообщества, посвященные машинному обучению и глубокому обучению, такие как Stack Overflow и Reddit (r/MachineLearning).