手动计算Backpropagation结果与Keras输出权重不一致问题求助
手动反向传播与Keras训练后权重结果不一致
我手动计算反向传播后的权重结果为0.19926,但用Keras训练相同结构的MLP后,输出的权重却是0.19882499,二者数值不匹配。
相关信息
- 已完成手动反向传播计算过程(对应计算逻辑图)
- MLP结构:输入层2神经元,隐藏层5个带sigmoid激活的神经元(无偏置),输出层1个带sigmoid激活的神经元(无偏置)
- 初始权重设置:隐藏层权重全部为0.1,输出层权重全部为0.2
-- 训练参数:SGD优化器(学习率0.01,无动量等额外配置),损失函数为均值绝对误差(MAE),单样本输入[[0,0]]、标签[[0]],训练1轮
Keras实现代码
from keras.mixed_precision.loss_scale_optimizer import optimizer import numpy as np import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers xtrain=[[0,0]] ytrain=[[0]] inputs = keras.Input(shape=(2,)) x=keras.layers.Dense(5,activation="sigmoid", use_bias=False, bias_initializer='zeros')(inputs) output=layers.Dense(1,activation="sigmoid", use_bias=False, bias_initializer='zeros')(x) model=keras.Model(inputs=inputs,outputs=output,name="xor") model.compile(loss='mean_absolute_error', optimizer=tf.keras.optimizers.SGD( learning_rate=0.01, momentum=0.0, nesterov=False, weight_decay=0.0, clipnorm=None, clipvalue=None, global_clipnorm=None, use_ema=False, ema_momentum= 0, ema_overwrite_frequency=None, jit_compile=True, name="SGD", )) i=0 for layerNum, layer in enumerate(model.layers): if(i==1): layer.set_weights([np.array([[0.1,0.1,0.1,0.1,0.1],[0.1,0.1,0.1,0.1,0.1]])]) if(i==2): layer.set_weights([np.array([[0.2],[0.2],[0.2],[0.2],[0.2]])]) i=i+1 history=model.fit(xtrain,ytrain,batch_size=1,epochs=1) for layerNum, layer in enumerate(model.layers): weights = layer.get_weights() print("weights=",weights) print(layerNum,"layerNum")
内容的提问来源于stack exchange,提问作者ea13
相关产品推荐
相关产品推荐

