1. 卷积层
一般完整的CNN整个卷积神经网络,使用的层包括:
1.卷积层(Convolutional layer)
2.池层(Pooling layer)
3.全连接层(fully connected layer)
典型的cnn网络结构是由上述三类层构成:
在CNN中,卷积层(CONV)使用过滤器执行卷积操作。因为它扫描输入图像的尺寸。它的超参数包括滤波器大小,可以是2x2、3x3、4x4、5x5(或其它)和步长S。结果输出O称为特征映射或激活映射,具有使用输入层计算的所有特征和过滤器。
下面描绘了应用卷积的工作过程:
2. conv2d函数
pytorch深度学习库中的Conv2d是用来实现2d卷积操作的函数,一般应用于图像卷积。
conv2d的输入是:batch, channels, H, W],卷积核是矩形,在三四维上进行。例如:
input(2, 3, 4, 5) -> filter(5, 3, 2, 3) -> output(2, 5, 3, 4)。
函数定义
class torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)
参数说明:
- in_channels (int) – 输入通道个数。
- out_channels (int) – 输出通道个数 。有多少个out_channels,就需要多少个卷积(也就是卷积核的数量)
- kernel_size(int or tuple) – 卷积核的尺寸;卷积核的第二个维度由in_channels决定,所以实际上卷积核的大小为kernel_size * in_channels
-
stride (int or tuple, optional) – 卷积操作的步长, 默认:1
-
padding (int or tuple, optional) – 输入数据各维度各边上要补齐0的层数,默认: 0
-
dilation (int or tuple, optional) – 卷积核各元素之间的距离,默认: 1
-
groups (int, optional) – 输入通道与输出通道之间相互隔离的连接的个数, 默认:1
- bias (bool, optional) – 如果被置为True,向输出增加一个偏差量,此偏差是可学习参数。 默认:True
参数dilation——扩张卷积
如果设置了dilation参数,卷积输出公式为:
--- 公式1
dilation是卷积核各元素参数的距离,所以引入dilation参数后,卷积核尺寸会相应变大。相当于原有kernal_size变为了:
--- 公式2
所以,上面的公式2相当于:
以一个例子来看,假设定义了一个3*3的卷积核,dialtion参数设置为1。此时的卷积和常规卷积是一样的,卷积过程如下:
图1 dilation=1 的3*3卷积过程
如果把dilation设置为2, 卷积核中各元素之间的间距为2, 即中间隔着一个空白方格。此时new_kernalsize为2*(3-1)=6, 相当于一个6*6的卷积核。
图2 dilation=2的3*3卷积过程
3. 代码示例
通过torch生成batch_size:3,channel3,W:9, H:9, 即[3, 3, 9, 9]的样本数据,分别应用6种卷积核对样本数据进行卷积, 如下:
def conv2d_example():
# 样本数为3,channel:3, w:9, H:9
x = torch.rand(3, 3, 9, 9)
print(x.shape)
# case1 in_channels=3, out_channels=6, kernel_size=3
conv1 = nn.Conv2d(3, 6, 3)
x1 = conv1(x)
print("[case1] in_channels=3, out_channels=6, kernel_size=3: ", x1.shape)
# [case2] stride_size=3
conv2 = nn.Conv2d(3, 6, 3, 3)
x2 = conv2(x)
print("[case2] stride_size=3: ", x2.shape)
# [case3] kernel_size=(3,2)
conv3 = nn.Conv2d(3, 6, (3, 2))
x3 = conv3( x)
print("[case3] kernel_size=(3,2): ", x3.shape)
# [case4] padding=3
conv4 = nn.Conv2d(3, 6, 3, 1, 2)
x4 = conv4(x)
print("[case4]padding=3: ", x4.shape)
# [case5] dilation=3
conv5 = nn.Conv2d(3, 6, 3, 1, 0, 3)
x5 = conv5(x)
print("[case5]dilation=3: ", x5.shape)
# [case6] groups=3
conv6 = nn.Conv2d(3, 6, 3, groups=3)
x6 = conv6(x)
print("[case6]groups=3: ", x6.shape)
运行结果如下: