使用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时,也会发生同样的无更新问题,但是当使用随机内核初始化程序时,行为符合预期(也称为适当更新)。
是否有其他方法可以设置初始权重,以便在后续模型培训调用中更新它们?
答案 0 :(得分:0)
weights=
参数正在替换通常放在.weights
的{{1}}属性中的内容,这些属性是TensorFlow变量。用numpy数组替换变量意味着它们在TensorFlow图中被嵌入为常量,这意味着优化器会忽略它们(它们是常量!)。
相反,你可以将numpy数组作为内核和偏见的初始化者传递:Layer