2015-12-18 4 views
3

Я не понимаю, зачем нам нужна tensor.reshape() функция в Theano. Об этом говорится в документации:Зачем нам нужно преобразовать Теано?

Returns a view of this tensor that has been reshaped as in 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]]))) 

Как я понял, он должен дать ошибку, так как я прошел матрицу 2х2 не 3х3, но он вычисляет поэлементно квадратов отлично.

Итак, какова форма переменной тензора anano и где ее использовать?

ответ

2

Приведенный код содержит сообщение об ошибке, согласно которой Theano не указывает это.

Вместо

f = theano.function([X_resh], Y) 

вы действительно должны использовать

f = theano.function([X], Y) 

Используя исходный код, который вы на самом деле обеспечения тензор после RESHAPE поэтому команда Reshape никогда не запускается на выполнение. Это можно увидеть, добавив

theano.printing.debugprint(f) 

который печатает

Elemwise{sqr,no_inplace} [id A] '' 0 
|<TensorType(float64, matrix)> [id B] 

Обратите внимание, что не существует никакой операции Reshape в этом скомпилированного выполнения графа.

Если один изменяет код так, что X используется в качестве входа вместо X_resh затем Теано выдает ошибку включая сообщение

ValueError: total size of new array must be unchanged Apply node that caused the error: Reshape{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 
Смежные вопросы