Как преобразовать 100 из 8 векторов элементов в 10 16 векторов элементов, используя 1000 различных (8,16) весовых матриц? Каждый из 10 выходных векторов представляет собой сумму 100 скалярных произведений:
A = np.random.randn(100,8)
W = np.random.randn(1000,8,16)
B = []
for i in range(10):
sum = np.zeros((1,16))
for j in range(100):
sum += np.dot(A[j], W[i*100+j])
B.append(sum)
B = np.asarray(B) #B.shape=(10,16)
Есть ли для этого функция в Numpy или TensorFlow? Я посмотрел на точку, тензордот, эйнсум и матмул в Numpy, и я до сих пор не уверен, какой из них правильный.
РЕДАКТИРОВАТЬ: я только что понял, что на самом деле хочу получить промежуточный результат перед суммированием точечных произведений: (100,8)x(10 100,8,16) -> (10 100,16).
Я предполагаю, что это можно сделать, изменив форму (100,8) на (1,100,1,8) и (1000,8,16) на (10,100,8,16) и выполнив np.einsum('ijkl,ijlm->ijm', A, B)
Но я не уверен, что он будет правильно транслировать от 1 до 10.
Согласно комментарию @Divakar, np.einsum('jk,ijkl->ijl', V, W.reshape(10,100,8,16))
делает свое дело.