cnn池化层输入通道数_(pytorch-深度学习系列)CNN中的池化层-学习笔记
CNN中的池化层
首先,池化(pooling)层的提出是为了缓解卷积层对位置的过度敏感性。
什么意思?
比如在图像边缘检测问题中,实际图像里,我们的目标物体不会总出现在固定位置,即使我们连续拍摄同一个物体也极有可能出现像素位置上的偏移。这会导致同一个边缘对应的输出可能出现在卷积输出的边缘的不同位置,从而对模式识别造成影响。
与卷积层类似,池化层每次也是对输入数据的一个固定窗口内的元素计算输出
但是池化层不同于卷积层,它不考虑输入与核的互相关性,池化层直接计算池化窗口内数据的最大值或平均值,这分别对应与最大池化与平均池化。
对于二维最大池化,池化窗口从输入数组的最左上方开始,按从左往右、从上往下的顺序,依次在输入数组上滑动。当池化窗口滑动到某一位置时,窗口中的输入子数组的最大值即输出数组中相应位置的元素。
\[\begin{bmatrix}
0&1&2 \\
3&4&5 \\
6&7&8
\end{bmatrix} *
\begin{bmatrix}
2*2 \\ 最大池化层
\end{bmatrix} =
\begin{bmatrix}
4&5 \\
7&8
\end{bmatrix}
\]
由:
\[ \max(0,1,3,4)=4,\\
\max(1,2,4,5)=5,\\
\max(3,4,6,7)=7,\\
\max(4,5,7,8)=8. \]
·
构造一个实现最大池化和平均池化的层:
import torch
from torch import nn
def pool2d(X, pool_size, mode='max'):
X = X.float()
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
对于物体边缘检测的例子:
检测图像中物体的边缘,即找到像素变化的位置。首先我们构造一张6×86×8的图像(即高和宽分别为6像素和8像素的图像)。它中间4列为黑(0),其余为白(1)。
X = torch.ones(6, 8)
X[:, 2:6] = 0
X
tensor([[1., 1., 0., 0., 0., 0., 1., 1.],
[1., 1., 0., 0., 0., 0., 1., 1.],
[1., 1., 0., 0., 0., 0., 1., 1.],
[1., 1., 0., 0., 0., 0., 1., 1.],
[1., 1., 0., 0., 0., 0., 1., 1.],
[1., 1., 0., 0., 0., 0., 1., 1.]])
然后我们构造一个高和宽分别为1和2的卷积核K。当它与输入做互相关运算时,如果横向相邻元素相同,输出为0;否则输出为非0。
K = torch.tensor([[1, -1]])
下面将输入X和我们设计的卷积核K做互相关运算。可以看出,我们将从白到黑的边缘和从黑到白的边缘分别检测成了1和-1。其余部分的输出全是0。
def corr2d(X, K):
h, w = K.shape
Y = torch.zeros((X.shape[0] - h + 1, X.shape[1] - w + 1))
for i in range(Y.shape[0]):
for j in range(Y.shape[1]):
Y[i, j] = (X[i: i + h, j: j + w] * K).sum()
return Y
Y = corr2d(X, K)
print(Y)
tensor([[ 0., 1., 0., 0., 0., -1., 0.],
[ 0., 1., 0., 0., 0., -1., 0.],
[ 0., 1., 0., 0., 0., -1., 0.],
[ 0., 1., 0., 0., 0., -1., 0.],
[ 0., 1., 0., 0., 0., -1., 0.],
[ 0., 1., 0., 0., 0., -1., 0.]])
现在我们将卷积层的输出作为2×2平均池化层的输入。设该卷积层输入是X、池化层输出为Y。
无论是X[i, j]和X[i, j+1]值不同,还是X[i, j+1]和X[i, j+2]不同,池化层输出均有Y[i, j]不等于0。也就是说,使用2×2平均池化层时,只要卷积层识别的模式在高和宽上移动不超过一个元素,我们依然可以将它检测出来。
池化层的填充和步幅:
同卷积层一样,池化层也可以在输入的高和宽两侧的填充并调整窗口的移动步幅来改变输出形状。
先构造一个形状为(1, 1, 4, 4)的输入数据,前两个维度分别是批量和通道。
X = torch.arange(16, dtype=torch.float).view((1, 1, 4, 4))
print(X)
tensor([[[[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.],
[12., 13., 14., 15.]]]])
默认情况下,MaxPool2d实例里步幅和池化窗口形状相同。下面使用形状为(3, 3)的池化窗口,默认获得形状为(3, 3)的步幅。
pool2d = nn.MaxPool2d(3)
pool2d(X)
输出为:
\[\begin{bmatrix}
0&1&2&3 \\
4&5&6&7 \\
8&9&10&11 \\
12&13&14&15
\end{bmatrix} *
\begin{bmatrix}
3*3 \\ 最大池化层
\end{bmatrix} =
\begin{bmatrix}
10
\end{bmatrix}
\]
至于输出为什么是[10],根据之前的blog中讲过的卷积层的输入输出公式:
\[output = \lfloor(n_h-k_h+p_h+s_h)/s_h\rfloor \times \lfloor(n_w-k_w+p_w+s_w)/s_w\rfloor= \\
\lfloor(4-3+0\times2+3)/3\rfloor \times \lfloor(4-3+0\times2+3)/3\rfloor = 1 \times 1
\]
得出输出维度为(1*1)
如果手动指定步幅和填充:
pool2d = nn.MaxPool2d(3, padding=1, stride=2)
pool2d(X)
\[output = \lfloor(n_h-k_h+p_h+s_h)/s_h\rfloor \times \lfloor(n_w-k_w+p_w+s_w)/s_w\rfloor= \\
\lfloor(4-3+1\times2+2)/2\rfloor \times \lfloor(4-3+1\times2+2)/2\rfloor = 2 \times 2
\]
tensor([[[[ 5., 7.],
[13., 15.]]]])
指定非正矩形的窗口:
pool2d = nn.MaxPool2d((2, 4), padding=(1, 2), stride=(2, 3))
pool2d(X)
\[output = \lfloor(n_h-k_h+p_h+s_h)/s_h\rfloor \times \lfloor(n_w-k_w+p_w+s_w)/s_w\rfloor= \\
\lfloor(4-2+1\times2+2)/2\rfloor \times \lfloor(4-4+2\times2+3)/3\rfloor = 3 \times 2
\]
输出为:
\[\begin{bmatrix}
0&0&0&0&0&0&0&0\\
0&0&0&1&2&3&0&0 \\
0&0&4&5&6&7&0&0 \\
0&0&8&9&10&11&0&0 \\
0&0&12&13&14&15&0&0\\
0&0&0&0&0&0&0&0
\end{bmatrix} *
\begin{bmatrix}
2*4 \\ 最大池化层
\end{bmatrix} =
\begin{bmatrix}
1&3\\
9&11\\
13&15\\
\end{bmatrix}
\]
池化层中的多通道
在处理多通道输入数据时,池化层对每个输入通道分别池化,而不是像卷积层那样将各通道的输入按通道相加。这意味着池化层的输出通道数与输入通道数相等。
例如:
X = torch.cat((X, X + 1), dim=1)
print(X)
输出:
tensor([[[[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.],
[12., 13., 14., 15.]],
[[ 1., 2., 3., 4.],
[ 5., 6., 7., 8.],
[ 9., 10., 11., 12.],
[13., 14., 15., 16.]]]])
pool2d = nn.MaxPool2d(3, padding=1, stride=2)
pool2d(X)
输出通道数仍然是2
tensor([[[[ 5., 7.],
[13., 15.]],
[[ 6., 8.],
[14., 16.]]]])
cnn池化层输入通道数_(pytorch-深度学习系列)CNN中的池化层-学习笔记相关推荐
- 深度学习每层的通道数如何计算_深度学习基础系列(一)| 一文看懂用kersa构建模型的各层含义(掌握输出尺寸和可训练参数数量的计算方法)...
我们在学习成熟网络模型时,如VGG.Inception.Resnet等,往往面临的第一个问题便是这些模型的各层参数是如何设置的呢?另外,我们如果要设计自己的网路模型时,又该如何设置各层参数呢?如果模型 ...
- 深度学习每层的通道数如何计算_模型通道剪枝之DMCP: Differentiable Markov Channel Pruning...
模型压缩的目的是减小模型计算量(FLOPs or MACC).减小模型参数量/体积.减小模型的推理时间(latency).主要方法有知识蒸馏.紧凑网络设计.剪枝.量化.低秩近似等.今天分享一篇通道剪枝 ...
- 还在纠结通道数、位深度?实验带你看懂关于灰度图像,二值化图像,彩色图像、图片通道数,位深度的全部内容
数据加载相关 前言 图片的通道数.位深度 单通道 三通道 四通道 通道数之间的转化 二值化图像 小结 灰度图像 小结 pillow库 相关全部代码 前言 首先我们都知道,图像是由一个个像素点组成的.图 ...
- minio 并发数_开源数据存储项目Minio:提供非结构化数据储存服务
Minio是一个在Apache Licence 2.0下发布的对象存储服务器.官网:https://minio.io.它与Amazon S3云存储服务兼容.Minio最适合存储非结构化数据,如照片.视 ...
- matlab 神经网络设计多层隐含层_[rbf神经网络]请教关于MATLAB中RBF神经网络隐含层神经元个数的问题...
rbf神经网络 请教关于MATLAB中RBF神经网络隐含层神经元个数的问题 问题补充:MATLAB中用newrb(P, T, goal, spread)创建的神经网络,用于数据的预测,程序可以运行并能 ...
- python输入一组身高_一起学Python系列之用户输入
函数input(): 函数input() 让程序暂停运行, 等待用户输入一些文本. 获取用户输入后, Python将其存储在一个变量中, 以方便你使用. message=input("tel ...
- java 线程钩子_高级并发编程系列六(线程池钩子函数)
1.考考你 国庆假期快要结束了,准备回到工作岗位的你,是不是已经开始撸起袖子敲代码,反正发完文章我就要准备去加班了,程序员就这样,有干劲对吧 那么来吧,让我们一起分享完高级并发编程系列中,线程池小节的 ...
- ecshop 属性自动组合_【深度文章】结构设计中的荷载组合剖析(下)
▲ 点击上方蓝字,关注PKPM官方公众号! [深度文章]结构设计中的荷载组合剖析(上) [深度文章]结构设计中的荷载组合剖析(中) 续接前文 (本篇共1410字,阅读时长大约5分钟) 06 梁.板挠度 ...
- Java从键盘输入若干数_用java编程序:从键盘输入若干个整数,输出这些数中大于其平均值的数。...
展开全部 引用1楼 christal yhy的答案,考虑到浮点数的存在,特在此基础上优化一下,代码如下: public static void main(String[] args) { Scanne ...
最新文章
- python3 字符串 hex 相互转换 代替python2 decode(‘hex’)
- 有关gitlab的神秘操作.....versiondomain设置...
- python中文解释-python注释不能识别中文
- 别太把GitHub的Star当回事
- jquery ajax提交表单数据的两种方式
- flutter 的gradle下载不了怎么办
- mysql入门很简单(一)
- 累计增量备份策略_SAN存储做定时/实时备份的介绍
- 集合阿里云、达摩院、平头哥相关技术的HaaS,官宣出书啦
- 1203.1——条件语句 之 if语句
- 电脑上有什么好用的卸载软件?--geek 卸载神器
- WORD文档中的宏代码操作(表格批量操作))
- 计算机视觉和模式识别领域企业论坛,第三届中国模式识别与计算机视觉大会(PRCV 2020)圆满举办...
- 历年奥斯卡获奖影片(1927—2015)
- 《算法导论》 第28章 矩阵运算
- 高等教育学备考:教育学概述
- 如何优雅的管理以及书写好代码
- mini《猜字》游戏,谁玩谁迷糊
- 【YOLOv1原文+翻译】You Only Look Once Unified, Real-Time Object Detection
- 群晖NAS教程(二十二)、利用Docker安装minio
热门文章
- 腾讯 AI Lab Robotics X 主任张正友博士:计算机视觉的三生三世 | CCF-GAIR 2019
- VLC视频播放器原理详细分析含TS流格式分析
- Linux下用GDB调试程序崩溃错误
- 处理多维度变化——桥接模式
- Spark _08窄依赖和宽依赖stage
- 【Python】count()方法:统计字符串出现的次数
- java安全编码指南之:锁的双重检测
- ajax技术书,ajax技术
- java项目合同制没做完扣钱吗_程序员接私活,怎样防止做完不给钱?
- hadoop元数据合并过程_Hadoop元数据合并异常及解决方法