Трансляция np.dot против tf.matmul для тензорно-матричного умножения (форма должна иметь ранг 2, но является ошибкой ранга 3)

Скажем, у меня есть следующие тензоры:

X = np.zeros((3,201, 340))
Y = np.zeros((340, 28))

Создание скалярного произведения X, Y успешно с numpy и дает тензор формы (3, 201, 28). Однако с тензорным потоком я получаю следующую ошибку: Shape must be rank 2 but is rank 3 error ...

пример минимального кода:

X = np.zeros((3,201, 340))
Y = np.zeros((340, 28))
print(np.dot(X,Y).shape) # successful (3, 201, 28)
tf.matmul(X, Y) # errornous

Есть идеи, как добиться того же результата с тензорным потоком?


person Yuval Atzmon    schedule 25.12.2017    source источник


Ответы (2)


Поскольку вы работаете с tensors, было бы лучше (для производительности) использовать там tensordot, чем np.dot. NumPy позволяет ему (numpy.dot) работать на tensors за счет снижения производительности, и кажется, что tensorflow просто не позволяет.

Итак, для NumPy мы будем использовать np.tensordot< /а> -

np.tensordot(X, Y, axes=((2,),(0,)))

Для tensorflow это будет с tf.tensordot -

tf.tensordot(X, Y, axes=((2,),(0,)))

Связанный пост для понимания tensordot.

person Divakar    schedule 25.12.2017
comment
Хотя ваш ответ, вероятно, работает (я не проверял), чтобы создать кортеж из одного элемента, вы должны сделать (element,). (element) точно такой же, как element, т. е. он не создает кортеж. - person Hameer Abbasi; 25.12.2017
comment
@HameerAbbasi tensordot ожидает кортеж из двух кортежей в качестве параметра оси. Это то, что мы кормим здесь. - person Divakar; 25.12.2017
comment
Именно в этом суть. ((2),(0)) эквивалентно (2, 0), потому что внутренние скобки используются для группировки, а не для создания кортежа. Чтобы создать кортеж из двух кортежей, выполните ((2,),(0,)). - person Hameer Abbasi; 25.12.2017
comment
@HameerAbbasi Ах, я думаю, это работает так же хорошо и с кортежем скаляров для этого особого случая уменьшения по одной оси. - person Divakar; 25.12.2017
comment
ОП здесь: На самом деле, чтобы заставить это работать, мне пришлось использовать ((2,),(0,)) - person Yuval Atzmon; 26.12.2017
comment
@yuval А, хорошо. Отредактированный пост. Спасибо за ответ. - person Divakar; 26.12.2017

Tensorflow не позволяет умножать матрицы с разными рангами, как это делает numpy.

Чтобы справиться с этим, вы можете изменить форму матрицы. По сути, это приводит матрицу, скажем, ранга 3 к матрице ранга 2, «накладывая матрицы» одну поверх другой.

Вы можете использовать это: tf.reshape(tf.matmul(tf.reshape(Aijk,[i*j,k]),Bkl),[i,j,l])

где i, j и k — размеры матрицы один, а k и l — размеры матрицы 2.

Взято с здесь.

person Solver    schedule 25.12.2017