Преобразование Theano из столбца TensorType в матрицу TensorType

Я получаю сообщение об ошибке из-за проверок внутри функции сканирования Theano, которые проверяют, используется ли один и тот же тип переменной в нескольких местах. Эта функция не позволяет заменять (N, 1) col TensorType на матрицу (N, 1) (см. ошибку ниже).

Как преобразовать/преобразовать (N, 1) Tensor col TensorType в matrix TensorType?

TypeError: ('The following error happened while compiling the node', forall_inplace,cpu,scan_fn}(TensorConstant{20}, InplaceDimShuffle{1,0,2}.0, IncSubtensor{InplaceSet;:int64:}.0, IncSubtensor{InplaceSet;:int64:}.0, IncSubtensor{InplaceSet;:int64:}.0, TensorConstant{20}, condpred_1_W_ih, condpred_1_W_ho, embedding_1_W, InplaceDimShuffle{x,0}.0, InplaceDimShuffle{x,0}.0, AdvancedIncSubtensor{inplace=False, set_instead_of_inc=True}.0), '\n', "Inconsistency in the inner graph of scan 'scan_fn' : an input and an output are associated with the same recurrent state and should have the same type but have type 'TensorType(int32, matrix)' and 'TensorType(int32, col)' respectively.")

person pir    schedule 17.05.2017    source источник
comment
когда вы объявляете переменные, сделайте их обе col или matrix?   -  person Autonomous    schedule 17.05.2017
comment
Я не объявляю ни одного из них конкретно как col или matrix. Например, это моя инициализация одного из них: K.zeros((self.batch_size, 1), dtype='int32')   -  person pir    schedule 17.05.2017
comment
Похоже, что один из них неявно преобразуется в функции Theano step.   -  person pir    schedule 17.05.2017


Ответы (1)


Вам нужно использовать theano.tensor.patternbroadcast.

Если вы видите здесь , форма fmatrix(?, ?), а форма fcol(?, 1). Смысл ? в том, что измерение может принимать любое значение. Так что форма не является хорошим отличием между fmatrix и fcol. Теперь смотрите в колонке транслируемого. Последнее измерение fmatrix нельзя транслировать, а fcol можно. Таким образом, следующий код должен преобразовывать эти типы.

Преобразуем матрицу в столбец, а затем наоборот.

from theano import tensor as T

x = T.fmatrix('x')
x_to_col = T.patternbroadcast(x, (False, True))
x.type
x_to_col.type

y = T.fcol('y')
y_to_matrix = T.patternbroadcast(y, (False, False))
y.type
y_to_matrix.type

Запустите приведенные выше команды в консоли, чтобы убедиться, что типы данных действительно изменились. Таким образом, вы либо меняете переменную fmatrix, либо переменную fcol.

person Autonomous    schedule 17.05.2017
comment
Не обращайте внимания на мои предыдущие (теперь удаленные) комментарии. Оно работает. Спасибо! - person pir; 17.05.2017
comment
Да. Я так и думал. Я нашел сообщение об ошибке в исходном коде Theano :). Я подумал, может быть, вы неправильно передаете x. - person Autonomous; 17.05.2017
comment
У вас есть хорошая ссылка, где я могу прочитать об интуиции, почему трансляция влияет на интерпретацию тензора как col или matrix? :) Я не могу найти хорошее объяснение на сайте Theano. - person pir; 17.05.2017