如何解决用于数学点积以产生标量的 numpy 函数
问题
在下面的例子中,数学点积使用什么 numpy 函数?
解决方法
定义样本(2,3)数组:
In [299]: dldx = np.arange(6).reshape(2,3)
In [300]: w
Out[300]:
array([[0.1,0.2,0.3],[0.,0.,0. ]])
元素明智的乘法:
In [301]: dldx*w
Out[301]:
array([[0.,0.6],0. ]])
并在最后一个轴(大小为 3)上求和产生一个 2 元素数组:
In [302]: (dldx*w).sum(axis=1)
Out[302]: array([0.8,0. ])
你的 (6) 是第一项,去掉了 0。有人可能会争辩说,在 (5) 中使用点/内部有点草率。
np.einsum
借鉴了物理学的思想,其中维度可能更高。这种情况可以表示为
In [303]: np.einsum('ij,ik->i',dldx,w)
Out[303]: array([1.8,0. ])
inner
和 dot
执行更多我们想要的计算。我们只想要对角线:
In [304]: np.dot(dldx,w.T)
Out[304]:
array([[0.8,0. ],[2.6,0. ]])
In [305]: np.inner(dldx,w)
Out[305]:
array([[0.8,0. ]])
在 matmul/@
术语中,size 2 维度是“批量”维度,因此我们必须添加维度:
In [306]: dldx[:,None,:]@w[:,:,None]
Out[306]:
array([[[0.8]],[[0. ]]])
这是 (2,1,1),所以我们需要挤出 1s。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。