![]() |
|
Как выглядит код сверточной нейронной сети на практике сегодня - 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
Первым шагом является импорт необходимых библиотек: 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
В этом примере мы будем использовать набор данных 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}")
Теперь мы определим архитектуру 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() # Вывод структуры модели
Перед обучением необходимо скомпилировать модель, указав оптимизатор, функцию потерь и метрики оценки.
Python
model.compile(optimizer='adam',
loss='categorical_crossentropy', # categorical_crossentropy для многоклассовой классификации
metrics=['accuracy'])
Теперь мы можем обучить модель на тренировочных данных.
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()
После обучения мы можем оценить производительность модели на тестовых данных.
Python
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print(f"Точность на тестовом наборе данных: {test_acc}")
После обучения модель можно сохранить для дальнейшего использования.
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}")
Расширенный пример с использованием 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()
|