代码解释帮助理解:
torch.randn(10, 3, 32, 32),初始数据:(10, 3, 32, 32)代表有10张图片,每张图片的像素点用三个数表示,每张图片大小为32x32。(重点理解这个下面就好理解了)
nn.Conv2d(3, 64, kernel_size=3, padding=1)理解Conv2d参数。表示图片输入的通道是3,输出为64通道(因为用的是64个卷积核(滤波器)。这样就理解卷积的含义了。
而conv3x3_1 = nn.Conv2d(64, 164,)#表明输入通道是64,输出通道是164.这里的输入要等于上一层的输出通道64,相当于有64个矩阵。输出通道数目可以自定义指定。
得出结论(重点):
nn.Conv2d(3, 64,)的前两个参数输入通道数和输出通道数其实在修改的是图片的单个像素用多少个数字表示,如RGB是用三种颜色(用三个数字表示一个像素)。也就是修改的是torch.randn(10, 3, 32, 32)里面的3。
后三个参数卷积核大小(kernel_size)和步长(stride)以及填充(padding)是改变图片的尺寸。也就是修改的是torch.randn(10, 3, 32, 32)里面的32x32。
import torch
import torch.nn as nn
# 创建输入张量
input_tensor = torch.randn(10, 3, 32, 32) # 输入通道数为3,输入特征图尺寸为32x32,相当于有3个32x32的矩阵,也就是一张图片
# 创建3x3卷积层
conv3x3 = nn.Conv2d(3, 64, kernel_size=3, padding=1)#表明输入通道是3,输出通道是64
# 进行3x3卷积操作
output = conv3x3(input_tensor)
# 打印输出特征图的尺寸
print(output.size())
torch.Size([10, 64, 32, 32])
第一种代码:
conv3x3_1 = nn.Conv2d(64, 164, kernel_size=3, padding=1)#表明输入通道是64,输出通道是164.这里的输入要等于上一层的输出通道64,相当于有64个二矩阵
# 进行3x3卷积操作
output1 = conv3x3_1(output)
print(output1.size())
输出结果:torch.Size([10, 164, 32, 32])
上面修改第二层Conv2d()的输出通道数参数,改为164,发现最后输出结果output1也只是输出通道数目(也就是一个像素点用多少数字表示)变化,其他三个参数都没变,分别代表10张图片,图片尺寸为32x32。
**************************************************************************************
那么如何让图片大小32x32变化呢?答案就是改变卷积核大小(kernel_size)和步长(stride)以及填充(padding)。
将第一种代码改为下面代码:
conv3x3_1 = nn.Conv2d(64, 164, kernel_size=5, padding=4,stride=2)#表明输入通道是64,输出通道是164.这里的输入要等于上一层的输出通道64,相当于有64个二矩阵
# 进行3x3卷积操作
output1 = conv3x3_1(output)
print(output1.size())
输出结果:torch.Size([10, 164, 18, 18])
发现图片大小变成18x18了,
计算公式为:
Hout公式代入:18 = [32+2x4-1x(5-1)-1]/2+1结果再向下取整 (也就是35/2+1向下取整 = 18)
同理Wout公式带入也是18(明显也能看出参数矩阵都是矩阵,长宽的值一样)
tips1:nn.Conv2d中dilation这个参数 控制卷积核点的间距 不常用,代入上式默认值为1
dilation | (int or tuple, optional) | Spacing between kernel elements. Default: 1 | 扩张操作:控制kernel点(卷积核点)的间距,默认值:1。 |
tips2:有时候改完这三个参数或者其中的一两个,也可能会不同的参数经过同一个公式,导致图片尺寸不变。
最重要的是要理解nn.Conv2d参数的意思(下面是常用的五个参数):
参数 | 参数类型 | ||
---|---|---|---|
in_channels | int | Number of channels in the input image | 输入图像通道数 |
out_channels | int | Number of channels produced by the convolution | 卷积产生的通道数 |
kernel_size | (int or tuple) | Size of the convolving kernel | 卷积核尺寸,可以设为1个int型数或者一个(int, int)型的元组。例如(2,3)是高2宽3卷积核 |
stride | (int or tuple, optional) | Stride of the convolution. Default: 1 | 卷积步长,默认为1。可以设为1个int型数或者一个(int, int)型的元组。 |
padding | (int or tuple, optional) | Zero-padding added to both sides of the input. Default: 0 | 填充操作,控制padding_mode的数目。 |