2D свертка с заполнением = то же самое с помощью умножения матрицы Теплица - PullRequest
0 голосов
/ 11 марта 2020

Я пытаюсь получить матрицу Блока Теплица для двумерной свертки с отступом = то же самое (аналогично керасу). Я видел, читал и искал много информации, но я не получил ее реализацию.

Некоторые ссылки, которые я взял (также я читаю статьи, но кто-то говорит о 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

Любой документ или справка, которая может быть полезна?

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