【问题标题】:Differentiable image compression operations in PyTorchPyTorch 中的可微分图像压缩操作
【发布时间】:2020-07-22 18:23:43
【问题描述】:

在 CNN 分类模型训练期间计算损失时,我在 PyTorch 中对图像应用编码 jpeg 压缩。虽然我调用 loss.backward() 它还必须通过对图像执行的编码和压缩操作进行反向传播。

这些压缩算法(例如编码和 JPEG 压缩)是否可区分,否则如何通过这些操作反向传播损失梯度?

如果这些操作不可微,那么 PyTorch 中是否存在执行 H.264 编码和 JPEG 压缩的可微压缩算法?

任何建议都会非常有帮助。

【问题讨论】:

  • 我不知道 JPEG 压缩是否可以区分,但如果压缩是由外部算法执行的(不是在 PyTorch 框架内编写,使用 pytorch 张量等),那么你将没有渐变。
  • 如果在 nn.functional 模块中由 pytorch 的可微操作集合执行,操作将是可微的。为什么你甚至想通过编码进行反向传播?您是在输入图像上应用它们,还是在中间特征图上应用它们?如果是前者,那么只需使用 jpeg 压缩作为预处理技术。您不需要反向传播,因为没有要更新的权重。如果是后一种情况,您可能需要实现自己的可微分 autograd 函数。看到这个:pytorch.org/tutorials/beginner/examples_autograd/…

标签: pytorch conv-neural-network gradient-descent image-compression


【解决方案1】:

首先,请仔细考虑是否需要在 JPEG 压缩步骤中进行区分。绝大多数项目在此步骤中没有区别,如果您不确定是否需要,您可能不需要。


如果您确实需要区分图像压缩器,您可以考虑使用比 JPEG 更容易实现的编解码器。基于小波的压缩(命运多舛的JPEG 2000 format 背后的技术)在数学上很优雅,很容易区分。在这项技术的最新应用中,Thies et al. 2019 将图像表示为拉普拉斯金字塔,具有用于在更高分辨率级别强制稀疏的损失组件。


现在,作为一个思想实验,我们可以查看different steps within JPEG compression 并确定它们是否可以以可区分的方式实现。

  • 颜色变换(RBG 到 YCbCr):我们可以将其表示为逐点卷积。

  • 色度下采样:在色度通道上使用torch.nn.functional.interpolate 非常简单。

  • 离散余弦变换 (DCT): 现在事情变得有趣了。这是一个可能有效的 DCT 的 Pytorch 实现:https://github.com/zh217/torch-dct

  • 量化表:又简单了。这应该只是将 DCT 的输出与表中的值相乘。

  • 霍夫曼编码:硬;我不确定这是可能的。输出元素的数量将根据图像熵而变化,这排除了许多可区分的构建块。根据您的应用程序,您可能可以跳过此步骤(此步骤是无损压缩;因此,如果您尝试区分 JPEG 引入的压缩伪影,前面的步骤就足够了)。

    李>

有关将 JPEG DCT 分量直接输入神经网络的有趣相关工作,请参阅Faster Neural Networks Straight from JPEG

【讨论】:

    猜你喜欢
    • 2020-12-30
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 2015-01-05
    • 1970-01-01
    • 2020-02-29
    相关资源
    最近更新 更多