我正在尝试在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_ch
为32x32x1
,而filters
为64x8x8
,我将如何更改形状以实现卷积层?因为这些形状会产生误差。在上述代码中,keras是否将filters
形状中的第一个数字视为过滤器的数量,并将8x8视为过滤器的大小?
我还有另一个问题。如果卷积层产生了我想要的东西,则意味着输出的形状为64x4x4,因为我们知道4x4滤镜的每个元素作为长度为64的矢量是输入图像的8x8块的DCT值,现在我需要重塑形状每个64位向量到8x8块,并将它们彼此并排,并从64x4x4组成32x32x1。但是我真的不知道该怎么办?你对我有什么建议吗?我期待听到您的建议。谢谢。