Мозаичный тензор Теано

У меня есть два тензора A и B, где первый имеет размер (500,10), а второй - размер (500). Я хочу найти A / B. Я использую обычный оператор /, и компилятор Theano говорит, что они должны быть одинакового размера. Затем я попытался использовать tensor.tile для B, чтобы сделать его того же размера, что и A. Он имеет три параметра (x, reps, ndim). Я пробовал разные значения, и я ограничен этими ограничениями: x.ndim = len(reps) и ndim = len(reps) Тогда, имея эти ограничения, как я могу разбить массив на матрицу?! Это ошибка в Теано?


person iBM    schedule 23.12.2014    source источник


Ответы (1)


Вы можете просто транслировать его, и есть несколько способов сделать это. Возьмем следующий пример

import numpy as np
A = np.arange(1., 5001., 1.).reshape(500, 10)
B = np.arange(1., 501., 1.)

import theano
As = theano.shared(A)
Bs = theano.shared(B)

Надежный способ сделать это — добавить соответствующую ось.

AoverB = A / B[:, np.newaxis]
AoverBalso = A / B.reshape((-1, 1))
AsoverBs = As / Bs.reshape((-1, 1))

Другой способ - использовать тот факт, что существует неявная широковещательная передача, чтобы дополнить первые оси, если они отсутствуют.

AoverBT = A.T / B.T   # no axis was added here
AsoverBsT = As.T / Bs.T

Чтобы показать, что все они вычисляют одно и то же, мы используем numpy.testing

from numpy.testing import assert_array_equal
assert_array_equal(AoverB, AoverBalso)
assert_array_equal(AoverB, AsoverBs.eval())
assert_array_equal(AoverB, AoverBT.T)
assert_array_equal(AoverB, AsoverBsT.T.eval())
person eickenberg    schedule 26.12.2014