似乎使用variable.shape
会提示我:
AttributeError: 'SharedVariable' object has no attribute 'shape'
而theano.tensor.shape(variable)
则会返回shape.0
。
我非常困惑为什么无法获取到形状信息?当我想获取符号变量的形状信息时,也遇到了同样的问题,实在是太奇怪了。
x = T.matrix('x') # 数据以光栅化图像的形式呈现
y = T.ivector('y') # 标签以一维整数向量的形式呈现
layer0_input = x.reshape((batch_size, 1, 28, 28))
在上面的例子中,x(符号变量)已经被重塑为某种形状,如果我无法检索其形状信息而仍然可以为其分配新形状,这对我来说是没有意义的。
回答:
第一个错误可能是由于你试图在数据类型SharedVariable
上而不是在实际的共享变量上评估shape
属性造成的。
否则,获得shape.0
是完全正常的:这是一个表示形状的符号表达式,其在先验上是未知的。一旦你用数据进行评估,你就会看到形状:
import theano
import theano.tensor as T
import numpy as np
s = theano.shared(np.arange(2 * 3 * 5).reshape(2, 3, 5))
print(s.shape) # 给你shape.0
print(s.shape.eval()) # 给你包含2, 3, 5的数组
a = T.tensor3()
print(a.shape) # 给你shape.0
print(a.shape.eval({a: np.arange(2 * 3 * 5).reshape(2, 3, 5).astype(theano.config.floatX)})) # 给你2, 3, 5