深度学习 基础

深度学习 网络层

original icon
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.knowledgedict.com/tutorial/deep_learning-layer-convolution.html

深度学习 卷积层(Convolutional Layer)深度详解


卷积层是卷积神经网络的核心组成部分。它模仿生物视觉系统的视网膜,能够提取输入图片的空间特征。

基础

定义

卷积层由一个或多个卷积核组成,每个卷积核实质上就是一个小的滤波器,其尺寸一般较小,如 3x35x5。在训练过程中,卷积核中的参数会不断更新,以便提取不同的特征。

在卷积过程中,卷积核在输入特征图上滑动,计算输入数据和卷积核对应位置的值的内积。这个内积运算相当于卷积核对输入进行加权和,得到的输出结果组成一个特征映射(feature map)。

重复这个滑动窗口的卷积过程,就可以在输入特征图中提取出不同位置的特征,构成卷积层的输出特征图。卷积层通常会有多个卷积核,因此会输出多个特征图。

卷积过程图

关键参数

卷积层的一些关键参数:

  1. 卷积核大小:决定了视野范围,不同大小能提取不同尺度的特征。
  2. 卷积核数量:决定输出特征图的通道数。
  3. 卷积步长:控制滑动窗口移动的步长,一般为1或2。
  4. 填充(Padding):在输入边界填充0,控制输出特征图的大小。
  5. 池化:一般在卷积层后使用池化层进行下采样,减小数据量和计算量。

通道

卷积层中的通道(channel)表示特征图的数量,它有以下几层含义:

  1. 输入通道数(in_channels):输入数据中包含的通道数。例如 RGB 图像有3个通道,灰度图像有1个通道。
  2. 输出通道数(out_channels):卷积层输出的数据中含有的通道数。这个数值等于卷积核的数量。
  3. 卷积核的通道数(kernel_channels):每个卷积核的通道数需要与输入数据的通道数匹配。例如输入数据为 RGB 图像,那么每个卷积核的通道数也设置为3。
  4. 输出通道数和卷积核通道数的关系:输出通道数=卷积核的数量。每个卷积核生成一张特征图,所以卷积核的数量决定输出的通道数。

单通道卷积

以单通道卷积为例,输入为 (1, 5, 5),分别表示1个通道,宽为5,高为5。假设卷积核大小为 3x3padding=0stride=1

卷积过程如下:

单通道卷积过程

相应的卷积核不断的在图像上进行遍历,最后得到 3x3 的卷积结果,结果如下:

单通道卷积结果

多通道卷积1

以彩色图像为例,包含三个通道,分别表示 RGB 三原色的像素值,输入为 (3, 5, 5),分别表示3个通道,每个通道的宽为5,高为5。假设卷积核只有1个,卷积核通道为3,每个通道的卷积核大小仍为 3x3,padding=0,stride=1。

卷积过程如下,每一个通道的像素值与对应的卷积核通道的数值进行卷积,因此每一个通道会对应一个输出卷积结果,三个卷积结果对应位置累加求和,得到最终的卷积结果。

多通道卷积

上述过程中,每一个卷积核的通道数量,必须要求与输入通道数量一致,因为要对每一个通道的像素值要进行卷积运算,所以每一个卷积核的通道数量必须要与输入通道数量保持一致。

我们把上述图像通道如果放在一块,计算原理过程还是与上面一样,堆叠后的表示如下:

多通道卷积堆叠

多通道卷积2

在上面的多通道卷积1中,输出的卷积结果只有1个通道,把整个卷积的整个过程抽象表示,过程如下:

多通道卷积抽象表示

即:由于只有一个卷积核,因此卷积后只输出单通道的卷积结果(黄色的块状部分表示一个卷积核,黄色块状是由三个通道堆叠在一起表示的,每一个黄色通道与输入卷积通道分别进行卷积,也就是 channel 数量要保持一致,图片组这里只是堆叠放在一起表示而已)。

那么,如果要卷积后也输出多通道,增加卷积核(filers)的数量即可,示意图如下:

多通道卷积输出多通道

代码示例

pytorch 代码示例

下面示例代码,整个过程实现如下:

  1. 输入1张3通道28x28图像。
  2. 进行5x5卷积操作,卷积核通道数为6。
  3. 得到输出数据,包含6张24x24特征图。
import torch
import torch.nn as nn

in_channels = 3  # 输入通道数量
out_channels = 6  # 输出通道数量
width = 28  # 每个输入通道上的卷积尺寸的宽
height = 28  # 每个输入通道上的卷积尺寸的高
kernel_size = 5  # 每个输入通道上的卷积尺寸
batch_size = 1  # 批数量

#   定义输入数据,一张28x28的3通道图像
ipt = torch.randn(batch_size, in_channels, width, height)
print(ipt)

#   定义卷积层
conv = nn.Conv2d(in_channels, out_channels, kernel_size)

#   进行卷积操作
#   输入数据 ipt 经过卷积层 conv,生成输出数据 output
output = conv(ipt)

# output大小为(1, 6, 24, 24)
# 说明:
# (1)input通道数为3,卷积层conv通道数为6,所以output通道数为6
# (2)input大小为28x28,kernel大小为5,所以输出大小为(28-5+1) x (28-5+1) = 24 x 24
# 以上推导遵循卷积操作的计算公式:
# output_height = (input_height - kernel_height + 2*padding)/stride + 1
# output_width = (input_width - kernel_width + 2*padding)/stride + 1

# 访问输出数据
print(output.size())  # torch.Size([1, 6, 24, 24])

总结

综上,卷积层通过卷积核提取图片空间信息,然后经过池化采样得到稳定 translation-invariant 的特征,进而构建强大的卷积神经网络模型。