在没有中出错张量零点()和张量形状()作为arg

2024-04-16 07:45:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着做一个T.zeros()的简单操作,把两个向量的形状之差作为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\u sub的输出。那么我该如何实现这段代码呢?我不能在这里使用T.zeros_like(),因为它把整个张量作为输入,而不是它的形状。你知道吗

解决这个问题的唯一方法是使用shape\u sub的值的共享变量,对其求值,然后将其馈送给T.zeros()函数,但这似乎不是很有效。你知道吗


Tags: importid参数aszerostheano向量形状
1条回答
网友
1楼 · 发布于 2024-04-16 07:45:15

这个问题的核心是,在编译时:

  • Theano必须知道张量秩。你知道吗
  • 西亚诺对张量形状中的确切数字一无所知。[1]

我认为这是一个缺陷,与张量流中的静态张量形状相反。你知道吗

在代码中,no知道shape_sub是一个向量,但不知道向量的长度。因此它不能确定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,但仅此而已。你知道吗

相关问题 更多 >