我可以以确定性的方式进行keras培训



我正在使用一个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 的权重进行类似的断言,则在训练断言后,我都会失败。这表明问题在于训练的随机性。

截至这篇文章时,我尚未设法弄清楚如何规避这一点。

最新更新