根据Isola等人,2017年以及其他一些消息来源,即使在测试时间(使用移动平均值/培训平均值的常见做法),GAN的batchNorm应该只使用批次的均值和标准。代替)。就我而言,这意味着强制batchNorm在预测期间使用批处理均值/标准。
我现在对此进行了相当多的调查,我对如何实现这一点感到非常困惑。 我正在使用keras 2.1.4和tensorflow。
经过一番调查后,我发现应该用K.set_learning_phase(1)来实现。这不会导致预测函数的预期行为,并且实际上会导致其他几种情况下的预期行为!
例如,让我们观察一下这个简单的片段:
import keras
from keras.layers.normalization import BatchNormalization
from keras.models import Sequential
import numpy as np
from keras import backend as K
print("Version: ", keras.__version__)
np.random.seed(1);
model = Sequential()
model.add(BatchNormalization(input_shape=(2,)))
model.compile(loss='mse', optimizer='adam')
X = np.random.normal(size=(5, 2))
print("Prediction before training: ", model.predict(X))
print("Weights before training: ", [[list(w) for w in l.get_weights()] for l in model.layers])
Y = np.random.normal(size=(5, 2))
model.fit(X, Y, verbose=0, epochs=10)
#K.set_learning_phase(1)
print("\n\nPrediction 1: ", model.predict(X))
print("Weights after training: ", [[list(w) for w in l.get_weights()] for l in model.layers])
现在,通过评论进出K.set_learning_phase,我预计预测的价值会发生变化。事实上,他们没有。
调查这个我得到了更奇怪的结果。 K.set_learning_phase以奇怪的方式影响学习的重量。如果在fit之前放置set_learning_phase,那么它将返回不同的权重值(相比之下,不将它放在那里或在拟合之后放置),无论其值(0或1)如何都会发生这种情况!这也意味着在拟合之前设置set_learning_phase会改变预测值,但这仅仅是因为学到的权重不同,而不是因为计算预测的方式不同。
这里发生了什么?
由于