CNN 网络的layer介绍
在卷积神经网络(Convolutional Neural Network,CNN)中,往往包含许多种不同的网络层交替组成,主要有卷积层(Convolutional Layer)、池化层(Pooling Layer)、非线性层(ReLU Layer)、全连接层(Fully Connected Layer)等。
- 卷积层:卷积函数层, 主要对输入input进行卷积操作,同时根据参数stride的设置,确定卷积核每两次卷积操作直接滑动的距离。卷积核(kernel)类似一个图像滤波器(filter),每一个卷积核用一个矩阵表示,将其在图片上按照间隔大小滑动处理一遍得到的结果,即为卷积层的activation map(或feature map)
- ReLU(Rectified Linear Units) Layers:非线性层,主要目的是在系统中引入非线性特征。最常见的CNN网络中使用ReLU层,其具有比tanh和sigmoid函数更好的速度与效率;
- Pooling Layers:池化层,也称降采样层,最常见的是maxpooling方法。Pooling层对输入矩阵的一块区域整体进行操作,只在该区域保留一个数值,而不同的pooling方法决定该数值的计算方法,maxpooling层对于一个区域输出最大值,同时还有average pooling和L2-norm pooling等方式。
-
Fully Connected Layer:全连接层,一般位于CNN网络的最后部分,该层的输入可以是卷积层,ReLU层,Pooling层的结果,输出一个N维向量,N即为要识别的类别数。
-
Dropout layer:由大牛Hinton提出的Dropout Layers,是为了防止过度拟合问题出现,在训练时专门加入的层。该层在forward过程中随机drop out一系列的激活值,将其值改成0,减少过度拟合。
-
backpropagation:“反向传播”,是一种在神经网络中常用的学习算法,用于计算梯度(gradient)以优化网络的权重和偏置,可以分为4个部分,the forward pass, the loss function, the backward pass, and the weight update.
-
backward pass:其目的是确定哪些权重对损失贡献最大,并找到调整这些权重的方法以便减少损失;
CNN 如何选取layer
cnn 卷积核大小、卷积层数、每层map个数都是如何确定下来的呢? 每一层卷积有多少channel数,以及一共有多少层卷积,这些暂时没有理论支撑。
一般通过经验,先用大模型训练,然后再在大模型上简化,最后取性能、精确度等综合的tradeoff.
经验模式:
- 小数据量,大模型训练;
- 设计合理的loss函数。一般来说分类就是Softmax, 回归就是L2的loss
- 观察loss的变化情况:NN主要的优化目标就是loss,所以观察loss比只观察准确率好
- 确认NN学习充分:比如分类,判断准确率会移动到极值附近;
- 设置合理的learn rate
- 对比训练集和测试集的loss
具体操作:
- 预处理:mean/std zero-center就够了, PCA, 白化什么的都用不上. 反正CNN能学习encoder;
- shuffle很重要;
- 理解网络原理
- dropout,可以防止过拟合
- 无脑用ReLU
- 无脑用3x3
- filter数量2^n
- 使用Xavier初始化网络,Xavier初始化的核心思想是使得每一层神经网络的激活值的方差在前向传播时保持恒定。这有助于解决梯度消失或爆炸的问题。
- 无脑用sgd + momentum.
- 要鼓励使用batch normalization.
- 你有95%概率不会使用超过40层的模型;
# 举一个filter数量是2^n的例子
filters = [32, 64, 128] # 这些是2的5次方,6次方,7次方
self.conv_layers = nn.Sequential(
nn.Conv2d(in_channels=3, out_channels=filters[0], kernel_size=3, stride=1, padding=1),
nn.ReLU(),
nn.MaxPool2d(kernel_size=2, stride=2),
nn.Conv2d(in_channels=filters[0], out_channels=filters[1], kernel_size=3, stride=1, padding=1),
nn.ReLU(),
nn.MaxPool2d(kernel_size=2, stride=2),
nn.Conv2d(in_channels=filters[1], out_channels=filters[2], kernel_size=3, stride=1, padding=1),
nn.ReLU(),
nn.MaxPool2d(kernel_size=2, stride=2)
)