Keywords:
常用网络:LeNet5 、AlexNet VGGNet、 GoogleNet、 ResNet、DenseNet
filter size
stripe
padding
参数共享机制
fine tuning
输入层、卷积层、激励层、池化层、全连接层、Softmax 输出层
一般CNN结构依次为:
一个CNN 层级结构示意图:
卷积层:一组固定的权重和不同窗口内数据做内积,就是卷积。
激励层:
激励函数:
Sigmoid : f(x)=11+e(−x) 函数很容易饱和, |x|≥10 梯度近似于0
Tanh : f(x)=ex−e−xex+e−x 相比Sigmoid 优点是对称中心在原点,缺陷是跟Sigmoid 相似,容易饱和。
ReLU: f(x)=max{0,x} 收敛快(相比Sigmoid 大致提高6倍),求梯度简单,但比较脆弱
Leaky ReLU: f(x)=max{αx,x} 不会饱和,计算速度也很快
ELU:指数线性单元,所有ReLU的优点都有,不会挂,输出均值趋于0,但是有指数存在,计算量略大。
Maxout:两条直线拼接,计算是线性,不会饱和不会挂,缺点是增加了参数。
工业上主流用的还是ReLU(或类ReLU)激励层。
池化层(Pooling layer)
pooling:原理是图像具有局部特征不变性,所以可以采用池化操作。
Max pooling 示意图
downsampling
全连接层 (Full connect layer):所有神经元之间都有权重连接,试图尽可能将池化下采样中的信息恢复出来。如果一开始都用全连接层,参数太多,训练量太大,无法有效计算。
CNN 训练算法:
CNN 优缺点:
优点:
缺点:
常见的CNN 框架
LeNet
AlexNet
GoogleNet
VGGNet
ResNet
DenseNet
Fine tuning:
Mini-batch SGD:
不断循环:
CNN训练图像数据预处理: 去均值,但是不要做标准化、PCA和白化。
均值是训练集样本数据的均值,训练集和测试集均需要减去训练集样本均值。
权重初始化
权重初始化,不能全部初始化为0。可采用正态随机初始化
W = np.random.randn(m,n)*0.01 # W初始化,m是输入层神经元个数,n是输出层神经元个数
权重 W 的取值过小,会导致深层的激励为0
Xavier Initialization:
import numpy as np
W = np.random.randn(fan_in,fan_out)/np.sqrt(fan_in)
ReLU activation function:
import numpy as np
W = np.random.randn(node_in, node_out) / np.sqrt(node_in / 2)
Batch Normalization Layer (Google 提出)可以有效降低深度网络对weight初始化的依赖,防止“梯度弥散”:
import tensorflow as tf # tensorflow
# put this before nonlinear transformation
layer = tf.contrib.layers.batch_norm(layer, center=True, scale=True,
is_training=True)
通常在全连接层后,激励层前做。因为全连接层对所有的神经元关联,波动性大。其对激励过后的结果进行约束,使激励后的结果呈现高斯分布。 是对SGD 反向传播训练权重W的约束
Training时 μB 和 σB 由当前batch计算得出;在Testing时 μB 和 σB 应使用Training时保存的均值或类似的经过处理的值,而不是由当前batch计算。 γ 和 β 都是有神经网络 训练得到, 作用则是为了让因训练所需而“刻意”加入的BN能够有可能还原最初的输入((即当 γ(k)=Var[x(k)]−−−−−−−√ , βk=E[x(k)] 时)
Batch normalization 的好处: