Tensorflow学习之单变量线性预测


tensorflow学习中,记录
单变量线性y=w*x+b
看图:

训练模型:通过有标签的样本来学习确定未知的权重和偏置
训练过程中,尽可能地减少损失
损失:对单个样本,预测的准确度
L1损失:预测值和真值的差值
L2损失,均方差MSE
收敛:loss不再变化或变化极慢
梯度下降:函数中某一点的方向导数沿着该方向取得最大值即梯度方向
用负梯度
学习率设置合理,过大不能收敛在最优点左右振荡,过小太慢

数据准备

#-*- coding: utf-8 -*-
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
#定义随机数种子
np.random.seed(5)
#生成原始数据,等差数列x,假设数据为2x+1相关
x_data=np.linspace(-1,1,100)
#y加噪音
y_data=2*x_data+1.0+np.random.randn(*x_data.shape)*0.4

构建模型

#定义占位符
x=tf.placeholder("float",name='x')
y=tf.placeholder("float",name='y')
#定义模型
def model(x,w,b):
    return tf.multiply(x,w)+b
#初始化权重和偏值
w=tf.Variable(1.0,name='w')
b=tf.Variable(0.0,name='b')
#定义预测值
pred=model(x,w,b)
#设置训练参数
step=0
display_step=20
loss_list=[]
train_epochs=10
learning_rate=0.5
#设置损失函数均方差公式
loss_function=tf.reduce_mean(tf.square(y-pred))
#设置优化器为梯度下降+取最小值损失
optimizer=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function)

训练模型

sess=tf.Session()
#初始化常量
init=tf.global_variables_initializer()
sess.run(init)
#开始训练
for epoch in range(train_epochs):
    #x_0,y_0从x_data中随机取一组值并赋予
    for xs,ys in zip (x_data,y_data):
        #loss获取loss_function,x_0填充x,y
        _,loss=sess.run([optimizer,loss_function],feed_dict={x:xs,y:ys})
        #储存loss
        loss_list.append(loss)
        step=step+1
        if step%display_step==0:
            print("epoch:",(epoch+1),"step:",step,"loss:","{:.9f}".format(loss))
#输出w,b训练结果
print("w:",sess.run(w))
print("b:",sess.run(b))
#绘制输入散点图
plt.scatter(x_data,y_data,label="In_dat")
#plt.plot(x_data,2*x_data+1.0,color='red',linewidth=3)
#绘制训练结果
plt.plot(x_data,sess.run(w)*x_data+sess.run(b),label='Result',color='red',linewidth=3)
#显示标签
plt.legend(loc=2)
#创建第二幅图并显示loss
fig = plt.figure()
plt.plot(loss_list)
plt.show()

预测结果

#预测
x_test = 9
predict=sess.run(pred,feed_dict={x:x_test})
print("predict:",predict)
print("target:",x_test*2+1.0)