我能否以确定的方式进行Keras培训?

时间:2017-09-05 15:25:26

标签: random keras keras-layer

我使用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

有了上述内容,我在训练后仍会收到不同的准确度和损失值。

我是否遗漏了某些内容,或者无法完全消除培训之间的差异?

2 个答案:

答案 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 的权重执行了类似的断言。这表明问题出在训练的随机性上。

截至本文,我还没有弄清楚如何规避此问题。