1个TensorFlow样例,终于明白如何实现前向传播过程?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1个TensorFlow样例,终于明白如何实现前向传播过程?相关的知识,希望对你有一定的参考价值。

神经网络的结构,就是不同神经元间的连接结构

技术分享

–图示了一个三层全连接神经网络。

神经元结构的输出,是所有输入的加权、加上偏置项,再经过一个激活(传递)函数得到。



全连接神经网络


全连接神经网络,就是相邻两层之间,任意两个节点之间都有连接。

–这也是其与后面介绍的卷积层、LSTM结构的区分。

–除了输入层,所有节点都代表了一个神经元的结构。

计算神经网络的前向传播结果,要三部分信息。

–第一个部分是神经网络的输入,这个输入就是从实体中提取的特征向量。

–第二个部分为神经网络的连接结构。神经网络是由神经元构成的,神经网络的结构,给出不同神经元之间输入、输出的连接关系。

–第三部分是每个神经元中的参数。



示例分析


图中,a11节点有两个输入,分别是x1和x2的输出,而a11的输出是节点Y的输入。

技术分享

–用w来表示神经元中的权重,b表示偏置项。

–w的上标表明了神经网络的层数,如w(1)表示第一层节点的参数,而w(2)表示第二层节点的参数。

–w的下标表明了连接节点编号,比如w 1,2 (1)表示连接x1和a12节点的边上的权重。



给定神经网络的输入、神经网络的结构,以及边上权重,就可以通过前向传播算法,来计算出神经网络的输出

下面公式给出了在ReLU激活函数下,前图神经网络前向传播的过程。此处假设x1=0.7, x2=0.9

–a11=f(W1,1(1)x1+W2,1(1)x2+b1(1))

–=f(0.7×0.2+0.9×0.3+(-0.5)) =f(-0.09)=0

–a12=f(W1,2(1)x1+W2,2(1)x2+b2(1))

–=f(0.7×0.1+0.9×(-0.5)+0.1)=f(-0.28)=0

–a13=f(W1,3(1)x1+W2,3(1)x2+b3(1))

–=f(0.7×0.4+0.9×0.2+(-0.1))=f(0.36)=0.36

–Y=f(W1,1(2)a11+W1,2(2)a12+W1,3(2)a13+b1(2))

–=f(0.054+0.028+(-0.072)+0.1)=f(0.11)=0.11

在虚拟机中运行相应的chap3中的前向神经网络例子,查看相关的图计算。



在TensorFlow中,可以通过矩阵乘法的方法,实现神经网络的前向传播过程。

–a = tf.nn.relu(tf.matmul(x, w1)+b1)

–y = tf.nn.relu(tf.matmul(a, w2)+b2)

在上面的代码中并没有定义w1、w2、b1、b2,

–TensorFlow可以通过变量(tf.Variable),来保存和更新神经网络中的参数。

比如通过下面语句可以定义w1:

–weights = tf.Variable(tf.random_normal([2, 3], stddev=2))

–这段代码调用了TensorFlow变量的声明函数tf.Variable。在变量声明函数中,给出了初始化这个变量的方法。



TensorFlow中变量的初始值,可以设置成随机数、常数或者是通过其他变量的初始值,计算得到

样例中,tf.random_normal([2, 3], stddev=2)会产生一个2×3的矩阵,矩阵中的元素是均值为0,标准差为2的随机数。

–注:标准差,也称为标准偏差

技术分享

tf.random_normal函数,可以通过参数mean,来指定平均值,在没有指定时默认为0。

–通过满足正态分布的随机数,来初始化神经网络中的参数,是一个常用的方法。



下面的样例,介绍了如何通过变量,实现神经网络的参数,并实现前向传播的过程。

import tensorflowas tf

# 声明变量。

w1 = tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))

b1 = tf.Variable(tf.constant(0.0, shape=[3]))

w2 = tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))

b2 = tf.Variable(tf.constant(0.0, shape=[1]))

# 暂时将输入的特征向量定义为一个常量。这里x是一个1*2的矩阵。

x = tf.constant([[0.7, 0.9]])



# 实现神经网络的前向传播过程,并计算神经网络的输出。

a = tf.nn.relu(tf.matmul(x, w1)+b1)

y = tf.nn.relu(tf.matmul(a, w2)+b2)

sess= tf.Session()

# 运行变量初始化过程。

init_op= tf.global_variables_initializer()

sess.run(init_op)

# 输出[[3.95757794]]

print(sess.run(y))

sess.close()


以上是关于1个TensorFlow样例,终于明白如何实现前向传播过程?的主要内容,如果未能解决你的问题,请参考以下文章

利用tensorflow实现前向传播

TensorFlow2 手把手教你实现前向传播

实现属于自己的TensorFlow:计算图与前向传播

TensorFlow官方样例

如何自己实现简单的Google深度学习框架TensorFlow?

Tensorflow学习:搭建神经网络