实例:构造线性回归模型
x = np.float32(np.random.normal(8, 10, [1,100]))//生成1行100列的随机数据矩阵
y = 0.5*x + 1.2 + np.random.normal(0, 0.01)//计算对应的y值
w = tf.Variable(tf.zeros([1,1]))//初始化训练的w
b = tf.Variable(tf.zeros([1]))//初始化训练的b
loss = tf.reduce_mean(tf.square(pre_y - y));//构造损失函数:均方误差
opt = tf.train.GradientDescentOptimizer(0.005)//使用优化方法:梯度下降优化
res = opt.minimize(loss)//使用优化方法:梯度下降法
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for step in range(0, 2001)://执行2001次训练,2001是为输出好看,可以输出第2000次迭代
sess.run(res)//开始执行整个训练逻辑
if step % 200 == 0:
y__ = tf.matmul(w, x) + b//每200次迭代计算一次当前的输出y__和原始输出y对比
plt.scatter(x, y, c='r')
plt.scatter(x, sess.run(y__), c='g')
plt.show()
print(step,":", sess.run(w), sess.run(b))
在修改上面代码中各个参数的时候,发现了很多有趣的现象:
1)验证了正态分布:x用正态分布产生,均值是8,方差决定了x在8周围取值的聚集程度
2)y的公式和x的均值,影响了梯度下降学习率,上面代码中实际斜率0.5,如果学习率太高,比如默认的0.5,会无法收敛,所以上面用了0.005
3)准备测试数据时,要注意w*x和b的差值,开始的时候我把x取均值0,方差0.1,结果b主导了y值,导致结果无法收敛