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

时间:2019-04-30 02:52:02

标签: python tensorflow keras tensor

我正在尝试在keras中将jpeg压缩作为噪声层。在实施过程中,我需要更改形状,但我不知道该怎么做。所以我试图解释我做了什么以及我想做什么。首先,在下面的函数中,我生成了一个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_ch32x32x1,而filters64x8x8,我将如何更改形状以实现卷积层?因为这些形状会产生误差。在上述代码中,keras是否将filters形状中的第一个数字视为过滤器的数量,并将8x8视为过滤器的大小?

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

0 个答案:

没有答案