Понимание «оператора двоеточия» Python при суммировании массивов нескольких измерений - PullRequest
0 голосов
/ 16 февраля 2019

У меня, вероятно, простой вопрос о том, как понимать оператор двоеточия при выполнении математических операций над массивами нескольких измерений.

Вот два примера, в которых я совершенно не понимаю, что на самом деле происходит:

dx[:,r:H,c:W] += dout[depth, r, c] * w[depth,:,:,:]

В этом примере мы имеем дело с массивом dx формы (channels, height, width).Например, изображение RGB.dout аналогично, но количество каналов, строк и столбцов отличается от dx.w имеет форму (num, channels, height, width), где channels равно channels в dx.dout s channels равно w s num.

dw[depth,:,:,:] += dout[depth,r,c] * x[:,r:r+HH,c+WW]

Здесь dw имеет форму, идентичную w из предыдущего примера.dout также известно из предыдущего примера.x похоже на dout, но оно channels равно dw channels.

Я не согласен с тем, что происходит с отдельными значениями при выполнении таких операций.Я имею в виду, что это, в общем, просто свертка между различными тензорами, но я в настоящее время не понимаю, как выразить это для циклов for.

1 Ответ

0 голосов
/ 16 февраля 2019

Если предположить, что 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 или другого размера.Но я не вижу такого в ваших примерах, я не буду вдаваться в подробности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...