通过生成人工数据集合,基于TensorFlow实现y=3.1234*x+2.98线性回归。通过上传附件方式提交 notebook文件(.ipynb)
评分标准:
1、生成 x_data,值为 [0, 100]之间500个等差数列数据集合作为样本特征,根据目标线性方程 y=3.1234*x+2.98,生成相应的标签集合 y_data,1分;(思路:通过线性变换将[0,100]之间的数转换为区间[-1,1],类似于归一化和机器学习中的sigmod函数,这样就不用调整振幅和学习率了)
2、画出随机生成数据的散点图和想要通过学习得到的目标线性函数 y=3.1234*x+2.98,1分;(散点图函数scatter与matlab中的相似)
3、构建回归模型,3分;
4、训练模型,10轮,每训练20个样本显示损失值,2分;(训练迭代,相似于遗传算法)
5、通过训练出的模型预测 x=5.79 时 y 的值,并显示根据目标方程显示的 y 值,1分;(预测估计值)
6、通过Tensorboard显示构建的计算图。(输入localhost的IP显示)
上传的源代码中有相应的源代码结果计算图截图可以嵌入上交的notebook文件(.ipynb)。2分。
%matplotlib inline
import matplotlib.pyplot as plt #载入matplotlib库
import numpy as np #载入numpy
import tensorflow.compat.v1 as tf
from IPython.display import Image
tf.disable_v2_behavior()
#清除default_graph和不断增加的节点
tf.reset_default_graph()
#路径
logdir = "D:/log"
#import tensorflow as tf #载入tensorflow,tensorflow2.0不支持placeholder
np.random.seed(5) #设置伪随机种子,种子相同每次生成的随机序列也相同
# 区间变换,[0,100]化为[-1,1]
def Convert(data,Min,Max,size):
# data:需要变换的数据或矩阵
# Min:最小值
# Max:最大值
#size:样本个数
data = np.array(data)
Size = size
w = -2/(Min - Max)
b = (Min + Max)/(Min - Max)
for i in range(Size):
data[i] = data[i]*w + b
return data
#生成 x_data,值为 [0, 100]之间500个等差数列数据集合作为样本特征
x_data = np.linspace(0,100,500)
x_data = Convert(x_data,0,100,500)
#根据目标线性方程 y=3.1234*x+2.98,生成相应的标签集合 y_data,噪声最大振幅0.4
y_data = 3.1234 * x_data + 2.98 + np.random.randn(*x_data.shape) *0.4
#画出随机生成数据的散点图
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 = 2)
#定义数据的占位符,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(1.0,name="w0")
#构建线性函数的截距,变量b
b = tf.Variable(0.0,name="b0")
#pred是预测值,前向计算
pred = model(x,w,b)
#设置训练参数10轮,每训练20个样本显示损失值
train_epochs = 10
step = 0
display_step = 20 #显示的步数
loss_list = [] #初始化空列表,用于保存损失值
learning_rate = 0.05 #学习率
#采用均方差作为损失函数
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):
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 += 1 #步长加1
if step % display_step == 0:
print("Train Epoch:{0:d} Step:{1:d} loss:{2:.9f}".format(epoch+1,step,loss))
b0temp = b.eval(session = sess)
w0temp = w.eval(session = sess)
plt.plot(x_data,w0temp*x_data +b0temp) #画预测图
print("w:",sess.run(w))
print("b:",sess.run(b))
#通过训练出的模型预测 x=5.79 时 y 的值
x_test = 5.79
predict = sess.run(pred,feed_dict={x:x_test})
print("预测值:{:.9f}".format(predict))
target = 3.1234 * x_test + 2.98
print("目标值:{:.9f}".format(target))
#生成一个写日志的writer,并将当前的tensorflow计算图写入日志
writer = tf.summary.FileWriter(logdir,tf.get_default_graph())
writer.close()
Image(filename = 'D:\\Photo\\结果图.png', width=320, height=240) #插入图片
参考:中国大学MOOC官方课程《深度学习应用开发-TensorFlow实践》吴明晖、李卓蓉、金苍宏