我正在尝试将 jpeg 压缩实现为 keras 中的噪声层。在我的实现过程中,我需要改变形状,我很困惑如何才能做到这一点。所以我尝试解释我做了什么以及我想做什么。首先,在下面的函数中,我生成了 8x8 块的所有 DCT 系数,该块生成形状为 64x8x8 的滤波器。这 64 个滤波器中的每一个都是最终 DCT 变换输出中一个像素的 DCT 系数。
def gen_filters(size_x: int, size_y: int, dct_or_idct_fun: callable) -> np.ndarray:
tile_size_x = 8
filters = np.zeros((size_x * size_y, size_x, size_y))
for k_y in range(size_y):
for k_x in range(size_x):
for n_y in range(size_y):
for n_x in range(size_x):
filters[k_y * tile_size_x + k_x, n_y, n_x] = dct_or_idct_fun(n_y, k_y, size_y) * dct_or_idct_fun(n_x,
k_x,
size_x)
return filters
因为我们不能在 keras 中使用赋值,所以我必须使用以下代码使用卷积层来实现 DCT 变换。
image_conv = Kr.backend.conv2d(image_yuv_ch,filters,strides=(8,8),data_format='channels_first')
但我对上面的代码有一些问题。如果输入image_yuv_ch
was 32x32x1
和filters
was 64x8x8
,我将如何改变形状以实现卷积层?因为这些形状会产生错误。 keras 是否考虑中的第一个数字filters
在上面的代码中, 的形状是滤波器的数量, 8x8 是滤波器的大小?
我还有另一个问题。如果卷积层产生了我想要的东西,意味着输出形状为 64x4x4,因为我们知道 4x4 滤波器的每个元素作为长度为 64 的向量是输入图像的 8x8 块的 DCT 值,现在我需要重塑将每个 64 个向量分解为 8x8 块,并将它们并排放置,将 64x4x4 变成 32x32x1。但我真的不知道我该怎么做?你对我有什么建议吗?我期待听到您的建议。谢谢。