TensorFlow入门——神经网络结构、前向传播算法
一、神经网络的实现
1、TensorFlow Playground
数据点
- 二维平面的数据集中,每一个小点代表一个样例,点的颜色代表了样例的标签,点的颜色有两种,因此构成一个二分类的问题。
- 黄色的点表示合格的零件,蓝色的点表示不合格的零件。判断一个零件是否合格的问题就转变成区分点的颜色的问题。
- 零件的特征提取:用零件的长度和质量来描述一个零件,,将一个物理意义上的零件转化成长度和质量两个数字。
- 在机器学习中,所有用于描述实体的数字的组合就是一个实体的特征向量(feature vector)。通过特征提取,可以将实际问题中的实体转化为空间中的点。
- 举例:FEATURES对应特征向量,x1代表零件的长度,x2代表零件的质量。
输入输出
- 特征向量是神经网络的输入
- 第一层是输入层,代表特征向量中每一个特征的取值,如x1 = 0.5表示一个零件的长度为0.5。
- 在二分类问题中,如判断零件是否合格,神经网络的输出层往往只包含一个节点,这个节点输出一个实数值,通过这个输出值和一个事先设定的阈值,可以得到最后的分类结果。
- 举例:判断零件是否合格时,当输出的数值大于0时,给出的判断结果是零件合格,反之零件不合格,一般认为当输出值离阈值越远时得到的答案越可靠。
隐藏层
- 输入和输出层之间的神经网络叫做隐藏层,一个神经网络的隐藏层越多,这个神经网络越深,深度学习中的深度和神经网络的深度密切相关。
- 支持修改的参数:
- 隐藏层的数量 hidden layer
- 学习率 learning rate
- 激活函数 activation
- 正则化 regularization
训练结果
- 一个小格子代表神经网络中的一个节点!
- 边代表节点之间的连接,每一条边代表盛景网络中的一个参数,可以是任意实数。
- 神经网络通过对参数的合理设置来解决分类或者回归问题。边上的颜色体现了这个参数的取值,边的颜色越深,这个参数取值的绝对值越大;边的颜色接近白色时,参数的取值接近于0.
- 每一个节点上的颜色代表了这个节点的区分平面。如果把这个平面当成一个笛卡尔坐标系,这个平面上的每一个点就代表了(x1,x2)的一种取值。点的颜色就体现了x1,x2在这种取值下这个节点的输出值。节点的输出值的绝对值越大时,颜色越深。
- 举例:**输入层x1代表的节点的区分平面就是y轴。(理解?)**因为这个节点的输出就是x1本身的值,所以当x1小于零时,这个节点的输出就是负数,而x1大于0时,输出的就是正数。于是y轴的左侧都为黄色,右侧都为蓝色
总结:使用神经网络解决分类问题的步骤
- 提取问题中实体的特征向量作为神经网络的输入。不同的实体可以提取不同的特征向量。
- 定义神经网络的结构,并定义如何从神经网络的输入得到输出。这个过程就是神经网络的钱箱传播算法。
- 通过训练数据来调整神经网络中参数的取值,这就是训练神经网络的过程。
- 使用训练好的神经网络来预测未知的数据。
二、前向传播算法——全连接网络
1、神经元结构
- 神经元是构成一个神经网络的最小单元
- 一个神经元有多个输入和一个输出。每个神经元的输入既可以是其他神经元的输出,也可以是整个神经网络的输入。神经网络的结构就是指不同神经元之间的连接结构。
- 一个最简单的神经元结构的输出就是所有输入的加权和,不同输入的权重就是神经元的参数。
- 神经网络的优化过程就是优化神经元中参数取值的过程。
- 举例:一个简单的判断零件是否合格的三层全连接网络。全连接神经网络是指相邻两层之间任意两个节点之间都有连接。
- 全连接神经网络结构与卷积层,LSTM结构相区别。
2、前向传播过程
- 前向传播过程解析[BOOK]
- 计算神经网络的前向传播需要三部分信息:
- 神经网络的输入
- 神经网络的连接结构
- 每个神经元的参数
- 用矩阵乘法表示前向传播算法中的加权和
- 举例:x、W(1)、a(1)、W(2)、y
- a(1) = x*W(1)
- y = a(1)*W(2)
- Tensorflow实现:
a = tf.matmul(x,w1)
y = tf.matmul(a,w2)
- 总结:tf.matmul可以实现矩阵乘法的功能
- 其他支持的神经网络:
- 更加复杂的神经元结构:偏置(bias)、激活函数(activation function)
- 更加复杂的神经网络:卷积神经网络、LSTM结构
3、神经网络参数与TensorFlow变量
- 变量(tf.Variable)的作用是保存和更新神经网络中的参数
- 使用随机数给TensorFlow中的变量初始化:
weights = tf.Variable(tf.random_normal([2,3],stddev=2))
# tf.random_normal[2,3],stddev=2)产生一个2×3矩阵,元素是均值为0,标准差为2的随机数
# tf.random_normal函数可以通过参数mean来指定平均值,在没有指定时默认为0
- 总结:通过满足正态分布的随机数来初始化神经网络中的参数是一个非常常用的方法
- 其他随机数生成器:(补充…)
函数名称 | 随机数分布 | 主要参数 |
---|
tf.random_normal | 正态分布 | 平均值、标准差、取值类型 |
| | |
函数名称 | 功能 | 样例 |
---|
tf.zeros | 产生全0的数组 | tf.zeros([2,3],int32)->[[0,0,0],[0,0,0]] |
tf.ones | | |
tf.fill | | |
tf.constant | | |
biases = tf.Variable(tf.zeros([3]))
# 生成一个初始值全部为0且长度为3的变量
w2 = tf.Variable(weights.initialized_value())
w3 = tf.Variable(weights.initialized_value()*2.0)
# w2的初始值设置成与weights变量相同,w3的初始值设置成wieghts初始值的两倍
import tensorflow as tf
# 声明w1、w2两个变量。通过seed参数设定随机种子
# 这样可以保证每次运行得到的结果是一样的。
【Conitnue…】