卷积神经网路 Convolutional Neural Network CNN

CNN的结构

  • 卷积层 Convolution
  • 池化层(下采样) Polling
  • 全连接层 Full connection

卷积层

最基础的2D卷积操作,涉及到一个2D的过滤器(filter),或者说是核(kernel)。filter实际上是一个2D的权重矩阵。

z_{i,j} = \Sigma_m \Sigma_n w_{(m,n)} x_{i+m,j+n} +b

对于单个卷积层在 layer ​l 的输出:

z_{i,j,k}^{(l)} = \Sigma_c \Sigma_m \Sigma_n w_{(m,n,c,k)}^{)(l)} x_{i+m,j+n,c}^{(l-1)} +b_k^{(l)}

m和n是filter的行和列的数量,c代表filter的深度,k代表filter的数量。

CNN中filter的移动.png

Figure 1 CNN中filter的移动

卷积层的超参数

  1. Filter 尺寸 ​W_F ​H_F

    ​\times 高,一般假设宽和高一样。

Filter size.png

Figure 2 Filter size

  1. Filter 数量 ​N_F
  2. 步长 Stride ​N_S 指的是filter在滑动时,每次滑动的格子数
  3. 填充 Padding 指的是在输入端周围引入的零填充量。0填充可以避免在layer中出现的萎缩现象。

Zero-padding.png

Figure 3 Zero-padding

池化层

池化层将输出替换为附近的输出,有助于使输出对输入的小规模转化更加稳健。

Pooling.png

Figure 4 Pooling (filter size =2)

  • Max pooling:将数值替换为区域内的最大值
  • Ave pooling:将数值替换为区域内的平均值

网络结构

CNN结构.png

Figure 5 CNN结构

在MATLAB中,CNN的网络结构用如下方式定义

% define network layers
layers = [
  imageInputLayer([128 128 3]) 
  convolution2dLayer([3 3],8,"Padding","same")
  batchNormalizationLayer
  reluLayer
  maxPooling2dLayer([2 2],"Padding","same","Stride",[2 2])
  convolution2dLayer([3 3],16,"Padding","same")
  batchNormalizationLayer
  reluLayer
  fullyConnectedLayer(5)
  softmaxLayer
  classificationLayer];

一些参数的设置:

% Specify the training options
options = trainingOptions('sgdm', ...
      'MiniBatchSize',10, ...
      'MaxEpochs',10, ...
      'InitialLearnRate',1e-3, ...
      'ValidationData',augimdsValidation, ...
      'Verbose',true, ...
      'Plots','training-progress',...
      'ExecutionEnvironment','cpu');
      % Train the network using the training data
      net = trainNetwork(trainingData,layers,options);

需要明确的参数包括:

  • SGD算法的具体类型
  • 最小批量大小:用多少个样本来获得Loss function梯度的平均估计值
  • 初始学习率:初始值为 𝜖(可以保持不变或降低以提高收敛性)
  • 验证数据:训练算法可以定期地在独立的验证数据上检查进度
  • Verbose:定期把输出打印到屏幕上
  • 绘图:绘制收敛图
  • 执行环境:CPU或GPU

LeNet

LeNet是最早发布的CNN之一。

LeNet由2个部分组成:

  • 卷积Block:每个Block由1个卷积层,1个sigmoid激活函数和1个Ave Pooling。这年代Max Pooling和ReLU还没出现。
  • 全连接Block:最终输出10个类别。

LeNet.png

迁移学习 Transfer learning

迁移学习指的是将预先训练好的CNN模型,用于另一个任务中。

微调 Fine-Tuning

Fine-Tuning 是迁移学习中的一个常见方法,在自己的数据集规模较小时非常有效,一般流程如下:

  1. 开源数据集训练得到预训练模型
  2. 复制除了输出层以外的预训练模型参数 -> 新模型
  3. 修改新模型的输出层以适配类别变化,这一层需要执行随机初始化
  4. 使用自己的新数据集,在新模型上进行训练