如何使用 1000 个不同的(8,16)权重矩阵将 8 个元素向量中的 100 个转换为 10 个 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 中查看了 dot、tensordot、einsum 和 matmul,但我仍然不确定哪个是正确的选择。
编辑:我刚刚意识到我实际上想在对点积求和之前产生一个中间结果:(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。
根据@Divakarnp.einsum('jk,ijkl->ijl', V, W.reshape(10,100,8,16))
的评论,可以解决问题。