假设
depth
,
r
和
c
是鳞片,那么
dout[depth, r, c]
是标量(如果
dout
是3D)
dout[depth, r, c] * w[depth,:,:,:]
w[depth, :, :, :]
是从
w
,即,由
深度
索引。这只是标量乘以子数组中的每个元素,生成一个新数组。
dx[:,r:H,c:W] += dout[depth, r, c] * w[depth,:,:,:]
有效地:
dx[:,r:H,c:W] = dx[:, r:H, c:W] + dout[depth, r, c] * w[depth,:,:,:]
dx[:, r:H, c:W]
是一片
dx
类3D
DX
而是沿着第二和第三轴的一个子集。如果切片是正确的,它的形状应该与
w[depth, :,:,:]
我看不到任何花哨的广播或特别行动。它只是从每个数组中提取匹配的大小部分,添加它们并将值放回正确的块中
DX
.
颜色运算符只是基本的numpy索引运算符。
dx.shape (channels, height, width)
dout.shape (num, m , k)
w.shape (num, channels, height, width)
有了三维索引,
dout[depth, r, c]
形状
杜特
没关系。这只是一个值。
In [295]: 10 * np.arange(12).reshape(3,4)
Out[295]:
array([[ 0, 10, 20, 30],
[ 40, 50, 60, 70],
[ 80, 90, 100, 110]])
与标量相乘可以被认为是与充满该值的匹配数组相乘
In [297]: np.full((3,4),10)
Out[297]:
array([[10, 10, 10, 10],
[10, 10, 10, 10],
[10, 10, 10, 10]])
广播规则使得做同样的事情成为可能,但是使用1d、2d或其他大小的数组。但我在你的例子中看不到这种情况,我在这里就不谈了。