《动手学深度学习》-20卷积层里的填充和步幅

沐神版《动手学深度学习》学习笔记,记录学习过程,详细的内容请大家购买书籍查阅。

b站视频链接
开源教程链接

卷积层里的填充和步幅

在这里插入图片描述
应用5x5大小的卷积核,输入32x32,输出会变为28x28。
更大的卷积核更快地减小输出大小。
导致网络做不深,只能做到7层。
在这里插入图片描述
填充的效果,输出可以做的比输入还大:
在这里插入图片描述
填充值一般为0:
在这里插入图片描述
填充减少的输入大小与层数线性相关,为了避免大量计算需要增大步幅:
在这里插入图片描述
在这里插入图片描述
高和宽是2的倍数,卷积核大小为2,步幅取2,可以实现每次将输入的高和宽都除以2:
在这里插入图片描述
总结
填充是想把模型做深时所用的办法,步幅可以成倍的减小输出形状。
在这里插入图片描述

动手学

填充

import torch
from torch import nn


# 为了方便起见,我们定义了一个计算卷积层的函数。
# 此函数初始化卷积层权重,并对输入和输出提高和缩减相应的维数
def comp_conv2d(conv2d, X):
    # 这里的(1,1)表示批量大小和通道数都是1
    X = X.reshape((1, 1) + X.shape)
    Y = conv2d(X)
    # 省略前两个维度:批量大小和通道
    return Y.reshape(Y.shape[2:])

# 请注意,这里每边都填充了1行或1列,因此总共添加了2行或2列
conv2d = nn.Conv2d(1, 1, kernel_size=3, padding=1)
X = torch.rand(size=(8, 8))
comp_conv2d(conv2d, X).shape
torch.Size([8, 8])
conv2d = nn.Conv2d(1, 1, kernel_size=(5, 3), padding=(2, 1)) # 非对称卷积核
comp_conv2d(conv2d, X).shape
torch.Size([8, 8])

步幅

conv2d = nn.Conv2d(1, 1, kernel_size=3, padding=1, stride=2)
comp_conv2d(conv2d, X).shape
torch.Size([4, 4])
conv2d = nn.Conv2d(1, 1, kernel_size=(3, 5), padding=(0, 1), stride=(3, 4))
comp_conv2d(conv2d, X).shape
torch.Size([2, 2])

猜你喜欢

转载自blog.csdn.net/cjw838982809/article/details/132453997
今日推荐