我不明白为什么我们在 Theano 中需要tensor.reshape()
功能。在文档中说:
返回已经重新整形的张量视图,如下所示 numpy.reshape。
据我所知,theano.tensor.var.TensorVariable
是一些用于计算图创建的实体。它完全独立于形状。例如,当您创建函数时,您可以传递矩阵2x2或矩阵100x200。正如我认为重塑某种方式限制了这种变化。但事实并非如此。假设以下示例:
X = tensor.matrix('X')
X_resh = X.reshape((3, 3))
Y = X_resh ** 2
f = theano.function([X_resh], Y)
print(f(numpy.array([[1, 2], [3, 4]])))
据我了解,它应该给出一个错误,因为我传递矩阵2x2而不是3x3,但它完全计算了元素方块。
那么theano tensor变量的形状是什么?我们应该在哪里使用它?
答案 0 :(得分:2)
虽然Theano未能指出这一点,但提供的代码中存在错误。
而不是
f = theano.function([X_resh], Y)
你应该真的使用
f = theano.function([X], Y)
使用原始代码,您实际上在重塑之后提供张量,因此重塑命令永远不会被执行。这可以通过添加
来看出theano.printing.debugprint(f)
打印
Elemwise{sqr,no_inplace} [id A] '' 0
|<TensorType(float64, matrix)> [id B]
请注意,此编译的执行图中没有重新整形操作。
如果更改代码以便将X
用作输入而不是X_resh
,则Theano会抛出错误,包括消息
ValueError:新数组的总大小必须不变应用节点 导致错误:重塑{2}(X,TensorConstant {(2L,)of 3})
这是预期的,因为人们无法将形状为(2, 2)
(即4个元素)的张量重塑为形状为(3, 3)
的张量(即9个元素)。
为了解决更广泛的问题,我们可以在目标形状中使用符号表达式,这些表达式可以是输入张量符号形状的函数。以下是一些例子:
import numpy
import theano
import theano.tensor
X = theano.tensor.matrix('X')
X_vector = X.reshape((X.shape[0] * X.shape[1],))
X_row = X.reshape((1, X.shape[0] * X.shape[1]))
X_column = X.reshape((X.shape[0] * X.shape[1], 1))
X_3d = X.reshape((-1, X.shape[0], X.shape[1]))
f = theano.function([X], [X_vector, X_row, X_column, X_3d])
for output in f(numpy.array([[1, 2], [3, 4]])):
print output.shape, output