如何解决在Tensorflow中使用Rmsprop进行线性回归
我正在尝试使用Rms Prop优化器从头开始实现线性回归。
代码:
EPOCHS = 100
w3 = tf.Variable(w_vector,dtype = tf.float32)
w4 = tf.Variable(0,dtype = tf.float32)
lr = 1e-5
beta = 0.9
epilson = 1e-7
momentum = 0.0
for epoch in range(1,EPOCHS+1):
mom_w = 0
mom_b = 0
mean_square_w = 0
mean_gradient_w = 0
mean_square_b = 0
mean_gradient_b = 0
y_pred1 = tf.squeeze(tf.matmul(w3,x,transpose_a = True,transpose_b = True) + w4)
dw3,dw4 = gradients_mse(x,y,y_pred1)
# My eqautions for RMS prop
mean_square_w = beta * mean_square_w + (1-beta) * dw3 ** 2
mean_gradient_w = beta * mean_gradient_w + (1-beta) * dw3
mom_w = momentum * mom_w + lr * (dw3/(tf.sqrt(mean_square_w + epilson - mean_gradient_w ** 2)))
mean_square_b = beta * mean_square_b + (1-beta) * dw4 ** 2
mean_gradient_b = beta * mean_gradient_b + (1-beta) * dw4
mom_b = momentum * mom_b + lr * (dw4/(tf.sqrt(mean_square_b + epilson - mean_gradient_b ** 2)))
w3.assign_sub(mom_w)
w4.assign_sub(mom_b)
print('w3 : {}'.format(w3.numpy()))
print('w4 : {}'.format(w4.numpy()))
输出:
w3 : [[-1.2507935]]
w4 : 0.0033333366736769676
现在,我创建一个没有激活功能的单层和单个神经元神经网络。在其神经元中分配相同的权重,并使用RMS prop作为优化器,我得到不同的最终权重。但是,sgd Optimizer并非如此。
代码:
# using keras to get same results
def create_model():
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(units = 1,name = 'd1',input_shape = (x.shape[1],)))
model.compile(optimizer=tf.keras.optimizers.RMSprop(
learning_rate=1e-5,rho=0.9,momentum=0.0,epsilon=1e-07,centered=False),loss="mse")
return model
model = create_model()
d1 = model.get_layer('d1')
d1_weights = [tf.constant(w_vector,dtype = tf.float32),tf.constant(np.array([0]),dtype = tf.float32)]
d1.set_weights(d1_weights)
model.fit(x,epochs = 100)
d1 = model.get_layer('d1')
print('w3 = {}'.format(d1.weights[0].numpy()))
print('w4 = {}'.format(d1.weights[1].numpy()[0]))
输出:
w3 = [[-1.2530397]]
w4 = 0.0010913893347606063
我的梯度可以正确计算出mse损失函数。我已经使用内置的tensorflows交叉检查了内置的梯度计算功能gradient tape。
代码:
# Computing gradients
def gradients_mse(X,Y,Y_PREDS):
DW1 = tf.matmul(X,tf.reshape(Y-Y_PREDS,(X.shape[0],1)),transpose_a = True) * (-2/X.shape[0])
DW0 = (-2 / X.shape[0]) * tf.reduce_sum(Y - Y_PREDS)
return DW1,DW0
此实现中唯一会出错的地方是我认为使用错误的公式计算 mom_w 和 mom_b 。
x.shape = [10,1]
默认批次大小为32,因此对重量更新没有影响。当我尝试使用简单的梯度下降而不是RMS prop时,相同的代码给出了完全匹配的输出。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。