roc*_*erd 3 python numpy machine-learning matrix matrix-multiplication
我正在挖出一块numpy代码,而且有一条我完全不懂的线:
W[:, :, None] * h[None, :, :] * diff[:, None, :]
Run Code Online (Sandbox Code Playgroud)
其中W,h和diff是784x20,20x100和784x100矩阵.乘法结果是784x20x100数组,但我不知道这个计算实际上是做什么的,结果是什么意思.
对于它的价值,线是来自机器学习相关代码,W对应于神经网络层的权重数组,h是层激活,diff是网络目标和假设之间的差异(来自 Sida Wang关于转换自动编码器的论文) .
对于NumPy数组,*对应于逐元素乘法.为了使其工作,两个数组必须是:
如果在配对每个阵列的尾随尺寸时,每个对中的长度相等或者长度之一为1,则可以将一个阵列广播到另一个阵列.
例如,以下数组A并B具有与广播兼容的形状:
A.shape == (20, 1, 3)
B.shape == (4, 3)
Run Code Online (Sandbox Code Playgroud)
(3等于3和然后在接下来的长度A是1其可与任何长度配对.不要紧其B具有比尺寸更少A).
为了使两个不兼容的数组彼此可广播,可以将额外的维度插入到一个或两个数组中.使用None或np.newaxis将长度为1的额外维度插入数组中来标注维度.
让我们看一下问题中的例子.Python评估从左到右的重复乘法:
W[:, :, None] 有形状 (784, 20, 1)h[None, :, :] 有形状 ( 1, 20, 100)根据上面的解释,这些形状是可播放的,并且乘法返回具有形状的数组(784, 20, 100).
(784, 20, 100)diff[:, None, :] 有一个形状 (784, 1, 100) 这两个数组的这些形状是兼容的,因此第二次乘法成功.(784, 20, 100)返回具有该形状的数组.