На этом шаге мы закончим изучение этого вопроса.
Попробуем увеличить время обучения модели до 500 эпох. Чтобы получить информацию о качестве обучения модели в каждую эпоху, изменим цикл обучения и добавим сохранение оценки проверки перед началом эпохи.
num_epochs = 500 all_mae_histories = [] for i in range(k): print(f"Processing fold #{i}") # Подготовка проверочных данных: данных из блока с номером k val_data = train_data[i * num_val_samples: (i + 1) * num_val_samples] val_targets = train_targets[i * num_val_samples: (i + 1) * num_val_samples] # Подготовка обучающих данных: данных из остальных блоков partial_train_data = np.concatenate( [train_data[:i * num_val_samples], train_data[(i + 1) * num_val_samples:]], axis=0) partial_train_targets = np.concatenate( [train_targets[:i * num_val_samples], train_targets[(i + 1) * num_val_samples:]], axis=0) # Конструирование модели Keras (уже скомпилированной) model = build_model() # Обучение модели (в режиме без вывода сообщений, verbose = 0) history = model.fit(partial_train_data, partial_train_targets, validation_data=(val_data, val_targets), epochs=num_epochs, batch_size=16, verbose=0) mae_history = history.history["val_mae"] all_mae_histories.append(mae_history)
Теперь можно вычислить средние значения метрики mae для всех прогонов.
average_mae_history = [ np.mean([x[i] for x in all_mae_histories]) for i in range(num_epochs)]
Построим график (рисунок 1).
import matplotlib.pyplot as plt plt.plot(range(1, len(average_mae_history) + 1), average_mae_history) plt.xlabel("Эпохи") plt.ylabel("Оценка MAE") plt.show()
Рис.1. Оценки MAE по эпохам
Из-за проблем с масштабированием может быть немного затруднительно увидеть общую тенденцию: оценка MAE для первых нескольких эпох значительно выше, чем для последующих. Давайте опустим первые десять замеров с масштабом, отличным от масштаба остальной кривой.
truncated_mae_history = average_mae_history[10:] plt.plot(range(1, len(truncated_mae_history) + 1), truncated_mae_history) plt.xlabel("Эпохи") plt.ylabel("Оценка MAE") plt.show()
Рис.2. Оценки MAE по эпохам за исключением первых десяти замеров
Как можно увидеть на рисунке 2, оценка MAE перестает существенно улучшаться после 120-140 эпох (данное число включает десять эпох, которые мы опустили). После этого наступает переобучение.
По окончании настройки других параметров модели (помимо количества эпох, хорошо также скорректировать количество промежуточных слоев) можно обучить окончательную версию модели на всех обучающих данных, а затем оценить ее качество на контрольных данных.
# Получить новую скомпилированную модель model = build_model() # Обучить ее на всем объеме обучающих данных model.fit(train_data, train_targets, epochs=130, batch_size=16, verbose=0) test_mse_score, test_mae_score = model.evaluate(test_data, test_targets)
Вот окончательный результат:
print(test_mae_score)
2.4642276763916016
Средняя ошибка опустилась ниже 2500 долларов. Это явное улучшение! Как и в двух предыдущих примерах, можете попробовать изменить количество слоев в модели или количество нейронов в каждом слое и посмотреть, удастся ли вам уменьшить ошибку на контрольных данных.
На следующем шаге мы рассмотрим предсказания на новых данных.