本节介绍与神经层配套使用的pooling(池化)层的定义和使用。
pooling(池化)层原则上为采样操作,与upsample(上采样)不同的是,pooling为下采样操作,即将feature map变小的操作。
那么下采样和上采样是什么含义呢?
如图所示,将图片上的矩阵由右变向左的操作即为下采样。上图可见是每隔1个元素取一个样,向右方向取了A和B、向下方向取了A和C。这样完成了4*4矩阵向2*2矩阵的转化。
而在卷积神经网络中,以max pooling操作为例
过程如下
Kernel size为2*2的小窗口,在第一个框内取了最大值6后,向右方向进行了步长为2的移动,在2、4、7、8四个值中取了最大值8。同理再进行向下移动。
与max pooling对应的还有Avg pooling,即取平均数。
比较简单,这里不再赘述。
那么在pytorch中如何完成pooling操作
import torch
import torch.nn as nn
import torch.nn.functional as F
x = torch.rand(1, 16, 28, 28)
# 先定义x
layer = nn.MaxPool2d(2, stride=2)
# 括号内第一个参数是:窗口的大小,第二个是移动的步长距离
out1 = layer(x)
print(out1.size())
输出为
torch.Size([1, 16, 14, 14])
另外
x = torch.rand(1, 16, 28, 28)
# 先定义x
layer = nn.AvgPool2d(2, stride=2)
# 括号内第一个参数是:窗口的大小,第二个是移动的步长距离
# 进行Avg pooling的计算
out2 = layer(x)
print(out2.size())
输出为
torch.Size([1, 16, 14, 14])
同样向上采样的过程为
如上图从左至右的过程为上采样过程。上图将原数据进行复制即得到新的数据。
在pytorch中,代码为
import torch
import torch.nn as nn
import torch.nn.functional as F
x = torch.rand(1, 16, 28, 28)
# 先定义x
out = F.interpolate(x, scale_factor=2, mode='nearest')
# 上采样的API为:.interpolate
# 括号内参数为输入的tensor、放大的倍率、模式为紧邻差值法
print(out.size())
输出为
torch.Size([1, 16, 56, 56])
Bias和input channel不发生改变,原来的28*28放大两倍至56*56
下面再简单扼要的介绍ReLU的效果
之前有介绍过ReLU函数时将低于某个阈值的输出全部归为0,高于阈值的线性输出。
上图是使用效果图。将黑色区块全部取消。
import torch
import torch.nn as nn
import torch.nn.functional as F
x = torch.rand(1, 16, 28, 28)
layer = nn.ReLU(inplace=True)
out = layer(x)
print(out.size())
输出为
torch.Size([1, 16, 28, 28])
在进行ReLU操作,进行inplace操作后,较小值会变为零,但数据的size不会发生改变。通过这种数据会节省一部分的数据存储量。
本文分享自 python pytorch AI机器学习实践 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!