原文章链接
Torch nn模块中包含了常用的卷积层(convolutional layers),本文简单介绍其中两个名字很相似,作用却不同的卷积操作:
Spatial Modules:
SpatialConvolution: 在输入图像上进行2D卷积操作(2D convolution)
SpatialFullConvolution: 在输入图像上进行2D全卷积操作(2D full convolution)
逐一来看两个卷积操作的定义:
1.SpatialConvolution
module = nn.SpatialConvolution(nInputPlane, nOutputPlane, kW, kH, [dW], [dH], [padW], [padH])
对于多通道的图像进行2D卷积操作,输入的对象(称为tensor)为3D tensor(nInputPlane x height x width), 其中nInputPlane也就是常说的通道数。
函数中各参数的含义为:
nInputPlane: 输入图像的通道数
nOutputPlane: 卷积层输出数据的通道数(Caffe中的num_output)
kW: 卷积核窗口宽度
kH: 卷积核窗口长度
dW: 卷积窗口沿宽边方向上的移动步距,默认值为1
dH: 卷积窗口沿长边方向上的移动步距,默认值为1
padW, padH: 输入补零,默认值是0,比较好的设置是(kW-1)/2,可以保证卷积后feature map的plane size与输入的plane size一致。
对于一个3D tensor(nInputPlane x height x width),卷积层输出的feature map的plane size为nOutputPlane x oheight x owidth ,其中:
owidth = floor((width + 2*padW - kW) / dW + 1)
oheight = floor((height + 2*padH - kH) / dH + 1)
2.SpatialFullConvolution
module = nn.SpatialFullConvolution(nInputPlane, nOutputPlane, kW, kH, [dW], [dH], [padW], [padH], [adjW], [adjH])
咋一看与SpatialConvolution基本一致,只是多了两个参数而已。在其他框架下,这一操作相当于: “In-network Upsampling”, “Fractionally-strided convolution”, “Backwards Convolution,” “Deconvolution”, or “Upconvolution.”
简单说,就是一个去卷积或者上采样的操作,函数的大部分参数与SpatialConvolution一样:
nOutputPlane: 卷积层输出数据的通道数(Caffe中的num_output)
kW: 卷积核窗口宽度
kH: 卷积核窗口长度
dW: 卷积窗口沿宽边方向上的移动步距,默认值为1
dH: 卷积窗口沿长边方向上的移动步距,默认值为1
padW, padH: 输入补零,默认值是0,比较好的设置是(kW-1)/2,可以保证卷积后feature map的plane size与输入的plane size一致
adjW: 额外加上一定的宽度或者高度到输出图像中,默认值是0,但是不能超过dW-1/dH-1。
与SpatialConvolution不同的是,对于同样的3D tensor(nInputPlane x height x width)输入,输出结果(nOutputPlane x oheight x owidth)的计算方式却不相同:
owidth = (width - 1) * dW - 2*padW + kW + adjW
oheight = (height - 1) * dH - 2*padH + kH + adjH