基于Python3的TensorFlow实验(一)

(本实验来源于莫烦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构建神经网络,使其能够根据给定的训练数据,通过学习得到Weightsbiases的数值。

    给定的训练数据:

             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()#可以创建一个数字,其元素是01之间的随机数,元素的数量由括号里的参数给出,比#如这里就是产生了一个由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)是它

#的数据规格命名的格式,由此可以知道这一行代码所生成的变量是一个单个数值,取值范#围在-11之间。

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)         

#定义优化算法。这里使用的是随机梯度下降SGDStochastic 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()

你可能感兴趣的:(TensorFlow)