#python #numpy #tensorflow
#python #numpy #тензорный поток
Вопрос:
У меня есть tensor_A
с формой (batch_size, x_1, x_2)
и tensor_B
с формой (x_2, x_3)
. Я хотел бы расставить точки над каждым элементом с помощью . tensor_A
tensor_B
Пример этого, не использующий tensordot, выглядит так:
product_tensor = np.zeros((batch_size, x_1, x_3))
for i in range(batch_size):
product_tensor[i] = np.dot(tensor_A[i], tensor_B)
У меня возникли проблемы с определением того, какими axes
должны быть аргументы для параметра. Из того, что я прочитал, axes=1
означает точечное произведение, но я не могу сказать, умножает ли оно первые 2 оси A на B или последние 2 оси A на B.
Я безуспешно пытался tf.tensordot(tensor_A, tensor_B[None, :, :, :], axes=1)
, поскольку казалось tensor_A
, что он принимает форму (batch_size * x_1, x_2)
и tensor_B
форму (1, x_2 * x_3
.
Помощь была бы весьма признательна!
Комментарии:
1.
matmul/@
хорошо обрабатывает пакетную обработку.A@B
.np.einsum
также дает хороший контроль над комбинациями осей.
Ответ №1:
Это должно дать вам желаемый результат:
import numpy as np
a = np.array([
[[1, 2, 3], [4, 5, 6]],
[[1, 2, 3], [4, 5, 6]],
[[1, 2, 3], [4, 5, 6]],
[[1, 2, 3], [4, 5, 6]],
[[1, 2, 3], [4, 5, 6]],
[[1, 2, 3], [4, 5, 6]],
])
b = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
print('a.shape = ', a.shape)
print('b.shape = ', b.shape)
# tensordot
c_tensordot = np.tensordot(a, b, axes=(1))
# loop method with dot
c_loop = np.empty([a.shape[0], a.shape[1], b.shape[1]])
for i in range(0,a.shape[0]):
c_loop[i] = np.dot(a[i], b)
print('c_tensordot = ', c_tensordot)
print('c_loop = ', c_loop)
print('c_tensordot.shape = ', c_tensordot.shape)
print('c_loop.shape = ', c_loop.shape)
print('nAre arrays equal: ', np.array_equal(c_tensordot, c_loop))