附:课程链接
第三讲.Tensorflow框架
3.2前向传播
由于个人使用Win7系统,并未完全按照课程所讲,以下记录的也基本是我的结合课程做的Windows系统+PyCharm操作。且本人有python基础,故一些操作可能简略。并未完全按照网课。
记住编写代码时,除注释内容外,字符均使用英文格式。
本节课程目标:搭建第一个神经网络,总结搭建八股。
6.神经网络的参数:是指神经元线上的权重w,用变量表示,一般会先随机生成一些参数。常让w = tf.Variable()生成随机数(其中注意Variable首字母大写),生成的方式写在()中,比如:
tf.random_normal表示生成服从正态分布的随机数,形状是2行3列,标准差是2,均值是0,随机种子是1(随机种子若去掉,每次生成的随机数将不一致)。
其中①标准差、均值、随机种子若没有要求是可以不写的。②tf.random_normal的函数可以用tf.truncated_normal()函数替换,表示去掉过大偏离点的正态分布函数,也就是如果随机出来数据偏离平均值超过两个标准差,这个数据将重新生成。③同理,tf.random_normal()函数也可用tf.random_uniform()平均分布函数替换。
除了生成随机数,还可生成常量,如:
7.神经网络的搭建
前面我们已经了解了张量、计算图、会话和参数,现在就可以讨论神经网络的实现过程了。
神经网络实现过程:
训练过程是第一步、第二步、第三步的循环迭代,使用过程是第四步,一旦参数优化完成就可以固定这些参数,实现特定应用了。
很多实际应用中,我们会先使用现有的成熟网络结构,喂入新的数据,训练相应模型,判断是否能对喂入的从未见过的新数据做出正确响应,再适当更改网络结构,反复迭代,让机器自动训练参数找出最优结构和参数,以固定专用模型。
8.前向传播:搭建模型,实现推理。
前向传播就是搭建模型的计算过程,让模型具有推理能力,可以针对一组输入给出相应的输出。
前向传播过程举例:生产一批零件,将体积x1和重量x2为特征输入NN,通过NN后输出一个数值。
假设输入的特征值是:体积0.7,重量0.5
在节点a11 = x1w11 + x2w21 = 0.14 + 0.15 = 0.29
同理得a12 = x1w12 + x2w22 = 0.07 + 0.25 = 0.32
同理得a13 = x1w13 + x2w23 = 0.28 + 0.10 = 0.38
则输出y = a11w11 + a12w21 + a13*w31 = 0.029 + 0.032 + (-0.076) = -0.015
把前向传播过程用tensorflow描述出来:
第一层:
用x表示输入,是一个1行2列矩阵,表示一次输入一组特征,这组特征包含了体积和重量两个元素。其中:
对于第一层的w,前面有2个节点,后面有3个节点。w应该是个2行3列矩阵,这样表示:
我们一般说神经网络共有几层(或当前是第几层)都是指的计算层,输入不是计算层。所以a是第一个计算层网络,a(1)是一个1行3列的矩阵:
第二层:
参数要满足前面3个节点,后面1个节点,所以w(2)是3行1列的矩阵:
在tensorflow中我们用矩阵乘法表述以上计算过程:
a = tf.matmul(X,W1)
y = tf.matmul(a,W2)
又由于需要计算结果,故要用到会话即用with结构实现:
with tf.Session() as sess:
print(sess.run(y))
变量初始化、计算图节点运算过程,都要用到会话(with结构)实现。
①变量初始化:在sess.run()函数中用tf.global_variables_initializer()实现对所有变量的初始化,即赋初值:
init_op = tf.global_variables_initializer()
sess.run(init_op)
②计算图节点运算:在sess.run函数中写入带运算的节点即可,例如要计算输出结果y:
sess.run(y)
在实际应用中,可一次喂入一组或多组数据,让神经网络计算出输出y,可用tf.placeholder帮输入占位,在sess.run函数中用feed_dict喂数据,举例:
#一次喂一组数据
x = tf.placeholder(tf.float32,shape = (1,2))
#若一次只喂一组数据,shape的第一维写1
#第二维位置看有几个输入特征,比如零件的特征有体积和重量,共两个,写2
sess.run(y,feed_dict = {x:[[0.5,0.6]]})
#这样就可以用feed_dict把x喂入神经网络,求得y值
#一次喂多组数据
x = tf.placeholder(tf.float32,shape = (None,2))
#若一次只喂多组数据,shape的第一维写None,表示先空着
#第二维位置看有几个输入特征,比如零件的特征有体积和重量,共两个,写2
sess.run(y,feed_dict = {x:[[0.1,0.2],[0.2,0.3],[0.3,0.4],[0.4,0.5]]})
#这样就可以用feed_dict中可以写入若干组[体积,重量]把x喂入神经网络,求得y值
综合代码验证1(tensorflow的前向网络传播过程):
#两层简单神经网络(全连接)
import tensorflow as tf #导入tensorflow模块,简写为tf
#定义输入和参数
x = tf.constant([[0.7,0.5]]) #定义输入变量,用1行2列的张量表示一组[体积,重量]
w1 = tf.Variable(tf.random_normal([2,3],stddev=1,seed=1)) #w1是2行3列的正态分布随机数组成的矩阵,标准差为1,随机种子为1
w2 = tf.Variable(tf.random_normal([3,1],stddev=1,seed=1)) #w2是3行1列的正态分布随机数组成的矩阵,标准差为1,随机种子为1
#定义前向传播过程
a = tf.matmul(x,w1) #a等于x与w1的矩阵乘法
y = tf.matmul(a,w2) #y等于a与w2的矩阵乘法
#以上,神经网络的架构已架构好,但是不运算,想运算就要用到with结构了:
#用会话计算结果
with tf.Session() as sess:
init_op = tf.global_variables_initializer() #把初始化所有变量的函数简写为初始化节点init_op
sess.run(init_op)
print("y的计算结果是:",sess.run(y))
运算结果为:
综合代码验证2(tensorflow的前向网络传播过程)(利用placeholder()):
#两层简单神经网络(全连接)
import tensorflow as tf #导入tensorflow模块,简写为tf
#定义输入和参数
#用placeholder实现输入定义(sess.run()中喂一组数据)
x = tf.placeholder(tf.float32,shape = (1,2)) #这种方法可以在with结构中选择喂入多组输入特征,方便批量处理
w1 = tf.Variable(tf.random_normal([2,3],stddev=1,seed=1)) #w1是2行3列的正态分布随机数组成的矩阵,标准差为1,随机种子为1
w2 = tf.Variable(tf.random_normal([3,1],stddev=1,seed=1)) #w2是3行1列的正态分布随机数组成的矩阵,标准差为1,随机种子为1
#定义前向传播过程
a = tf.matmul(x,w1) #a等于x与w1的矩阵乘法
y = tf.matmul(a,w2) #y等于a与w2的矩阵乘法
#以上,神经网络的架构已架构好,但是不运算,想运算就要用到with结构了:
#用会话计算结果
with tf.Session() as sess:
init_op = tf.global_variables_initializer() #把初始化所有变量的函数简写为初始化节点init_op
sess.run(init_op)
print("y的计算结果是:",sess.run(y,feed_dict = {x:[[0.7,0.5]]})) #喂入x的一组特征
综合代码验证3(tensorflow的前向网络传播过程)(一次向神经网络喂入n组特征):
#两层简单神经网络(全连接)
import tensorflow as tf #导入tensorflow模块,简写为tf
#定义输入和参数
#用placeholder实现输入定义(sess.run()中喂多组数据)
x = tf.placeholder(tf.float32,shape = (None,2)) #由于不知道喂入多少组,故shape的第一个参数写作None,表示不知道
w1 = tf.Variable(tf.random_normal([2,3],stddev=1,seed=1)) #w1是2行3列的正态分布随机数组成的矩阵,标准差为1,随机种子为1
w2 = tf.Variable(tf.random_normal([3,1],stddev=1,seed=1)) #w2是3行1列的正态分布随机数组成的矩阵,标准差为1,随机种子为1
#定义前向传播过程
a = tf.matmul(x,w1) #a等于x与w1的矩阵乘法
y = tf.matmul(a,w2) #y等于a与w2的矩阵乘法
#以上,神经网络的架构已架构好,但是不运算,想运算就要用到with结构了:
#用会话计算结果
with tf.Session() as sess:
init_op = tf.global_variables_initializer() #把初始化所有变量的函数简写为初始化节点init_op
sess.run(init_op)
print("y的计算结果是:",sess.run(y,feed_dict = {x:[[0.7,0.5],[0.2,0.3],[0.3,0.4],[0.4,0.5]]})) #喂入x的多组特征
print("w1:",sess.run(w1))
print("w2:",sess.run(w2))