Но выпадающие слои обычно создают противоположный эффект, делая потери на оценке меньше, чем потери во время тренировки.
Не обязательно! Хотя в выпадающем слое некоторые нейроны сброшены, но имейте в виду, что выход сокращается в соответствии со скоростью выпадения. В момент вывода (т.е. время тестирования) отсев полностью исключается, и, учитывая, что вы обучили свою модель только для одной эпохи, поведение, которое вы видели, может произойти. Не забывайте, что, поскольку вы тренируете модель только для одной эпохи, только часть нейронов была отброшена в слое выпадения, но все они присутствуют во время вывода.
Если вы продолжите тренировать модель для большего количества эпох, вы можете ожидать, что потеря тренировки и тестовая потеря ( на тех же данных ) станут более или менее одинаковыми.
Поэкспериментируйте сами: просто установите параметр trainable
слоя (ов) Dropout на False
и посмотрите, происходит ли это или нет.
Кто-то может быть сбит с толку (как и я), видя, что после одной эпохи обучения потеря обучения не равна потере оценки в той же партии данных. И это не относится к моделям со слоями Dropout
или BatchNormalization
. Рассмотрим этот пример:
from keras import layers, models
import numpy as np
model = models.Sequential()
model.add(layers.Dense(1000, activation='relu', input_dim=100))
model.add(layers.Dense(1))
model.compile(loss='mse', optimizer='adam')
x = np.random.rand(32, 100)
y = np.random.rand(32, 1)
print("Training:")
model.fit(x, y, batch_size=32, epochs=1)
print("\nEvaluation:")
loss = model.evaluate(x, y)
print(loss)
Выход:
Training:
Epoch 1/1
32/32 [==============================] - 0s 7ms/step - loss: 0.1520
Evaluation:
32/32 [==============================] - 0s 2ms/step
0.7577340602874756
Так почему потери различаются, если они были рассчитаны по одним и тем же данным, т.е. 0.1520 != 0.7577
?
Если вы спросите это, то это потому, что вы, как и я, не уделили достаточного внимания: 0.1520
- это потеря до обновления параметров модели (то есть до выполнения обратного прохода или обратного распространения). И 0.7577
- это потеря после обновления весов модели. Несмотря на то, что используемые данные одинаковы, состояние модели при вычислении этих значений потерь не одинаково (Другой вопрос: почему потеря увеличилась после обратного распространения? Это просто потому, что вы обучили ее только за одну эпоху и поэтому обновления весов еще недостаточно стабильны).
Чтобы подтвердить это, вы также можете использовать тот же пакет данных, что и данные проверки:
model.fit(x, y, batch_size=32, epochs=1, validation_data=(x,y))
Если вы запустите приведенный выше код с измененной строкой выше, вы получите вывод наподобие этого (очевидно, точные значения могут отличаться для вас):
Training:
Train on 32 samples, validate on 32 samples
Epoch 1/1
32/32 [==============================] - 0s 15ms/step - loss: 0.1273 - val_loss: 0.5344
Evaluation:
32/32 [==============================] - 0s 89us/step
0.5344240665435791
Вы видите, что потери при проверке и потери при оценке абсолютно совпадают: это происходит потому, что проверка выполняется в конце эпохи (т. Е. Когда весы моделей уже были обновлены).