《PyTorch深度学习实践》10. 卷积神经网络(基础篇)

卷积神经网络(基础篇)

朴素的全连接神经网络在处理图像时会丢失图像的位置信息(因为每个像素都被视为无差别的输入)。卷积神经网络(CNN)可以解决这个问题。

CNN基本结构

image-20200921210317889

基本结构分两部分,第一部分是特征提取器,主要是卷积层和池化层;第二部分是分类器,主要是全连接层,后面跟一个softmax层用来分类。

补充:栅格图像:最常见的图像形式,用像素表示图(如RGB,或灰度)。与之相对的是矢量图像。

单输入通道下的卷积计算:

image-20200922201817860

注意:输入与卷积核相乘的时候是数乘而非矩阵乘,即对应位置的元素相乘。

输入三通道输出一通道下的卷积运算:

image-20200922202457869

image-20200922202601746

image-20200922202706970

注意卷积核的channel数与输入的channel数保持一致

多通道输入多通道输出的情况,采用了多个卷积核,卷积核的数目与输出通道数一致:

image-20200922202900241

多通道输入多通道输出的一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import torch
in_channels, out_channels = 5, 10
width, height = 100, 100
kernel_size = 3
batch_size = 1

input = torch.randn(batch_size,
in_channels,
width,
height)

conv_layer = torch.nn.Conv2d(in_channels,
out_channels,
kernel_size=kernel_size)

output = conv_layer(input)

print(input.shape) # torch.Size([1, 5, 100, 100])
print(output.shape) # torch.Size([1, 10, 98, 98])
print(conv_layer.weight.shape) # torch.Size([10, 5, 3, 3])

padding, stride, pooling

根据某些对输出大小的需求,如希望输出的宽度与输入的不便,可以给输入加上padding

image-20200923162830909

image-20200923162931256

上图的代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
input = [3, 4, 6, 5, 7,
2, 4, 6, 8, 2,
1, 6, 7, 8, 4,
9, 7, 4, 6, 2,
3, 7, 5, 4, 1]
input = torch.Tensor(input).view(1, 1, 5, 5)

conv_layer = torch.nn.Conv2d(1, 1, kernel_size=3, padding=1, bias=False)

kernel = torch.Tensor([1, 2, 3, 4, 5, 6, 7, 8, 9]).view(1, 1, 3, 3)
conv_layer.weight.data = kernel.data

output = conv_layer(input)
print(output)

除了padding,还有一个参数stride,即步长,是用来减小feature的宽度和高度的。

image-20200923165029612

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import torch
input = [3, 4, 6, 5, 7,
2, 4, 6, 8, 2,
1, 6, 7, 8, 4,
9, 7, 4, 6, 2,
3, 7, 5, 4, 1]
input = torch.Tensor(input).view(1, 1, 5, 5)

conv_layer = torch.nn.Conv2d(1, 1, kernel_size=3, stride=2, bias=False)

kernel = torch.Tensor([1, 2, 3, 4, 5, 6, 7, 8, 9]).view(1, 1, 3, 3)
conv_layer.weight.data = kernel.data

output = conv_layer(input)
print(output)

下采样pooling

image-20200923165618588

image-20200923170228115

在Colab上运行

课程来源:《PyTorch深度学习实践》完结合集