如何将形状为 64x4x4x3 的张量的形状更改为与网络输入相同的另一个形状?

2024-01-28

我正在尝试将 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 32x32x1filters was 64x8x8,我将如何改变形状以实现卷积层?因为这些形状会产生错误。 keras 是否考虑中的第一个数字filters在上面的代码中, 的形状是滤波器的数量, 8x8 是滤波器的大小?

我还有另一个问题。如果卷积层产生了我想要的东西,意味着输出形状为 64x4x4,因为我们知道 4x4 滤波器的每个元素作为长度为 64 的向量是输入图像的 8x8 块的 DCT 值,现在我需要重塑将每个 64 个向量分解为 8x8 块,并将它们并排放置,将 64x4x4 变成 32x32x1。但我真的不知道我该怎么做?你对我有什么建议吗?我期待听到您的建议。谢谢。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将形状为 64x4x4x3 的张量的形状更改为与网络输入相同的另一个形状? 的相关文章

随机推荐