End-to-end training

文章讨论了传统图像识别中的多步骤方法与深度学习的端到端学习的区别。端到端学习通过深度神经网络直接从原始数据学习期望输出,简化了工程复杂度,但也带来了模型解释性和灵活性的降低,以及贡献分配的困难。相比之下,多步骤模型虽然可能导致误差累积和目标不一致,但每个模块的性能更易评估。

版权声明:本文为优快云博主「贱小杜」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/qq_41088475/article/details/105781944

非端到端:使用多步骤多模型(传统的流水线型设计)

传统的图像识别问题往往通过分治法将其分解为预处理,特征提取和选择,分类器设计等若干步骤。分治法的动机是将图像识别的母问题分解为简单、可控且清晰的若干小的子问题。不过分步解决子问题时,尽管可以在子问题上得到最优解,但子问题上的最优解并不意味着就能得到全局问题的最后解。使用多步骤、多模型解决一个复杂任务的时候,一个明显的弊端是各个模块训练目标不一致,某个模块的目标函数可能与系统的宏观目标有偏差,这样训练出来的系统最终很难达到最优的性能;另一个问题是误差的累积,前一模块产生的偏差可能影响后一个模块。

端到端

深度学习提供了一种端到端的学习范式,整个学习的流程并不进行人为的子问题划分,而是完全交给深度学习模型直接学习从原始数据到期望输出的映射。 对深度模型而言,其输入数据是未经任何人为加工的原始样本形式,后续则是堆叠在输入层上的众多操作层,这些操作层整体可以看作一个复杂的函数FCNN, 最终的损失函数由数据损失data loss和模型参数的正则化损失(regularization loss)共同组成, 模型深度的训练则是在最终损失驱动下对模型进行参数更新并将误差反向传播至网络各层。

端到端的优势

端到端模型仅使用一个模型、一个目标函数,就规避了前面的多模块固有的缺陷,这是它的优点之一;另一个优势是减少了工程的复杂度,一个网络解决所有步骤,也就是「炼丹」。

端到端的劣势

端到端模型的一个劣势,就是贡献分配问题,这也是深度学习的一个弊病。在多模块解决方案中,我们可以比较清晰地看到检测每一个模块的性能,也就是贡献;而在端到端模型中,我们很难确定模型中「组件」对最终目标的贡献是什么样的。换一句话说,模型变得更加「黑盒」了,也就降低了网络的可解释性。另外,端到端模型的灵活性也更低,比如原本的多个模块中数据的获取难度不一样的时候,可能不得不依靠额外的模型来协助训练。

### 端到端优化的图像压缩技术 端到端优化的图像压缩方法通过神经网络模型实现,旨在直接学习输入图像与压缩表示之间的映射关系。这种方法不同于传统的基于手工设计特征的方法,而是利用深度学习框架自动提取有用的表征。 #### 方法概述 现代端到端图像压缩方案通常采用编码器-解码器架构,在此结构中: - **编码器**负责将原始高维数据转换成低维度紧凑表达形式; - **解码器**则尝试从未完全无损的信息恢复尽可能接近原图的内容; 为了使整个过程可微分以便于训练,研究者们引入了量化噪声模拟离散化操作的影响[^1]。具体来说就是在前向传播过程中加入随机扰动来近似实际应用中的二值化或整数化步骤。 此外,一些工作还探索了如何更好地平衡率失真性能(rate-distortion tradeoff),即在给定比特率下达到最优视觉质量的目标。这涉及到精心设计损失函数以及可能的话调整网络内部组件的设计[^2]。 #### 实现细节 下面给出一段简单的Python代码片段用于构建基础版的自定义层——`QuantizationLayer`,它可以在TensorFlow/Keras环境中作为其他更复杂系统的组成部分之一被调用: ```python import tensorflow as tf class QuantizationLayer(tf.keras.layers.Layer): """A custom layer implementing quantization during forward pass.""" def __init__(self, num_bits=8, **kwargs): super().__init__(**kwargs) self.num_bits = num_bits @tf.function def call(self, inputs, training=None): if training: # Add uniform noise to simulate quantization effect when training. min_val = -0.5 / (2**(self.num_bits - 1)) max_val = 0.5 / (2**(self.num_bits - 1)) noisy_inputs = inputs + tf.random.uniform( shape=tf.shape(inputs), minval=min_val, maxval=max_val ) return tf.round(noisy_inputs * (2**(self.num_bits - 1))) / (2**(self.num_bits - 1)) else: return tf.round(inputs) ``` 该类实现了带有均匀分布噪音注入机制的量化处理逻辑,使得即使在网络参数更新期间也能保持一定程度上的连续性从而便于梯度下降算法正常运作。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值