Theano 中的错误 tensor.zeros() 和 tensor.shape() 作为 arg
Error in Theano with tensor.zeros() and tensor.shape() as arg
我正在尝试做一个简单的 T.zeros()
操作,将 2 个向量的形状之间的差异作为 Theano 中的参数。
像这样:
import theano as theano
import theano.tensor as T
x1 = T.ivector('x1')
x2 = T.ivector('x2')
shape_sub = T.sub(T.shape(x1),T.shape(x2))
zeros = T.zeros(shape_sub)
f = theano.function([x1, x2], zeros)
但是我收到一个值错误
ValueError: length not known: Elemwise{sub,no_inplace} [id A] ''
|Shape [id B] ''
| |x1 [id C]
|Shape [id D] ''
|x2 [id E]
这可能是因为 T.zeros() 的参数必须是包含形状的元组或列表,而不是包含减去形状的 ivector tensorType
,后者是 shape_sub 的输出.但是我应该如何实现这段代码呢?我不能在这里使用 T.zeros_like()
因为它需要整个张量作为输入,而不是它的形状。
我能想到的解决这个问题的唯一方法是对 shape_sub 的值使用一个共享变量,对其求值,然后提供给 T.zeros()
函数,但它没有看起来很有效率。
这个问题的核心是,在编译时:
- Theano 必须知道张量秩。
- Theano 对张量形状的确切数字一无所知。 [1]
我认为这是一个缺陷,与 Tensorflow 中的静态张量形状相反。
在你的代码中,Theano 知道 shape_sub
是一个向量,但不知道向量的 length。因此它无法确定 zeros
调用的等级。 (实际上它应该知道,但是由于内部缺陷它只是忘记了该信息)
您可以使用此代码得到相同的错误:
shp = T.ivector()
zs = T.zeros(shp)
一种可能的解决方案是对其进行硬编码:
x1_shp = T.shape(x1)
x2_shp = T.shape(x2)
assert x1.ndim == x2.ndim
zeros = T.zeros([x1_shp[i] - x2_shp[i] for i in range(x1.ndim)])
[1] 实际上 Theano 知道广播维度,所以可以判断形状中哪些轴的大小为 1
,但仅此而已。
我正在尝试做一个简单的 T.zeros()
操作,将 2 个向量的形状之间的差异作为 Theano 中的参数。
像这样:
import theano as theano
import theano.tensor as T
x1 = T.ivector('x1')
x2 = T.ivector('x2')
shape_sub = T.sub(T.shape(x1),T.shape(x2))
zeros = T.zeros(shape_sub)
f = theano.function([x1, x2], zeros)
但是我收到一个值错误
ValueError: length not known: Elemwise{sub,no_inplace} [id A] ''
|Shape [id B] ''
| |x1 [id C]
|Shape [id D] ''
|x2 [id E]
这可能是因为 T.zeros() 的参数必须是包含形状的元组或列表,而不是包含减去形状的 ivector tensorType
,后者是 shape_sub 的输出.但是我应该如何实现这段代码呢?我不能在这里使用 T.zeros_like()
因为它需要整个张量作为输入,而不是它的形状。
我能想到的解决这个问题的唯一方法是对 shape_sub 的值使用一个共享变量,对其求值,然后提供给 T.zeros()
函数,但它没有看起来很有效率。
这个问题的核心是,在编译时:
- Theano 必须知道张量秩。
- Theano 对张量形状的确切数字一无所知。 [1]
我认为这是一个缺陷,与 Tensorflow 中的静态张量形状相反。
在你的代码中,Theano 知道 shape_sub
是一个向量,但不知道向量的 length。因此它无法确定 zeros
调用的等级。 (实际上它应该知道,但是由于内部缺陷它只是忘记了该信息)
您可以使用此代码得到相同的错误:
shp = T.ivector()
zs = T.zeros(shp)
一种可能的解决方案是对其进行硬编码:
x1_shp = T.shape(x1)
x2_shp = T.shape(x2)
assert x1.ndim == x2.ndim
zeros = T.zeros([x1_shp[i] - x2_shp[i] for i in range(x1.ndim)])
[1] 实际上 Theano 知道广播维度,所以可以判断形状中哪些轴的大小为 1
,但仅此而已。