为什么Theano的conv2d会添加空维度?

1 投票
1 回答
650 浏览
提问于 2025-04-18 08:10

我在玩一些简单的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)

所以看起来,如果你只传入一个滤波器,它默认会添加一个额外的维度(可能是因为如果你没有以那种方式传入,内部会自动为你的滤波器添加这个维度。换句话说,它并不会跟踪输入的形状,以便返回相应的结果。这看起来更像是一种设计选择,而不是其他原因。)

撰写回答