На этом шаге мы рассмотрим реализацию таких оценок.
Цель машинного обучения не в том, чтобы создать модели, которые дают точные прогнозы на обучающих данных (что довольно просто - достаточно лишь следовать за градиентом), а в том, чтобы создать модель, хорошо справляющуюся со своей задачей в целом - и особенно на данных, которые она раньше не видела. Хорошие результаты на обучающих данных не гарантируют такой же исход на данных, которые модель не видела прежде! Например, она может просто запомнить связь между обучающими данными и ожидаемыми результатами - и в новых условиях для задачи прогнозирования станет совершенно бесполезной. Мы рассмотрим этот аспект более подробно в последующих шагах.
Для оценки качества модели - того, как она справляется со своей задачей на новых данных, - обычно принято выделять некоторую часть исходных данных в отдельную проверочную выборку: данные из этой выборки не участвуют в обучении модели, но используются для вычисления величины потерь и метрик. Проверочную выборку можно передать методу fit() в аргументе validation_data.
По аналогии с обучающими данными проверочные данные могут передаваться в форме массива NumPy или объекта Dataset из библиотеки TensorFlow.
model = keras.Sequential([keras.layers.Dense(1)]) model.compile(optimizer=keras.optimizers.RMSprop(learning_rate=0.1), loss=keras.losses.MeanSquaredError(), metrics=[keras.metrics.BinaryAccuracy()]) # Чтобы избежать попадания в проверочную выборку только # экземпляров одного класса, исходные и целевые данные # перемешиваются методом случайной перестановки индексов indices_permutation = np.random.permutation(len(inputs)) shuffled_inputs = inputs[indices_permutation] shuffled_targets = targets[indices_permutation] # Зарезервировать 30 % исходных и целевых данных для # проверки (эти образцы будут исключены из процесса обучения # и используются только для вычисления величины потерь и метрик) num_validation_samples = int(0.3 * len(inputs)) val_inputs = shuffled_inputs[:num_validation_samples] val_targets = shuffled_targets[:num_validation_samples] training_inputs = shuffled_inputs[num_validation_samples:] training_targets = shuffled_targets[num_validation_samples:] model.fit( training_inputs, # Обучающие данные, использующиеся training_targets, # для корректировки весов модели epochs=5, batch_size=16, # Проверочные данные, использующиеся только для # оценки величины потерь и метрик на этапе проверки validation_data=(val_inputs, val_targets) )
Величина потерь, полученная при оценке на проверочных данных, называется потерей на проверочных данных, чтобы отличать ее от потери на обучающих данных. Помните: важно строго отделять одни данные от других. Задача проверки состоит в том, чтобы оценить, насколько хорошие результаты показывает обученная модель на новых данных. Если модель видела проверочные данные во время обучения, то потери на проверочных данных и метрики будут оцениваться некорректно.
Потери на проверочных данных и метрики можно вычислить после завершения обучения вызовом метода evaluate():
loss_and_metrics = model.evaluate(val_inputs, val_targets, batch_size=128)
Метод evaluate() выполнит итерации по пакетам (размером batch_size) с переданными данными и вернет список скаляров, первый из которых - величина потерь на проверочных данных, а последующие - метрики. Если модель не имеет метрик, то возвращено будет только одно значение - величина потерь на проверочных данных (а не список) .
На следующем шаге мы рассмотрим применимость созданной модели.