为什么Theano的conv2d会添加空维度?
我在玩一些简单的Theano代码时,遇到了以下情况:
import numpy
import theano
from theano import tensor
from theano.tensor.signal.conv import conv2d
m = tensor.fmatrix()
w = numpy.ones([10,1], dtype=numpy.float32)
c = conv2d(m,w)
f = theano.function([m], c)
print f(numpy.ones([100,100], dtype=numpy.float32)).shape
结果是:
(1, 91, 100)
本来对2D输入进行2D卷积,结果应该是2D的,但实际上却是3D的。为什么会这样呢?
1 个回答
2
conv2d
的文档说明说,signal.conv.conv2d对输入进行基本的2D卷积,使用的是给定的滤波器。(注意这里是复数形式)
你可以传入多个滤波器,它会返回所有这些滤波器的卷积结果。比如可以尝试:
c = conv2d(m,np.array([w, w, w]))
f = theano.function([m], c)
print f(numpy.ones([100,100], dtype=numpy.float32)).shape # outputs (3, 91, 100)
所以看起来,如果你只传入一个滤波器,它默认会添加一个额外的维度(可能是因为如果你没有以那种方式传入,内部会自动为你的滤波器添加这个维度。换句话说,它并不会跟踪输入的形状,以便返回相应的结果。这看起来更像是一种设计选择,而不是其他原因。)