Есть ли способ оптимизировать их для циклов в numpy? - PullRequest
0 голосов
/ 19 июня 2020

У меня здесь есть код (используется для вычисления градиента) - Примеры значений прокомментированы:

dE_dx_strided = np.einsum('wxyd,ijkd->wxyijk', dE_dy, f)
# dE_dx_strided.shape = (64, 25, 25, 4, 4, 3)

imax, jmax, di, dj = dE_dx_strided.shape[1:5]
# imax, jmax, di, dj = (25, 25, 4, 4)

dE_dx = np.zeros_like(x)
# dE_dx.shape = (64, 28, 28, 3)

for i in range(imax):
    for j in range(jmax):
        dE_dx[:, i:i+di, j:j+dj, :] += dE_dx_strided[:, i, j, ...]

, где dE_dx - интересующий объект, а dE_dx_strided - это 6-тензор, суммируется по "кусочно", эффективно, и это выглядит как операция свертки по осям 1 и 2:

# Verbose convolution operation (not my actual implementation)
for i in range(imax):
    for j in range(jmax):
        # Vaguely similar, but with filter multiplication, and = instead of +=
        y[i, j] = x[i:i+di, j:dj] * f[di, dj] 

Моя первоначальная идея заключалась в том, чтобы сделать все элементы dE_dx_strided, которые должны добавляется к единственному dE_dx[:, i:i+di, j:j+dj, :] l ie по одной оси, а затем суммируется по нему; но я не мог заставить это работать. , шаги и т. д. c.?

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