Я пытаюсь получить матрицу Блока Теплица для двумерной свертки с отступом = то же самое (аналогично керасу). Я видел, читал и искал много информации, но я не получил ее реализацию.
Некоторые ссылки, которые я взял (также я читаю статьи, но кто-то говорит о convd с padding, только полный или действительный):
ответ Маклауренса: ответ . Он буквально говорит: «он предназначен для заполнения = 0, но его можно легко откорректировать, изменив h_blocks и w_blocks и W_conv [i + j,:, j,:]». Но я не знаю, как реализовать эти изменения.
Ответ Уоррена-Веккессера: ответ : Объясняет, что такое блочная матрица.
Ответ Сальвадора Дали: ответ : Объясняет метод выполнения матрицы blockTeoeplitz для padding = "valid", а также, Али Салехи, объясняет метод для padding = "full".
Модифицируя код ответа Маклауренса, я достиг того же результата, что keras conv2d с padding = "same", но только для размера ядра 2x2 и квадратной входной матрицы. Код:
k_h, k_w = kernel.shape
i_h, i_w = input.shape
o_h, o_w = input.shape
s_c = o_h-o_w
# construct 1d conv toeplitz matrices for each row of the kernel
toeplitz = []
for r in range(k_h):
toeplitz.append(linalg.toeplitz(c=(kernel[r,0], *np.zeros(i_w-1)), r=(*kernel[r], *np.zeros(i_w-k_w))) )
# construct toeplitz matrix of toeplitz matrices (just for padding=0)
h_blocks, w_blocks = input.shape
h_block, w_block = toeplitz[0].shape
W_conv = np.zeros((h_blocks, h_block, w_blocks, w_block))
for i, B in enumerate(toeplitz):
for j in range(o_h):
if i == len(toeplitz)-1 and j == o_h-1:
continue
W_conv[j, :, i+j, :] = B
W_conv.shape = (h_blocks*h_block, w_blocks*w_block)
return W_conv
Любой документ или справка, которая может быть полезна?