У меня здесь есть код (используется для вычисления градиента) - Примеры значений прокомментированы:
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.?