(本实验来源于莫烦Python教程)
(莫烦Python教程链接:https://morvanzhou.github.io/)
(莫烦B站主页:https://space.bilibili.com/243821484/#/)
(B站实验视频教程链接:https://www.bilibili.com/video/av16001891/?p=9)
代码功能:
对于y = x*Weights+bisaes
使用TensorFlow构建神经网络,使其能够根据给定的训练数据,通过学习得到Weights与biases的数值。
给定的训练数据:
x_data:随机生成的数
y_data:根据y_data=x_data*0.1+0.3计算得来
代码及注释:
import tensorflow as tf
import numpy as np
#创建变量
x_data=np.random.rand(100).astype(np.float32)
#创建变量x_data。
#这里所创建的x_data是一个数组,是由函数“np.random.rand()”所生成的,“np.random.rand()”#可以创建一个数字,其元素是0到1之间的随机数,元素的数量由括号里的参数给出,比#如这里就是产生了一个由100个小于一且大于等于0的小数组成的一维数组。
#astype(np.float32) 用来实现变量类型的转换这里将变量转换成了np.float32型。
#np.float32 numpy float 与python float 有区别(具体的区别未知)
y_data=x_data*0.1+0.3
#与x_data相同,这里的y_data也是一个数组。
#创建神经网络的结构
Weights = tf.Variable(tf.random_uniform([1],-1.0,1.0))
#设置权重初值(在程序运行过程中这一权重应该不停地向预设的0.1靠近),在这里初值设#置为多少并不重要,因为其值会自动向预设值靠拢。
#tf.Variable() 通过tf.Variable构造一个variable添加进图中,具体功能有待详解。
#tf.random_uniform([1],-1.0,1.0) 用来从均匀分布中输出随机值。
#random_uniform(shape,minval=0,maxval=None,dtype=tf.float32,seed=None,name=None)是它
#的数据规格命名的格式,由此可以知道这一行代码所生成的变量是一个单个数值,取值范#围在-1和1之间。
biases = tf.Variable(tf.zeros([1]))
#创建偏置,并对其初值进行设置。与前一行设置权重的规则一样,这里的初值的取值不重要。
#tf.zeros([1]) 创建一个元素全为0的数组,官方的格式是tf.zeros(shape,dtype=tf.float32,name=None)
#这里所产生的是一个一维数组。
#两个元素的一维数组:res2 = tf.zeros([2])
#二维数组:res2 = tf.zeros([2, 4])输出为:[[0. 0. 0. 0.][0. 0. 0. 0.]]
#这里(以及上一行中)定义的数组与平常的数组有些区别,无法被直接以数组的形式打印出来,具体原因未知,应该与tf.Variable()函数有关。
y = Weights*x_data+biases
#y是根据网络学习到的参数(这里是权重与偏置)所计算出的因变量,可以看做是网络对识#别结果做出的一个预估值。
#这一数值会在之后与训练数据中与之对应的数据相比对,比对出来的差值被称为“loss”值。
#loss值越小,说明网络的识别结果越精确。
loss = tf.reduce_mean(tf.square(y-y_data))
#对loss值进行定义,这里定义loss值的方式是将预估值与训练数据中对应数据的差值的平#方的平均值(即方差)当做当前网络的loss值。
#tf.reduce_mean()的作用是求平均值,它可以设定两个参数,第一个参数是一个集合,
#可以是列表、二维数组和多维数组。第二个参数指定在哪个维度上面求平均值。默认对所#有的元素求平均。在这一行代码中,只存在一个参数,即“tf.square(y-y_data)”。
#tf.square()的功能是是对“()”里的每一个元素求平方。
optimizer = tf.train.GradientDescentOptimizer(0.5)
#定义优化算法。这里使用的是随机梯度下降SGD(Stochastic Gradient Descent)。
#定义好优化算法之后,TensorFlow就可以根据定义的整个计算图(先前的代码已经自动构#成了计算图)自动求导,并根据反向传播算法进行训练,在每一轮迭代时更新参数来减少#loss。
#tf.train.GradientDescentOptimizer(0.5)就是实现上述功能的函数,其中,0.5是人为设置的学#习速率。
train = optimizer.minimize(loss)
#用上一行代码创建的优化器(即optimizer)来减少loss值。
#optimizer.minimize(loss) 将loss这个变量放到上一行代码中的优化器里。
#实际上,这一行与上一行代码可以拼到一起。也就是说,只用一行代码也可以实现同样的#功能。
#e.g: train = tf.train.GradientDescentOptimizer(0.5).minimize(loss)
#似乎可以通俗地认为,这里将“训练这个神经网络”这一过程,命名为了“train”
#到目前为止, 我们只是建立了神经网络的结构, 还没有使用这个结构.
#在使用这个结构之前, 我们必须先初始化所有之前定义的Variable变量
#下一行代码实现了这个任务。
init = tf.global_variables_initializer()
#对之前所定义的Variable变量进行初始化。
#似乎也可以认为,这里将之前创建的Variable变量命名为了init
#创建神经网络结构的代码结束
sess = tf.Session()
#这里创建了一个tf.Session(),并将其命名为“sess”。在下一行代码中,“sess”将被用于对#之前所创建的神经网络结构的初始化。
#tf.Session() 运行Tensorflow操作的类,封装了被执行操作和Tensor计算的环境。
sess.run(init)
#初始化“init”。通俗地说,run(init)的意思就是“令init可以运行”。
for step in range(201):
sess.run(train) #初始化“train”。
if step % 20 == 0:
print(step,sess.run(Weights),sess.run(biases))
#每训练20次,打印一遍当前训练次数、权重值、偏置值。
#每一个Variable变量的使用,都必须套上sess.run()。