背景

位置敏感

X=[11000110001100011000]Y=[01000010000100001000] X = \left[ \begin{matrix} 1 & 1 & 0 & 0 & 0 \\ 1 & 1 & 0 & 0 & 0 \\ 1 & 1 & 0 & 0 & 0 \\ 1 & 1 & 0 & 0 & 0 \\ \end{matrix} \right] Y = \left[ \begin{matrix} 0 & 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 & 0 \\ \end{matrix} \right] X=​1111​1111​0000​0000​0000​​Y=​0000​1111​0000​0000​0000​​
X代表原始的矩阵, Y代表边缘检测, 需要一定程度的平移不变形, 比如照明, 无题位置和外观等等图像不会因为剧烈的变化导致边缘检测失败

二维最大池化

在这里插入图片描述
每次根据窗口滑动作为输入数据, 得到输出, 然后通过max(0, 1, 3, 4)把最大的值拿出来也称为最大池化层

通过最大池化边缘检测
X=[11000110001100011000]Y=[01000010000100001000]Z=[11000110001100011000] X = \left[ \begin{matrix} 1 & 1 & 0 & 0 & 0 \\ 1 & 1 & 0 & 0 & 0 \\ 1 & 1 & 0 & 0 & 0 \\ 1 & 1 & 0 & 0 & 0 \\ \end{matrix} \right] Y = \left[ \begin{matrix} 0 & 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 & 0 \\ \end{matrix} \right] Z= \left[ \begin{matrix} 1 & 1 & 0 & 0 & 0 \\ 1 & 1 & 0 & 0 & 0 \\ 1 & 1 & 0 & 0 & 0 \\ 1 & 1 & 0 & 0 & 0 \\ \end{matrix} \right] X=​1111​1111​0000​0000​0000​​Y=​0000​1111​0000​0000​0000​​Z=​1111​1111​0000​0000​0000​​
X代表垂直边缘检测, Y代表卷积输出, Z代表(2 * 2)最大池化效果

填充/步幅/通道

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

平均池化层

最大池化层: 每个窗口中最强的信号
平均池化层: 将最大池化层中的"最大"操作替换为平均

代码实现

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))
	for i in range(Y.shape[0]):
		for j in range(Y.shape[1]):
			if mode == 'max':	
				X[i, j] = X[i: i+p_h, j:j+p_w].max()
			elif mode == 'avg':
				X[i, j] = X[i: i+p_h, j:j+p_w].mean()
	return Y

每个通道单独计算


X = torch.cat((X, X + 1), 1)
pool2d = nn.MaxPool2d(3, padding=1, stride=2)
pool2d(X)

更多推荐