《人工智能实践:Tensorflow笔记》听课笔记12_3.2前向传播

附:课程链接

第三讲.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))

验证结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值