多输入多通道
每个通道都有一个卷积核,结果是所有通道卷积结果的和。
无论有多少输入通道,到目前为止我们只用到单输出通道。可以有多个三维卷积核,每个核生成一个输出通道。
输出通道数是卷积层的超参数。
每个输入通道有独立的二维卷积核,所有通道结果相加得到一个输出通道结果。
每个输出通道有独立的三维卷积核。
池化层
二维最大池化:返回滑动窗口中的最大值。就是一个动态的滑动过程。
池化层与卷积层类似,都具有填充和步幅。在每个输入通道应用池化层以获得相应的输出通道。没有可学习的参数。输出通道数等于输入通道数。
最大池化层:每个窗口中最强的模式信号。
平均池化层:将最大池化层中的“最大”操作替换为“平均”。
池化层返回窗口中的最大或平均值。
缓解卷积层对位置的敏感性。
同样有窗口大小、填充、和步幅作为超参数。
实现池化层的正向传播
import pylab as p
import torch
from torch import nn
from d2l import torch as d2l
def pool2d(X, pool_size, mode='max'):
p_h, p_w = pool_size
Y = torch.zeros((X.shape[0] - p_h + 1), X.shape[1] - p_w + 1)
for i in range(Y.shape[0]):
for j in range(Y.shape[1]):
if mode == 'max':
Y[i, j] = X[i:i + p_h, j:j + p_w].max()
elif mode == 'avg':
Y[i, j] = X[i:i + p_h, j:j + p_w].mean()
return Y
# 验证二维最大池化层的输出
X=torch.tensor([[0.0,1.0,2.0],[3.0,4.0,5.0],[6.0,7.0,8.0]])
print(pool2d(X,(2,2)))
# 验证平均池化层
print(pool2d(X,(2,2),'avg'))
# 填充和步幅
X=torch.arange(16,dtype=torch.float32).reshape((1,1,4,4))
print(X)
# 池化层在每个输入通道上单独运算
X=torch.cat((X,X+1),1)
print(X)
pool2d=nn.MaxPool2d(3,padding=1,stride=2)
print(pool2d(X))