我正在使用一个keras顺序模型,其中输入和标签在每个运行中完全相同。Keras使用张量为后端。
我将层激活设置为"零",并在培训期间将残疾人批次改组。
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
训练后,我仍然获得不同的准确性和损失值。
我是否缺少某些东西,或者没有办法完全删除培训之间的差异?
,因为这似乎是一个真正的问题,如前所述,也许您可以手动初始化自己的权重(而不是相信在图层构造函数中传递的'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])
似乎问题出现在训练中而不是初始化。您可以首先初始化两个模型 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. ")
即使所有断言通过,培训 model1 和 model2 shuffle = false 产生了不同的模型。也就是说,如果我对 model1 和 model2 的权重进行类似的断言,则在训练断言后,我都会失败。这表明问题在于训练的随机性。
截至这篇文章时,我尚未设法弄清楚如何规避这一点。