我使用Keras Sequential模型,其中输入和标签每次运行完全相同。 Keras正在使用Tensorflow后端。
我已将图层激活设置为“零”'培训期间禁用批次改组。
model = Sequential()
model.add(Dense(128,
activation='relu',
kernel_initializer='zeros',
bias_initializer='zeros'))
...
model.compile(optimizer='rmsprop', loss='binary_crossentropy')
model.fit(x_train, y_train,
batch_size = 128, verbose = 1, epochs = 200,
validation_data=(x_validation, y_validation),
shuffle=False)
我也试过播种Numpy的random()
方法:
np.random.seed(7) # fix random seed for reproducibility
有了上述内容,我在训练后仍会收到不同的准确度和损失值。
我是否遗漏了某些内容,或者无法完全消除培训之间的差异?
答案 0 :(得分:1)
由于这似乎是real issue,如前所述,也许您可以手动初始化权重(而不是信任层构造函数中传递的'zeros'参数):
#where you see layers[0], it's possible that the correct layer is layers[1] - I can't test at this moment.
weights = model.layers[0].get_weights()
ws = np.zeros(weights[0].shape)
bs = np.zeros(weights[1].shape)
model.layers[0].set_weights([ws,bs])
答案 1 :(得分:0)
看来问题出在训练中而不是初始化中。您可以通过首先初始化两个模型 model1 和 model2 并运行以下代码来进行检查:
w1 = model1.get_weights()
w2 = model2.get_weights()
for i in range(len(w1)):
w1i = w1[i]
w2i = w2[i]
assert np.allclose(w1i, w2i), (w1i, w2i)
print("Weight %i were equal. "%i)
print("All initial weights were equal. ")
即使所有断言都通过了,使用 shuffle = False 训练 model1 和 model2 也会产生不同的模型。也就是说,如果我在训练了断言之后对 model1 和 model2 的权重执行了类似的断言。这表明问题出在训练的随机性上。
截至本文,我还没有弄清楚如何规避此问题。