使用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])
我在每次迭代中通过 get_weights()
检查 b1
参数,并且可以看到没有从原始随机 b1
进行更新 .
我也尝试使用 set_weights
以及自定义内核(和偏向)初始化程序,并遇到同样的问题 . 当内核初始化程序设置为1或0时,也会发生同样的无更新问题,但是当使用随机内核初始化程序时,行为与预期一样(也称为适当更新) .
是否有其他方法可以设置初始权重,以便在后续模型培训调用中更新它们?
1 回答
weights=
参数正在替换通常放在Layer
的.weights
属性中的内容,这些属性是TensorFlow变量 . 用numpy数组替换变量意味着它们在TensorFlow图中被嵌入为常量,这意味着优化器会忽略它们(它们是常量!) .相反,您可以将numpy数组作为内核的初始值设定项和偏差传递:
Dense(kernel_initializer=w1, bias_initializer=b1, ...