Сверточный слой в Python с использованием Numpy - с Strides

Мой вопрос тесно связан с этим, из которого я скопировал определение: Сверточный слой в 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? Как упоминалось выше, я понимаю форму вывода, но не шаги.


person EliteKaffee    schedule 26.12.2020    source источник
comment
Что подразумевается под переменным шагом? Просто другое значение, чем 1?   -  person hpaulj    schedule 27.12.2020
comment
Да, точно! Я хочу, чтобы он работал для любого допустимого значения S   -  person EliteKaffee    schedule 27.12.2020
comment
Чтобы ответить на этот вопрос, я бы сделал небольшой a и попробовал бы альтернативные формы и шаги as_strided. Хотя у меня есть некоторый опыт в этом, он достаточно далек, чтобы мне приходилось совмещать рассуждения с методом проб и ошибок.   -  person hpaulj    schedule 27.12.2020
comment
Есть ли шанс, что вы могли бы попробовать? Я заставляю работать формы, но не значения   -  person EliteKaffee    schedule 27.12.2020


Ответы (1)


Вы можете использовать приведенную ниже реализацию. Аргумент s представляет значение шага.

from numpy.lib.stride_tricks import as_strided

def conv2d(a, b, s=1):
    Hout = (a.shape[1] - b.shape[0]) // s + 1
    Wout = (a.shape[2] - b.shape[1]) // s + 1
    Stride = (a.strides[0], a.strides[1] * s, a.strides[2] * s, a.strides[1], a.strides[2], a.strides[3])

    a = as_strided(a, (a.shape[0], Hout, Wout, b.shape[0], b.shape[1], a.shape[3]), Stride)

    return np.tensordot(a, b, axes=3)

# test
conv2d(x, kernel, 2)
person ismail durmaz    schedule 29.12.2020
comment
Спасибо, это работает! - person EliteKaffee; 31.12.2020