pytorch - PyTorch 中的可微分图像压缩操作

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

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

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

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

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

最佳答案

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


如果您确实需要区分不同的图像压缩器,您可能会考虑比 JPEG 更容易实现的编解码器。基于小波的压缩(不幸的 JPEG 2000 format 背后的技术)在数学上是优雅的并且易于区分。在该技术的最近应用中,Thies et al. 2019将图像表示为拉普拉斯金字塔,其损失分量用于在更高分辨率的水平上强制稀疏。


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

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

  • 色度下采样:在色度 channel 上使用 torch.nn.function.interpolate 就足够简单了。

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

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

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

    <

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

关于pytorch - PyTorch 中的可微分图像压缩操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61132905/

相关文章:

python - 什么是批量收集的聪明方法?

pytorch - torch.where 中的标量类型?

deep-learning - 对 PyTorch RNN/LSTM 使用 SHAP 值

neural-network - 在pytorch中执行卷积(不互相关)

python - Tensorflow 2.0 不计算梯度

python - 如何将 PyTorch 张量的每一行中的重复值清零?

python - 无法在Python中进行OpenCV的人脸检测

machine-learning - 卷积核的形状和数量是动态的可能/实用吗?

machine-learning - CartPole 任务的最佳目标函数是什么?

python批量梯度下降不收敛