【发布时间】:2020-03-11 20:11:36
【问题描述】:
我正在尝试使用 padding=same(类似于 keras)为 2D 卷积实现 Block Toeplitz 矩阵。我看到、阅读和搜索了很多信息,但我没有得到它的实现。
我引用的一些参考资料(我也在阅读论文,但有人谈论带有填充的 convd,只有完整或有效):
麦克劳伦斯的回答:answer。他从字面上说:“他是用于填充 = 0,但可以通过更改 h_blocks 和 w_blocks 和 W_conv[i+j, :, j, :] 轻松调整。”但我不知道如何实现这种变化。
Warren 的 Weckesser 回答:answer:解释什么是块矩阵。
Salvador 的 Dali 回答:answer:解释了执行 blockTeoeplitz 的 padding="valid" 矩阵的方法,并且, Ali Salehi,解释了 padding="full" 的方法。
修改 McLawrence 答案的代码,我实现了与 keras conv2d with 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
有任何可能有用的论文或参考资料吗?
【问题讨论】:
标签: python tensorflow keras conv-neural-network