两层简单卷积网络构建:
impot torch
from torch import nn
data = torch.ones(size=(10,3,28,28))
conv1 = nn.Conv2d(3,6,3)
在卷积层con1中,三个数字分别代表参数in_channles(输出通道),out_channles(输入通道),kernel_size(卷积核大小).
其中输出通道和我们输入数据的通道数保持一致,输入通道和卷积核大小由自己决定,但要注意,下一层卷积层输入通道要与上一层输出通道保持一致。
这里我们定义下一层conv2
conv2 = nn.Conv2d(6,4,3)
定义好之后可以打印查看结果
print(conv1(data))
print(conv2(conv1(data)))
步长
在不设置stride(步长)的情况下,默认为一,可以通过对步长的设置来控制特征图的大小。但是当步长为1时,会出现中间部分被重复扫描的现象,‘中间重边缘轻’。而增大步长,过大时会出现一些边缘扫描不到的情况,如图:
填充法
当步长为3时,卷积核不会出现重复扫描的过程,但是最右边无法被扫描到,这时候需要用填充法对图像进行填充,由参数padding和padding_mode来控制。
padding=1时,图像的上下左右各添加一个像素,padding_mode则可以选择要填充的值。
对于padding_mode,输入值为‘zero’时,用数字0填充。输入值为‘cicular’时使用环形填充,如下图:
当然即使有了padding也不是一定能扫描完全,像这种:
这个时候使用‘valid'或者'same'方法来解决:
valid方法是对后续未扫描到的像素抛弃,same则是做填充,不过same方法只能在tensorflow中实现。根据上面的规律,可以得到特征图片大小与输入图片大小的规律: