FunnyWii
FunnyWii
Published on 2022-11-04 / 20 Visits
0
0

深度学习 - 卷积神经网络 Convolutional Networks

卷积神经网路 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

迁移学习 Transfer learning

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

  1. 加载预训练的网络。

  2. 将最终层替换针对新任务设置的层

  3. 重新训练各层,通常只是训练新的最终层,并保持预训练的层固定不变

    可以重新训练所有层(但速度较慢)


Comment