Первая нейронная сеть на Keras

Keras — это высокоуровневый API нейронных сетей, написанный на Python, который может работать поверх TensorFlow, CNTK или Theano. Его разработка сосредоточена на поддержке быстрого экспериментирования, что позволяет быстро переходить от идеи к результату с минимальным количеством кода.

Основные возможности Keras

  • Удобство для пользователя: Keras имеет простой и единообразный интерфейс
  • Модульность: Различные компоненты нейронной сети (слои, оптимизаторы, схемы инициализации и т. д.) являются компонуемыми модулями
  • Простая расширяемость: Новые модули можно легко добавлять для выражения новых исследовательских идей
  • Поддержка нескольких бэкендов: Позволяет бесшовно переключаться между TensorFlow, Theano и CNTK в качестве вычислительного бэкенда

Установка Keras

Прежде чем мы начнём, нам нужно установить Keras и его бэкенд-движок (здесь мы используем TensorFlow):

pip install tensorflow keras

Примечание: Keras 2.4.0 и более поздние версии были интегрированы в TensorFlow, и их можно напрямую использовать черезtensorflow.kerasИспользуйте


Создание первой нейронной сети

Начнём с простой полносвязной нейронной сети для решения классической задачи распознавания рукописных цифр MNIST.

1. Импортируйте необходимые библиотеки

Пример

import numpy as np
from tensorflow import keras
from tensorflow.keras import layers

2. Подготовка данных

Набор данных MNIST содержит 60,000 обучающих изображений и 10,000 тестовых изображений, каждое из которых является изображением рукописной цифры в оттенках серого размером 28x28 пикселей.

Пример

# Загрузить данные
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()

# Предобработка данных
x_train = x_train.reshape(60000, 784).astype("float32") / 255
x_test = x_test.reshape(10000, 784).astype("float32") / 255

# Преобразовать метки в one-hot encoding
y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)

3. Построение модели

Мы построим простую полносвязную сеть, содержащую входной слой, скрытый слой и выходной слой.

Пример

model = keras.Sequential([
    layers.Dense(512, activation="relu", input_shape=(784,)),
    layers.Dense(10, activation="softmax")
])

Анализ структуры модели

Пример

graph TD
A[Входной слой 784 нейрона] --> B[Скрытый слой 512 нейронов, активация ReLU]
B --> C[Выходной слой 10 нейронов, активация Softmax]

4. Компиляция модели

Перед обучением модели нам нужно настроить процесс обучения:

Пример

model.compile(
    optimizer="rmsprop",
    loss="categorical_crossentropy",
    metrics=["accuracy"]
)

Описание параметров компиляции

Параметр Описание Типичные значения
optimizer Оптимизатор, используется для обновления весов "rmsprop", "adam", "sgd"
loss Функция потерь, измеряет разницу между предсказаниями модели и истинными значениями "categorical_crossentropy" (классификация), "mse" (регрессия)
metrics Метрика оценки, используется для мониторинга обучения ["accuracy"]

5. Обучите модель

Теперь мы можем начать обучение модели:

Пример

history = model.fit(
    x_train, y_train,
    batch_size=128,
    epochs=10,
    validation_split=0.2
)

Описание параметров обучения

Параметр Описание Рекомендуемые значения
batch_size Количество образцов, используемых для каждого обновления градиента 32-256
epochs Количество эпох обучения Настраивайте в зависимости от сложности данных
validation_split Доля обучающих данных, используемая в качестве валидационного набора 0.1-0.3

6. Оценка модели

После завершения обучения мы можем оценить производительность модели на тестовом наборе:

Пример

test_loss, test_acc = model.evaluate(x_test, y_test)
print(f"Точность на тесте: {test_acc:.4f}")

Полный пример кода

Пример

import numpy as np
from tensorflow import keras
from tensorflow.keras import layers

# 1. Загрузить данные
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()

# 2. Предобработка
x_train = x_train.reshape(60000, 784).astype("float32") / 255
x_test = x_test.reshape(10000, 784).astype("float32") / 255
y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)

# 3. Построение модели
model = keras.Sequential([
    layers.Dense(512, activation="relu", input_shape=(784,)),
    layers.Dense(10, activation="softmax")
])

# 4. Компиляция модели
model.compile(
    optimizer="rmsprop",
    loss="categorical_crossentropy",
    metrics=["accuracy"]
)

# 5. Обучение модели
history = model.fit(
    x_train, y_train,
    batch_size=128,
    epochs=10,
    validation_split=0.2
)

# 6. Оценка модели
test_loss, test_acc = model.evaluate(x_test, y_test)
print(f"Точность на тесте: {test_acc:.4f}")

Рекомендации по улучшению модели

1. Добавьте слой Dropout: предотвратите переобучение

Пример

model.add(layers.Dropout(0.5))

2. Используйте более продвинутый оптимизатор: например, Adam

Пример

model.compile(optimizer="adam", ...)

3. Добавьте скрытые слои: постройте более глубокую сеть

Пример

model.add(layers.Dense(256, activation="relu"))

4. Используйте свёрточные слои: более эффективны для данных изображений

Пример

model.add(layers.Conv2D(32, (3, 3), activation="relu"))

ЧАВО

Вопрос 1: Почему точность моей модели так низка?

  • Проверьте, правильно ли выполнена предварительная обработка данных
  • Попробуйте изменить скорость обучения
  • Увеличьте емкость сети (больше слоев или больше нейронов)

Q2: Что делать, если потери не уменьшаются во время обучения?

  • Проверьте, нет ли проблем с данными
  • Попробуйте разные оптимизаторы
  • Настройте скорость обучения (обычно уменьшите её)

Q3: Как сохранить и загрузить обученную модель?

Пример

# Сохранить модель
model.save("mnist_model.h5")

# Загрузить модель
loaded_model = keras.models.load_model("mnist_model.h5")
Другие расширения