Два 4D матовые NUMPY и должны ожидать выхода 5D - PullRequest
0 голосов
/ 30 ноября 2018

Я хочу применить веса внимания (5 меток) к моей свертке с 3 фильтрами, может ли какой-нибудь помочь мне сделать, как применить matmul.Ценится, если вы также предоставите версию tenorflow.

import numpy as np
conv = np.random.randint(10,size=[1,3,2,2], dtype=int) # [batches,filter,row,col]
attention = np.random.randint(5,size=[1,5,2,1], dtype=int) # [batches,label,row,col]
np.matmul(conv,attention).shape # expected output size [1,3,5,2,1] [batches,filter,label,row,col]

ValueError: operands could not be broadcast together with remapped shapes [original->remapped]: (1,3,2,2)->(1,3,2,newaxis,2) (1,5,2,1)->(1,5,newaxis,1,2) 

1 Ответ

0 голосов
/ 30 ноября 2018

Согласно документам matmul:

Если любой из аргументов равен ND, N> 2, он рассматривается как стек матриц, находящихся в последних двухиндексы и трансляция соответственно.

и

Стеки матриц передаются вместе, как если бы матрицы были элементами.

Это означает, что вВ вашем случае все, кроме двух последних измерений, должны совпадать.Если вы хотите, чтобы выходная форма была 1, 3, 5, 2, 1, вам нужно явно вставить пустую ось в каждый массив.Вы можете сделать это во время создания:

import numpy as np
conv = np.random.randint(10, size=[1, 3, <b>1,</b> 2, 2], dtype=int)
attention = np.random.randint(5, size=[1, <b>1,</b> 5,2,1], dtype=int)
np.matmul(conv,attention).shape

В качестве альтернативы, вы можете сделать вставку явной, умножив представления на соответствующие вставки:

np.matmul(conv[:, :, np.newaxis, ...], attention[:, np.newaxis, ...]).shape
...