线性回归实战 Tensorflow

在这里插入图片描述
线性回归实战 Tensorflow_第1张图片
线性回归实战 Tensorflow_第2张图片
线性回归实战 Tensorflow_第3张图片
线性回归实战 Tensorflow_第4张图片
线性回归实战 Tensorflow_第5张图片
线性回归实战 Tensorflow_第6张图片
线性回归实战 Tensorflow_第7张图片
线性回归实战 Tensorflow_第8张图片
线性回归实战 Tensorflow_第9张图片
线性回归实战 Tensorflow_第10张图片
线性回归实战 Tensorflow_第11张图片
线性回归实战 Tensorflow_第12张图片
线性回归实战 Tensorflow_第13张图片
线性回归实战 Tensorflow_第14张图片
线性回归实战 Tensorflow_第15张图片
线性回归实战 Tensorflow_第16张图片
这里有句话很重要:
批量是用于单次迭代中计算梯度的样本总数
这里有句话很重要:
批量是用于单次迭代中计算梯度的样本总数
这里有句话很重要:
批量是用于单次迭代中计算梯度的样本总数

import tensorflow as tf
import numpy as np
import time
import matplotlib.pyplot as plt
#等差数列 从-1到1的100个点
x_data=np.linspace(-1,1,100)
#*对元组进行拆包,得到数值100,x_data.shape的返回值就是一个元组
y_data=2*x_data+1.0+np.random.randn(*x_data.shape)

# print(zip(x_data,y_data))#
# for a,b in zip(x_data,y_data):
#     print(a)#x_data中的值,一个循环打印一个
#     print(b)#y_data中的值

# for x in zip(x_data,y_data):
#     print(x)#此时输出的就是元组,联系元组解包更方便记忆,上面就是用a,b解包


plt.scatter(x_data,y_data)
plt.plot(x_data,2*x_data+1,color="red",linewidth=3)
plt.show()

#定义训练数据的占位符,x是特征值,y是标签值
x=tf.placeholder(tf.float32,name="x")
y=tf.placeholder(tf.float32,name="y")

#构建回归模型
def model(x,w,b):
    return tf.multiply(x,w)+b

#构建线性函数的斜率和截距
w=tf.Variable(1.0,"W0")
b=tf.Variable(0.0,"B0")

#pred是预测值,用于前向计算
pred=model(x,w,b)

#迭代次数
train_epoch=10
#学习率
learning_rate=0.01

#采用均方差为损失函数
loss=tf.reduce_mean(tf.square(y-pred))
#选择梯度下降优化器
optimizer=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)

#声明一个会话
sess=tf.Session()
#初始化变量
init=tf.global_variables_initializer()
sess.run(init)

#显示损失值
step=0#记录训练步数
loss_list=[]#用于保存loss值的列表
display_step=2#每隔多少步打印损失值
#执行训练
for epoch in range(train_epoch):
    for xs,ys in zip(x_data,y_data):
        # 这里根据zip函数,应该用的是训练一次用一个样本,即SGD,随机梯度下降,但是好像又不是随机,因为是按顺序一个个拿,反正是一次一个样本
        _,loss1=sess.run([optimizer,loss],feed_dict={x:xs,y:ys})
        loss_list.append(loss1)
        step=step+1

        if step%display_step==0:
            print("Train epoch:","%02d"%(epoch+1),"step:%03d"%(step),\
                  "loss=","{:.9f}".format(loss1))
    #根据zip函数在for循环中的表现,这里是全部样本训练一遍后输出依次当前权重和偏置值
    b0temp=b.eval(session=sess)
    w0temp=w.eval(session=sess)
    plt.plot(x_data,x_data*w0temp+b0temp,\
             color="r",linewidth=3)
plt.legend(loc=3)#通过loc指定图例位置
plt.scatter(x_data, y_data,label="original data")
plt.show()
plt.plot(loss_list)
plt.show()
plt.plot(loss_list,"r+")
plt.show()

print("w的最终值:",sess.run(w))
print("b的最终值:",sess.run(b))


#进行预测
x_test=3
y_pred=sess.run(pred,feed_dict={x:x_test})
y_expect=x_test*2+1.0
print("预测值为%f"%y_pred)
print("期待值为%f"%y_expect)


#报错:TypeError: Can not convert a float32 into a Tensor or Operation.
#原因:接收的变量名不能跟run中的变量名一样,所有把loss改成loss1


线性回归实战 Tensorflow_第17张图片
线性回归实战 Tensorflow_第18张图片
线性回归实战 Tensorflow_第19张图片
线性回归实战 Tensorflow_第20张图片
由于样本数据随机性大
所以用一个一元线性函数拟合

看图就看的出来
一条细线拟合那么宽的区域
精度不高

线性回归实战 Tensorflow_第21张图片

`

你可能感兴趣的:(tensorflow)