什么是卷积?
对图像(不同的数据窗口数据)和滤波矩阵(一组固定的权重:因为每个神经元的多个权重固定,所以又可以看做一个恒定的滤波器filter)做内积(逐个元素相乘再求和)的操作就是所谓的『卷积』操作,也是卷积神经网络的名字来源。
作用:一个卷积核的滤波可以用来提取特定的特征。
池化层作用
卷积网络也经常使用池化层来缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性。
池化层分为:MAX Pooling,Average pooling。
什么是梯度爆炸,梯度消失?
网络层之间的梯度(值大于 1.0)重复相乘导致的指数级增长会产生梯度爆炸。
网络层之间的梯度(值小于 1.0)重复相乘导致的指数级增长会产生梯度消失。
梯度爆炸会引发什么样的问题?
最好的结果是无法从训练数据中学习,最坏的结果是出现无法再更新的NaN权重值。
如何修复梯度爆炸问题?
1. 重新设计网络模型
2. 使用 ReLU 激活函数
3. 使用长短期记忆网络
4. 使用梯度截断(Gradient Clipping)(
你可以在训练过程中检查和限制梯度的大小。这就是梯度截断。
)
5. 使用权重正则化(Weight Regularization)
通常使用的是 L1 惩罚项(权重绝对值)或 L2 惩罚项(权重平方)。
CNN 常用的几个模型
LenNet-5
共有7层(不包括输入层),每层都包含不同数量的训练参数,如下图所示。
LeNet-5中主要有2个卷积层、2个下抽样层(池化层)、3个全连接层3种连接方式
AlexNet
关于AlexNet有如下要点:
1、在ImageNet数据上对网络进行了培训,该数据包含来自22,000多个类别的超过1500万个带注释的图像。
2、使用ReLU进行非线性函数(发现减少训练时间,因为ReLU比传统的tanh函数快几倍)。
3、使用的数据增强技术包括图像转换,水平反射和补丁提取。
4、实施了dropout层,以解决过度拟合训练数据的问题。
5、使用mini-batch SGD训练模型,具有动量和重量衰减的特定值。
8、学习速率初始值为0.01,在训练结束前共减小3次,每次减小都出现在错误率停止减少的时候,每次减小都是把学习速率除以10 。
9、局部响应归一化。
VGGNet
19层
1、仅使用3x3尺寸的filter与AlexNet的第一层11x11 filter 和ZF Net的7x7 filter 完全不同。作者的推理是两个3x3 conv层的组合具有5x5的有效感受野。这又可以模拟更大的 filter,同时保持较小filter尺寸的优势。其中一个好处是减少了参数的数量。此外,使用两个转换层,我们可以使用两个ReLU层而不是一个。
2、3个背对背的conv层具有7x7的有效感受区域。
3、随着每层输入卷的空间大小减小(转换层和池层的结果),当您沿着网络向下时,由于filter数量的增加,卷的深度会增加。
4、有趣的是注意到每个maxpool层之后过滤器的数量翻倍。这加强了缩小空间尺寸的想法,但增加了深度。
5、在图像分类和本地化任务方面都做得很好。作者使用一种本地化形式作为回归。
6、使用Caffe工具箱构建模型。
7、在训练期间使用scale jittering比例抖动作为一种数据增强技术。
8、在每个转换层之后使用ReLU层并使用批量梯度下降进行训练。
GoogLeNet
1、在整个架构中使用了9个Inception模块,总共超过100层!现在这很深......
2、没有使用完全连接的层!他们使用平均水池,从7x7x1024 volume到1x1x1024 volume。这节省了大量参数。
3、使用的参数比AlexNet少12倍。
4、在测试过程中,创建了相同图像的多个作物,并将其输入网络,并对softmax概率进行平均,以便为我们提供最终解决方案。
1x1卷积的作用
作用1:在相同尺寸的感受野中叠加更多的卷积,能提取到更丰富的特征。
作用2:使用1x1卷积进行降维,降低了计算复杂度。
微软ResNet残差神经网络
CNN面临的一个问题就是,随着层数的增加,CNN的效果会遇到瓶颈,甚至会不增反降。这往往是梯度爆炸或者梯度消失引起的。
ResNet就是为了解决这个问题而提出的,因而帮助我们训练更深的网络。 它引入了一个 residual block(残差块):
如图 2 所示,xx 表示输入,F(x)F(x) 表示残差块在第二层激活函数之前的输出,即 F(x)=W2σ(W1x,其中 W1 和 W2表示第一层和第二层的权重,σσ 表示 ReLU 激活函数。(这里省略了 bias。)最后残差块的输出是 σ(F(x)+x)。
R-CNN的目的是解决物体检测问题。
请简要介绍下tensorflow的计算图
计算图也叫数据流图,可以把计算图看做是一种有向图,Tensorflow中的每一个节点都是计算图上的一个Tensor, 也就是张量,而节点之间的边描述了计算之间的依赖关系(定义时)和数学操作(运算时)。如下两图表示: a=x*y; b=a+z; c=tf.reduce_sum(b);