TensorFlow实战入门(一)

题目一:
通过生成人工数据集合,基于TensorFlow实现y=3.1234*x+2.98线性回归(10分)

评分标准:

1、生成 x_data,值为 [0, 100]之间500个等差数列数据集合作为样本特征,
根据目标线性方程 y=3.1234x+2.98,生成相应的标签集合 y_data,1分;
2、画出随机生成数据的散点图和想要通过学习得到的目标线性函数 y=3.1234
x+2.98,1分;
3、构建回归模型,3分;
4、训练模型,10轮,每训练20个样本显示损失值,2分;
5、通过训练出的模型预测 x=5.79 时 y 的值,并显示根据目标方程显示的 y 值,1分;
6、通过Tensorboard显示构建的计算图,2分。

实现代码:

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt


tf.reset_default_graph()
#日志文件存放目录
logdir='D:/log'

#设置随机数种子
np.random.seed(8)

#第一步:准备数据
#生成500个样本特征,采用等差数列,取值在[0,100]
x_data=np.linspace(0,100,500)
#根据目标线性方程 y=3.1234*x+2.98+噪声,生成相应的标签集合 y_data
y_data=3.1234*x_data+2.98+np.random.randn(*x_data.shape)*0.9
#画出随机生成数据的散点图
plt.scatter(x_data,y_data)
#画出我们想要学习到的目标函数: y=3.1234*x+2.98
plt.plot(x_data,3.1234*x_data+2.98,color='red',linewidth=1)
#plt.show()

#第二步:构建模型
#定义数据的占位符,x是特征值,y是标签值
x=tf.placeholder('float',name='x')
y=tf.placeholder('float',name='y')

#定义模型
def model(x,w,b):
    return tf.multiply(x,w)+b

#定义模型结构
#构建线性函数的斜率,变量w
w=tf.Variable(2.5,name='w0')
#构建线性函数的截距,变量b
b=tf.Variable(2.0,name='b0')
#pred是预测值,前向计算
pred=model(x,w,b)

#第三步:训练模型
#设置训练轮次
train_epochs=10
#设置学习率,一般设置0.1~0.01之间的值
learning_rate=0.0001
#采用均方差作为损失函数
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))

#开始训练,轮数为epochs,采用SGD随机梯度下降优化方法
step=0 #记录训练步数
loss_list=[]  #用于保存loss值的列表
#设置迭代轮次
for epoch in range(train_epochs):
    for xs,ys in zip(x_data,y_data):
        _,loss=sess.run([optimizer,loss_function],feed_dict={x:xs,y:ys})
        #将每一次的损失值放入列表
        loss_list.append(loss)
        step=step+1
        #每训练20个样本输出一次损失值
        display_step=20
        if step % display_step==0:
            print("Train Epoch:%02d"%(epoch+1),"Step:%04d"%step,"loss=","{:.9f}".format(loss))
    #每一轮训练完,有一个w,b值
    b0temp=b.eval(session=sess)
    w0temp=w.eval(session=sess)
    #画出训练模型
    #plt.plot(x_data,w0temp*x_data+b0temp)


plt.scatter(x_data,y_data,label='Original data')
#显示训练好的模型
plt.plot(x_data,x_data*sess.run(w)+sess.run(b),\
         label='Fitted line',color='r',linewidth=1)
#通过参数loc指定图例位置
plt.legend(loc=2)
plt.show()
#plt.plot(loss_list)

print('最后w和b的值为:')
print('w:',sess.run(w))
print('b:',sess.run(b))

#第四步:利用模型进行预测
x_test=5.79
predict=sess.run(pred,feed_dict={x:x_test})
print('预测值:%f'% predict)
target=3.1234*x_test+2.98
print('目标值:%f' % target)
#生成一个写日记的writer
writer=tf.summary.FileWriter(logdir,tf.get_default_graph())
writer.close()

运行结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
遇到困难及解决办法:
在这里插入图片描述

训练过程,出现loss=NAN的问题。

原因:如果在迭代的100轮以内,出现NaN,一般情况下的原因是因为学习率过高,需要降低学习率。我们可以不断降低学习率直至不出现NaN为止,一般来说低于现有学习率1→10倍即可

我的解决办法:
最开始我的学习率是:learning_rate=0.05
最后通过不断调试,将学习率设置为:learning_rate=0.0001,就解决NAN问题。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值