卷积层里的多输入多输出通道、池化层

多输入多通道

每个通道都有一个卷积核,结果是所有通道卷积结果的和。

卷积层里的多输入多输出通道、池化层_第1张图片

无论有多少输入通道,到目前为止我们只用到单输出通道。可以有多个三维卷积核,每个核生成一个输出通道。

输出通道数是卷积层的超参数。

每个输入通道有独立的二维卷积核,所有通道结果相加得到一个输出通道结果。

每个输出通道有独立的三维卷积核。

池化层

二维最大池化:返回滑动窗口中的最大值。就是一个动态的滑动过程。

卷积层里的多输入多输出通道、池化层_第2张图片

池化层与卷积层类似,都具有填充和步幅。在每个输入通道应用池化层以获得相应的输出通道。没有可学习的参数。输出通道数等于输入通道数。

最大池化层:每个窗口中最强的模式信号。

平均池化层:将最大池化层中的“最大”操作替换为“平均”。

池化层返回窗口中的最大或平均值。

缓解卷积层对位置的敏感性。

同样有窗口大小、填充、和步幅作为超参数。

实现池化层的正向传播

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))

你可能感兴趣的:(深度学习,深度学习)