【发布时间】:2019-08-22 09:55:11
【问题描述】:
我的数据预处理中有一个函数,它在 YCbCr 模式下对 3D numpy 数组执行分块 DCT。
def perform_blockwise_dct(img, ratio):
imsize = img.shape
dct_blocks = np.zeros(imsize)
for i in np.r_[:imsize[0]:8]:
for j in np.r_[:imsize[1]:8]:
dct_blocks[i:(i+8),j:(j+8), 0] = dct(dct(img[i:(i+8),j:(j+8), 0].T, norm='ortho').T, norm='ortho')
dct_blocks[i:(i+8),j:(j+8), 1] = dct(dct(img[i:(i+8),j:(j+8), 1].T, norm='ortho').T, norm='ortho')
dct_blocks[i:(i+8),j:(j+8), 2] = dct(dct(img[i:(i+8),j:(j+8), 2].T, norm='ortho').T, norm='ortho')
return dct_blocks
为了能够实现自定义均方误差函数,我想反转这个函数。问题是在实现损失函数时,它是一个张量流张量。有一个逆 DCT 函数可供使用。但是,我不知道如何执行等效的双 for 循环来逐块执行。目前它是在整个图像上完成的,如下所示:
def mse_custom_loss(a, b)
y = tf.spectral.idct(a[:,:,0], norm='ortho')
cb = tf.spectral.idct(a[:,:,1], norm='ortho')
cr = tf.spectral.idct(a[:,:,2], norm='ortho')
a = K.stack([y, cb, cr], axis=-1)
y = tf.spectral.idct(b[:,:,0], norm='ortho')
cb = tf.spectral.idct(b[:,:,1], norm='ortho')
cr = tf.spectral.idct(b[:,:,2], norm='ortho')
b = K.stack([y, cb, cr], axis=-1)
return mean_square_error(a, b)
关于如何正确执行的任何想法?我认为 lambda 函数可能是一种可能性?
【问题讨论】:
-
我对 DCT 或一般的信号处理不是很熟悉,但似乎在
perform_blockwise_dct中您使用dct两次来制作 2D DCT,在mse_custom_loss中您正在使用idct一次,这将为您提供最后一维的一维 IDCT。哪一个是对的?另外,对于损失函数,a和b是单个图像(3D 张量)还是批量图像(4D 张量)? -
没错,它应该是每个通道的 2D DCT。例如形状 (128, 128, 3) 的图像。换句话说,在自定义损失函数中,它应该只是 2D 而不是 1D。关于 a 和 b,这些是单个图像(3D 张量),而不是图像批次。
标签: python loops tensorflow tensor loss-function