1 创建神经网络块
卷积神经网络设计目的是以最小的数据处理代价直接从图像中识别出视觉模式。
前馈网络
每个神经元接收来自其他神经元的输入。每个输入项对神经元的影响由权重控制,权重可以是正的也可以是负的。整个神经网络通过理解这种范式进而执行有效的计算来识别对象。将这些神经元连接成一个网络,称之为前馈网络。
2 Tensorflow
计算图,并行完成所有计算,效率高
如:
TensorFlow的数据存储是用一个称之为张量的数据结构。一种由原始值组成的任意维的数组。张量的维数称为阶。如:‘hello_constant’是一个0阶的常量字符串张量。
计算图是由两部分组成的有向图
- 创建计算图
- 运行计算图
计算图在会话中执行。会话是计算图的运行时环境,负责分配CPU、GPU并管理TensorFlow运行时状态。
constant_x = tf.constant(5,name='constant_x')
variable_y = tf.Variable(x+5,name='variable_y')
上述代码与没有像Python 执行的结果直接赋值给变量variable_y ,而是写成了一个方程。意味着当计算变量
时,取
在那个时间点的值,然后加上5。variable_y 值的计算在前面代码中从未实际执行过。运行上述代码,获得一个变量存储地址。
上述代码属于TensorFlow程序的计算图创建部分。变量variable_y 没有实际值10。
为了解决这个问题,必须执行计算图的代码部分
# initialize all variables
init = tf.global_variables_initializer()
# All variables are now initialized
with tf.Session() as sess:
sess.run(init)
- tf.placeholder和feed_dict类型
tf.placeholder 是后续会在tf.session.run()函数中赋予值的变量。使用feed_dict参数值设置placeholder张量,通过这些占位符将数据输入到计算图中。
- softmax
softmax函数将其输入(logit或者logit score)转换为0到1之间的值,并对输出进行归一化,使其总和为1。logit是指一个事件发生与不发生的概率比值的对数。softmax函数的定义为:
- 标签
表示标签通常称为one-hot编码。每个标签都由一个向量表示,向量中1表示正确对应的标签,0表示其他。当问题有数百万个标签时,one-hot编码是无效的,因为向量中 大多数元素是0。用交叉熵测量两个概率向量之间的相似距离。交叉熵是非对称的。
- 损失函数(成本函数、目标函数)
定义一个模型的好坏。用于确定模型损失的一个常见的函数叫作交叉熵损失。
在TensorFlow中,使用tf.reduce_sum()编写一个交叉熵函数。输入一个数字数组,并将其和作为一个张量返回:
3 深度神经网络
第一层是输入层,最后一层是输出层,中间层是隐含层。如果隐含层不止一个,则这样的网络就是深度神经网络。
隐含层中每个神经元的输入和输出都与下一层中每个神经元相连。每一层的神经元个数都是任意的。
隐含层和输出层需要选择激活函数。常用的激活函数为:sigmoid函数、双曲正切函数和ReLU函数。
sigmoid函数,优势在于点的导数就是简单的
乘以
有助于一种方便的方式计算神经网络中的梯度。
ReLU函数:一个非线性函数,计算函数是,即输入是负值,ReLu函数值为0,如果输入
,ReLu函数值为
。
TensorFlow中,tf.nn.relu实现ReLU函数
监督学习:对每个输入样本,检查输出,计算误差率,然后调整权重,直到当输入标签为正确的图像时,网络输出1,而其他输出0。这种类型的训练方法称为监督学习。
调整权重的方法称为反向传播。反向传播是误差反向传播的简称,与优化方法(如梯度下降)结合使用。反向传播在计算梯度中的损失函数时,会考虑网络中的所有权重,用梯度法更新权重,以优化损失函数。
4 Keras 深度学习库
模型是Keras核心数据结构。序列模型由一个线性的层堆栈组成,通用函数fit()、evaluate()和compile()
包含全连接层、最大池化层和激活函数层。使用add()函数添加一个层。
第一层设置输入维度后,第二层以第一层的输出作为输入,持续传递到下一层,直到最后一层,Keras将自动推断出所有层的形状。
5 反向传播
反向传播是一种使用链式法则计算梯度的方法。给定一个函数,其中
是一个输入向量,计算
在
点的梯度用
表示。函数
基本上是一个损失函数
,输入
是权重和训练数据的组合。
通常计算参数的梯度更新参数
反向传播包括
- 做一个前馈运算
- 将模型输出与期望输出进行比较
- 计算误差
- 向后运行前馈运算(反向传播),将误差分散到每个权重
- 更新权重,得到一个更好的模型
- 持续上述步骤,直到得到一个满意的模型
挑战性问题:
- 简单添加任意数量的隐含层,反向传播不能在数据集上使模型优化
- 草率初始化权重,非线性函数会饱和停止学习,损失函数会趋于平缓,不会继续下降,导致梯度消失问题
前向/后向传递的链式法则
链式法则用于计算两个或多个函数的复合函数的导数