用TensorFlow实现线性回归(包括过程中出现的问题及解决方法)

实验目的:

通过本次实验让学生了解TensorFlow构建整个神经网络训练模型的基本思想,掌握TensorFlow实现线性回归的流程和方法,并学会使用tensorboard graph来以图形化的方式查看和检查自己所设计的神经网络模型。
实验仪器设备及材料:
安装有Python运行环境的电脑。

实验内容

一.TensorFlow环境安装

1.在anaconda prompt窗口进行安装(anaconda3)最好新建一个虚拟环境,之后在环境中操作安装(默认环境是base)

conda create -n tf2 python=3.6.5   

这是新建了一个名为tf2,并且python版本是3.6.5的一个环境(python版本号要跟你自己的版本号匹配)。
切换到某个环境:conda activate 环境名。
2.进入刚刚创建的tf2环境:

conda activate tf2

3.安装TensorFlow2.4.0

pip install tensorflow-cpu==2.4.0

或者镜像安装 pip install tensorflow-cpu==2.4.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
这里可能有点久,要保证不能断网。它会另外安装其他的包,这些包在机器学习中也会经常用到。如果出现红字,再安装一次。直到出现successfull installed …,表明已经成功安装好了tensorflow包。下图是2.5.0版本安装成功示意图:
在这里插入图片描述

4.之后若使用pycharm工具软件,不需要再安装TensorFlow,配置环境即可
在这里插入图片描述

二.利用TensorFlow进行线性回归实验

给定一批由 y = 3x + 2 生成的数据集(x, y),建立线性回归模型 h(x) = wx + b,预测出 w = 3 和 b = 2。

实验要求:

1 生成拟合的数据集

数据集只含有一个特征向量,注意误差项需要满足高斯分布。使用了numpy和matplotlib库。numpy是Python的一个开源数值科学计算库,可用来存储和处理大型矩阵。matplotlib 是 Python 的绘图库,它可与 numpy 一起使用,提供了一种有效的 MatLab 开源替代方案
其代码如下:

#首先导入3个库:
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
#随机产生数据点100个,随机概率符合高斯分布(正态分布)
num_points = 100
vectors_set = []
for i in range(num_points):
 x1 = np.random.normal(0.,0.55)
 y1 = x1 * 0.1 + 0.3 + np.random.normal(0.0,0.03)
 vectors_set.append([x1,y1])
#定义特征向量x
x_data = [v[0] for v in vectors_set]
#定义标签向量y
y_data = [v[1] for v in vectors_set]
#按[x_data,y_data]在X-Y坐标系中以打点方式显示,调用plt建立坐标系并将值打印输出
plt.scatter(x_data,y_data,c='b')
plt.show()

产生的数据分布如下所示:
在这里插入图片描述

2 构建线性回归的Graph

#利用TensorFlow随机产生w和b,为了图形显示需要,分别定义名称myw和myb
w = tf.Variable(tf.random_uniform([1],-1.,1.),name='myw')
b = tf.Variable(tf.zeros([1]),name='myb')
#根据随机产生的w和b,结合上面随机产生的特征向量x_data,经过计算得出预估值
y = w * x_data + b
#以预估值y和实际值y_data之间的均方差作为损失
loss = tf.reduce_mean(tf.square(y-y_data,name='mysquare'), name='myloss')
#采用梯度下降法来优化参数
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss,name='mytrain')

3 在Session中运行构建好的Graph

#global_variables_initializer初始化Variable等变量
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
print("w=", sess.run(w),"b=",sess.run(b),sess.run(loss))
#迭代20次train
for step in range(20):
 sess.run(train)
 print("w=", sess.run(w),"b=",sess.run(b),sess.run(loss))
#写入磁盘,提供tensorboard在浏览器中展示用
writer = tf.summary.FileWriter("./mytmp",sess.graph)

打印下w和b,损失值的变化情况,可以看到损失值从0.24降到0.0008.
在这里插入图片描述

4 绘制拟合曲线

plt.scatter(x_data,y_data,c='b')
plt.plot(x_data,sess.run(w)*x_data+sess.run(b))
plt.show()

如图:
在这里插入图片描述

5 tensorboard展示神经网络的graph

在上面的程序设计中有代码:writer = tf.summary.FileWriter("./mytmp",sess.graph)
运行改代码后就可以将整个神经网络节点信息写入到./mytmp 目录下(该目录与前面建立的程序在一个目录)。在cmd中通过“cd 目录”切换到该目录下,输入“dir”命令显示该目录下刚才运行的日志文件,最后输入tensorboard --logdir=D:PyCharm2018.3.7workpaseeg001mytmp,回车运行后出现显示信息,信息最后一行中出现“TensorBoard 2.0.2 at http://localhost:6006/ (Press CTRL+C to quit)”,打开chrome浏览器,在浏览器地址栏中输入 http://localhost:6006,就会展示刚才程序设计的神经网络的图形显示。如下图所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验记录以及实验过程中遇到的问题以及解决方案:

1.程序运行报错

在这里插入图片描述
tensorflow显示没有random_uniform模块
解决办法:tf2.0里改名字了,用tf.random.uniform代替

2.程序运行报错

在这里插入图片描述
TensorFlow2.0版本运行程序报错
解决办法:

import tensorflow as tf

改为

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

tf.disable_v2_behavior():此函数可以在程序开始时调用(在创建张量、图形或其他结构之前,以及在初始化设备之前)。它将TensorFlow 1.x和2.x之间所有不同的全局行为切换为预定的1.x行为,就是屏蔽2.x版本。

3.格式报错

在这里插入图片描述
先查看tensorboard安装位置,笔者使用的是Anaconda3,可以在Anaconda3下的搜索tensorflow,寻找其下Scripts文件下查找有没有tensorboard.exe文件,如果存在的话那就是没有配置tensorboard环境变量。

在这里插入图片描述这个好了之后又出现问题,
在这里插入图片描述
路径中不能有空格,删掉就好了
在这里插入图片描述

4.页面报错

进入http://localhost:6006会报错

在这里插入图片描述
把主机的用户名修改为 localhost (Win10系统主机用户名修改(修改后需要重启电脑),还是报错,(这种方法不仅没有用,还会导致后续连不上网,不建议读者使用,因为笔者使用过,此处仅作记录供借鉴)
在这里插入图片描述
在pycharm中再次尝试:(关掉cmd命令行!!!据观察,如果你想要开启另外一个新的计算图,一定要把原来的cmd命令行窗口关闭,再重复上述步骤,不然打开的将依然是上一个计算图。)
在pycharm的菜单栏,选择View–Tool Windows–Terminal
然后执行:

 tensorboard --logdir=mytmp

在这里插入图片描述
进入页面之后,执行成功!!!
在这里插入图片描述

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>