丹东网站建设,海东高端网站建设,注册一个网站要多少费用,常州网站网站建设在卷积神经网络中#xff0c;一般在卷积层后#xff0c;我们往往进行池化操作。实现池化操作很简单#xff0c;pytorch中早已有相应的实现。
nn.MaxPool2d(kernel_size ,stride )
这种池化叫做最大池化。
最大池化原理很简单#xff0c;就是一个filter以一定的stride在原…在卷积神经网络中一般在卷积层后我们往往进行池化操作。实现池化操作很简单pytorch中早已有相应的实现。
nn.MaxPool2d(kernel_size ,stride )
这种池化叫做最大池化。
最大池化原理很简单就是一个filter以一定的stride在原数据上进行操作就像这样 这里是一个2x2的filter同时stride为2在原始数据上扫描最终的到新的数据。
通过代码来实现 import torch import torch.nn as nn datatorch.tensor([[1,1,2,4],[5,6,7,8],[3,2,1,0],[1,2,3,4]],dtypetorch.float32) data.size()torch.Size([4, 4]) datadata.unsqueeze(0) data.size()torch.Size([1, 4, 4]) datadata.unsqueeze(0) data.size()torch.Size([1, 1, 4, 4])
之所以这样操作是为了模仿实际训练网络时的场景。这样data的尺寸变为了1x1x4x4
可以理解为Batch为1Channel为1Height为4Width为4 netnn.MaxPool2d(kernel_size2,stride2) endnet(data) endtensor([[[[6., 8.], [3., 4.]]]])
结果符合预期 当然nn.MaxPool2d()的可接受参数很多完整如下
nn.MaxPool2d(kernel_size,strideNone,padding0,dilation1,return_indicesFalse,ceil_modeFalse) kernel_size设置filter大小 stride控制移动步长默认为kernel_size的尺寸 padding对原始数据周围进行填充 dilation:给原始数据之间添加0 return_indices 如果为True会返回输出最大值对应的序号序列。 ceil_mode控制当卷积核超过原始图像时是否对max进行保留 这里参数很多但很多时候我们并不需要一些参数就像这样
nn.MaxPool2d(kernel_size,stride,padding)
或者这样
nn.MaxPool2d(kernel_size,stride)
当然进行池化操作后我们很可能再来连接一个卷积层或者全连接层所以对数据进行池化后数据的尺寸如何变化是必须要知道的。
公式假设输入的数据H和W相同
输入N,C,H,W
输出N,C,H,W H(H2*padding-kernel_size)/stride1 W(W2*padding-kernel_size)/stride1 再次回到最初的代码 import torch import torch.nn as nn datatorch.tensor([[1,1,2,4],[5,6,7,8],[3,2,1,0],[1,2,3,4]],dtypetorch.float32) data.size()torch.Size([4, 4]) datadata.unsqueeze(0) data.size()torch.Size([1, 4, 4]) datadata.unsqueeze(0) data.size()torch.Size([1, 1, 4, 4])netnn.MaxPool2d(kernel_size2,stride2) endnet(data) endtensor([[[[6., 8.], [3., 4.]]]])
输入1x1x4x4
输出1x1x2x2
2(42*0-2)/21 当然池化种类也有很多但理解起来都不难同时kernel_sizedilation,stridepadding的尺寸也不一定为正方形。