Если предположить, что depth
, r
и c
являются скалярами, то
dout[depth, r, c]
является скаляром (если dout
равно 3d)
dout[depth, r, c] * w[depth,:,:,:]
w[depth, :, :, :]
- это трехмерный массив, вырезанный из w
, то есть подмассива, выбранного индексом depth
.Это просто скалярное время каждого элемента этого подмассива, создающего новый массив.
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
, но подмножество по 2-й и 3-й осям.Если срезы правильные, их форма должна соответствовать форме w[depth, :,:,:]
. Я не вижу каких-либо необычных трансляций или специальных операций.Он просто берет части подходящего размера из каждого массива, добавляет их и помещает значения обратно в правый блок в dx
.
. Операторы цвета - это просто основные операторы индексирования.
dx.shape (channels, height, width)
dout.shape (num, m , k)
w.shape (num, channels, height, width)
При трехмерном индексировании dout[depth, r, c]
форма dout
не имеет значения.Это всего лишь одно значение.
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 или другого размера.Но я не вижу такого в ваших примерах, я не буду вдаваться в подробности.