改变随机梯度下降优化器对keras顺序模型的学习率对训练后的权重没有预期的影响。
我一直在尝试对整个数据集进行一次迭代之后,基于一个极小的(4个样本和3个具有二进制标签的特征)数据集来更新Keras顺序模型的权重。我做这个练习是因为稍后我将手动执行反向传播,并证明我的结果与计算机相符。我正在使用train_on_batch类来完成此任务。我想强调一下train_on_batch完成的一次迭代之后权重的变化,但是改变学习率似乎并不能对权重和偏见的变化幅度产生可预测的影响。我测试了将学习率设置为0会发生的情况,并且确实得到了一个没有意义的答案,因为权重和偏见应该不变。学习率的变化不应该与体重和偏差值的变化成正比吗?为什么即使我将学习率设置为零,权重也会改变?
model = Sequential([
Dense(2, input_shape=(3,), activation='sigmoid', kernel_initializer='ones', bias_initializer='zeros'),
Dense(1, activation='sigmoid', kernel_initializer='ones', bias_initializer='zeros')
])
sgd = keras.optimizers.SGD(lr=0)
model.compile(
optimizer='sgd',
loss='mean_squared_error',
metrics=['accuracy'],
)
model.train_on_batch(
features, # training data
labels, # training targets
)
for layer in model.layers:
weights = layer.get_weights()[0]
print(weights)
[[1. 1. ]
[1. 1. ]
[0.9999999 0.9999999]]
[[0.99839985]
[0.99839985]]
for layer in model.layers:
biases = layer.get_weights()[1]
print(biases)
[-7.547273e-09 -7.547273e-09]
[-0.00160019]
由于权重初始化为1且偏差为零,所以我希望在运行train_on_batch之后它们会保持这种方式,因为学习率=0。事实并非如此,这揭示了一些我不知道的潜在问题