tensordot на 3-dim x 2-dim

#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))