compile, fit, батчи и эпохи

Урок собирает воедино обучение: compile настраивает модель, fit её обучает, а батчи и эпохи задают ритм.

Эпоха — это один полный проход обучающих данных через сеть; батч — небольшая порция примеров, обрабатываемая за один шаг обновления весов.

Данных бывает слишком много, чтобы прогнать их разом. Поэтому их режут на батчи: модель смотрит на батч, делает шаг, берёт следующий. Когда все батчи пройдены — закончилась эпоха. Понимание этих понятий снимает большинство вопросов про fit.

Батчи, эпохи, итерации

Если выборка — 1000 примеров, а batch_size=100, то одна эпоха = 10 итераций (шагов). Посчитаем это на Python — код запускается:

samples = 1000
batch_size = 100
epochs = 5

steps_per_epoch = samples // batch_size
total_steps = steps_per_epoch * epochs

print("шагов в эпохе:", steps_per_epoch)
print("всего обновлений весов:", total_steps)

Вывод:

шагов в эпохе: 10
всего обновлений весов: 50

compile: настройка

В compile задают три вещи: оптимизатор, loss и метрики (требует TF):

model.compile(
    optimizer="adam",
    loss="sparse_categorical_crossentropy",
    metrics=["accuracy"],
)

fit: запуск обучения

history = model.fit(
    x_train, y_train,
    epochs=10,
    batch_size=32,
    validation_split=0.1,   # 10% на валидацию
)

print(history.history["loss"])      # loss по эпохам
print(history.history["val_loss"])  # loss на валидации

Объект history хранит, как менялись loss и метрики — по нему потом строят графики обучения.

Размер батча: компромисс

БатчПлюсыМинусы
маленький (8–32)меньше памяти, шумные шаги помогают обобщениюмедленнее, шумный loss
большой (256+)стабильнее, быстрее на GPUмного памяти, риск хуже обобщить

Как работает под капотом

Каждая итерация fit — это: взять батч → forward pass → посчитать loss → backprop (градиенты) → шаг оптимизатора. После каждой эпохи Keras (если задан validation_split) прогоняет валидационные данные без обновления весов и печатает val_loss — так вы видите, не начала ли модель переобучаться.

Частые ошибки

  • Путать эпоху и итерацию. Эпоха — весь датасет, итерация — один батч.
  • Слишком много эпох. Модель начнёт переобучаться; следите за val_loss.
  • Огромный batch_size при малой памяти. Получите ошибку нехватки памяти (OOM), особенно на GPU.

Итог

  • compile задаёт оптимизатор, loss и метрики; fit запускает обучение.
  • Батч — порция данных за шаг, эпоха — полный проход датасета.
  • Шагов в эпохе = размер выборки / batch_size.
  • history и val_loss помогают отслеживать прогресс и переобучение.
Проверьте себя
1. Что такое одна эпоха обучения?
AОдин батч данных
BОдин полный проход всех обучающих данных
CОдин шаг оптимизатора
DОдно предсказание
2. Сколько итераций в эпохе при 1000 примерах и batch_size=100?
A1
B10
C100
D1000
3. Зачем нужен validation_split в fit?
AЧтобы ускорить обучение
BЧтобы на части данных проверять модель без обновления весов и ловить переобучение
CЧтобы увеличить число эпох
DЧтобы сменить оптимизатор