问题遇到的现象和发生背景
关于一元线性回归y=wx+b中 w 和 b 的初始化问题
实现3.1234x+2.98的线性回归
问题相关代码,请勿粘贴截图
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
np.random.seed(5)
x_data=np.linspace(0,100,500) //生成[0,100]间有500个数据的等差数列
y_data=3.1234*x_data+2.980+np.random.randn(*x_data.shape)*0.5 //加入噪声
x_data=tf.cast(x_data,dtype=tf.float32)
y_data=tf.cast(y_data,dtype=tf.float32)
def model(x,w,b):
return tf.multiply(x,w)+b
//损失函数
def MSEloss(x,y,w,b):
err=y-model(x,w,b)
sqrerr=tf.square(err)
return tf.reduce_mean(sqrerr)
//初始化
w=tf.Variable(1.0,tf.float32)
b=tf.Variable(1.0,tf.float32)
traning_epoches=10
step=0
display_step=20
loss_list=[]
learning_rate=0.0001
optimizer=tf.optimizers.SGD(learning_rate)
//训练模型
for epoch in range(traning_epoches):
for nx,ny in zip(x_data,y_data):
with tf.GradientTape() as tape:
loss=MSEloss(nx,ny,w,b)
loss_list.append(loss)
delta=tape.gradient(loss,[w,b])
optimizer.apply_gradients(zip(delta,[w,b]))
step=step+1
if step % display_step==0:
print("Traning Epoch:",'%02d' %(epoch+1),"Setp: %03d" %(step),"Loss=%.6f" %(loss))
plt.plot(x_data,w.numpy()*x_data+b.numpy())
x_test=5.79
prd=model(x_test,w.numpy(),b.numpy())
print("预测值:%f" %prd)
target=3.1234*x_test+2.98
print("目标值:%f" %target)
运行结果及报错内容
当变量b的初值设为1.0的时候,预测出的结果如下
预测值:18.959854
目标值:21.064486
w= <tf.Variable 'Variable:0' shape=() dtype=float32, numpy=3.093086>
b= <tf.Variable 'Variable:0' shape=() dtype=float32, numpy=1.050886>
当变量b的初值设为3.0,接近2.98,即b=tf.Variable(3.0,tf.float32)
预测结果如下
w= <tf.Variable 'Variable:0' shape=() dtype=float32, numpy=3.07139>
b= <tf.Variable 'Variable:0' shape=() dtype=float32, numpy=3.222441>
预测值:21.005789
目标值:21.064486
为什么b的初值设为和真实值差不多,训练结果会更好,但是不是说初值设置多少是无影响的吗?
是哪里有问题?