为什么我们需要Theano重塑?

时间:2015-12-18 18:23:35

标签: theano

我不明白为什么我们在 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变量的形状是什么?我们应该在哪里使用它?

1 个答案:

答案 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