Мой вопрос тесно связан с этим, из которого я скопировал определение: Сверточный слой в Python используя Numpy.
Я пытаюсь реализовать сверточный слой в Python с помощью Numpy. Входными данными является 4-мерный массив формы [N, H, W, C], где:
- N: размер партии
- H: высота изображения
- W: Ширина изображения
- C: количество каналов
Сверточный фильтр также представляет собой 4-мерный массив формы [F, F, Cin, Cout], где
- F: высота и ширина квадратного фильтра.
- Cin: количество входных каналов (Cin = C)
- Cout: количество выходных каналов
Без заполнения и шага S на выходе должен быть 4-мерный массив формы [N, (H - F + 1) // S, (W - F + 1) // S, Cout].
Для фиксированного шага S = 1 это можно эффективно сделать с помощью следующего кода:
from numpy.lib.stride_tricks import as_strided
def conv2d(a, b):
Hout = a.shape[1] - b.shape[0] + 1
Wout = a.shape[2] - b.shape[1] + 1
a = as_strided(a, (a.shape[0], Hout, Wout, b.shape[0], b.shape[1], a.shape[3]), a.strides[:3] + a.strides[1:])
return np.tensordot(a, b, axes=3)
Может ли кто-нибудь помочь мне в реализации переменного шага S? Как упоминалось выше, я понимаю форму вывода, но не шаги.
a
и попробовал бы альтернативные формы и шагиas_strided
. Хотя у меня есть некоторый опыт в этом, он достаточно далек, чтобы мне приходилось совмещать рассуждения с методом проб и ошибок. - person hpaulj   schedule 27.12.2020