Keras:初始化权重时不学习的模型

时间:2018-06-09 00:28:31

标签: python-3.x tensorflow keras

使用Keras设置初始模型权重时,模型不会在后续训练调用中更新。

MNIST数据示例:(初始权重在示例中是随机的,但将在未来的迭代中传递,因此使用随机内核不是一种选择)

W1 = np.random.rand(784, n_nodes)
b1 = np.random.rand(n_nodes,)
W2 = np.random.rand(n_nodes, 10)
b2 = np.random.rand(10,)
model = Sequential()
model.add(Dense(n_nodes, input_dim=784, activation='relu', weights=[W1,b1]))
model.add(Dense(10, activation='softmax', weights = [W2, b2]))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

for batch in batch_sets:
     model.train_on_batch(batch[0], batch[1])

我在每次迭代中通过b1检查get_weights()参数,并且可以看到原始随机b1没有更新。

我也尝试使用set_weights以及自定义内核(和偏见)初始化程序,并遇到了同样的问题。当内核初始化程序设置为1或0时,也会发生同样的无更新问题,但是当使用随机内核初始化程序时,行为符合预期(也称为适当更新)。

是否有其他方法可以设置初始权重,以便在后续模型培训调用中更新它们?

1 个答案:

答案 0 :(得分:0)

weights=参数正在替换通常放在.weights的{​​{1}}属性中的内容,这些属性是TensorFlow变量。用numpy数组替换变量意味着它们在TensorFlow图中被嵌入为常量,这意味着优化器会忽略它们(它们是常量!)。

相反,你可以将numpy数组作为内核和偏见的初始化者传递:Layer