Проблема связана с передачей данных в модель в режиме поезда против в режиме вывода ;различия включают в себя:
- Режим поезда :
Dropout
активен, BatchNormalization
использует партия статистика для среднего и дисперсии - Логический вывод : все значения
Dropout
установлены на ноль, а BatchNormalization
использует экспоненциальное скользящее среднее статистика для среднего значения и дисперсии, вычисленная во время обучения
Другоеразличия также применяются. Предполагая, что модели, используемые в вашем коде, основаны на других вопросах (например, VGG) - это будут слои BN. В качестве обходного пути вы можете временно установить глобальную фазу обучения с помощью:
K.set_learning_phase(0) # INFERENCE MODE
K.set_learning_phase(1) # TRAIN MODE
Обратите внимание, однако, что любой из них должен быть выполнен за до создания экземпляра модели, иначе изменения не будутприменять. Кроме того, это может не решить проблему полностью, поскольку у BN, как известно, есть другие проблемы (которые, как мне кажется, в настоящее время расследуются) - но результаты, тем не менее, должны согласовываться намного ближе.
Наконец, если вы сначала вызовите train_on_batch()
и , а затем вызовите test_on_batch()
, оба не согласятся, потому что test
выполняется после того, как train
обновил весовые коэффициенты - таким образом, вызовите test_on_batch()
сначала , затем train_on_batch()
.
Полный пример :
from tensorflow.keras.layers import Input, Dense, Dropout
from tensorflow.keras.models import Model
import tensorflow.keras.backend as K
import numpy as np
K.set_learning_phase(0)
ipt = Input((12,))
x = Dropout(0.1)(ipt)
out = Dense(12)(x)
model = Model(ipt, out)
model.compile('adam', 'mse')
X = np.random.randn(32, 12)
print(model.train_on_batch(X, X))
print(model.test_on_batch(X, X))
print(model.train_on_batch(X, X))
2.1212778 # train_on_batch()
2.1128066 # test_on_batch()
2.1128066 # train_on_batch()
Попробуйте использовать K.set_learning_phase(1)
вместопосмотрите на разницу - или закомментируйте ее полностью, поскольку 1
является значением по умолчанию в любом случае.