首页 文章

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

提问于
浏览
2

使用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 回答

  • 0

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

    相反,您可以将numpy数组作为内核的初始值设定项和偏差传递: Dense(kernel_initializer=w1, bias_initializer=b1, ...

相关问题