关于BN层在颜色恒常性任务中的思考

2024-06-05 08:18
文章标签 思考 任务 颜色 bn 恒常

本文主要是介绍关于BN层在颜色恒常性任务中的思考,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关于BN层在颜色恒常性任务中的思考

纵观已有的颜色恒常性算法,从15年AlexNet[1],到后来的FC4[2],其网络中都没有出现BN层,以及2020年的两篇CVPR(华为,港理工)也同样如此。看过其他领域的(尤其是目标检测、分类)网络,大多都会引入Batch Normalization,其作用也在ResNet论文中进行了总结,好处多多,不再赘述(面试被问透了的东西)。因此在思考,为什么颜色恒常性领域弃用了该操作。经过一番实验,个人理解如下,仅供参考,欢迎大佬指正。

[1] Bianco S , Cusano C , Schettini R . Color Constancy Using CNNs[C]// 2015 IEEE Conference on Computer Vision and Pattern Recognition Workshops (CVPRW). IEEE, 2015.
[2] Hu Y , Wang B , Lin S . FC^4: Fully Convolutional Color Constancy with Confidence-Weighted Pooling[C]// 2017 IEEE Conference on Computer Vision and Pattern Recognition (CVPR). IEEE, 2017.

下图是训练过程中训练集的AE变化和验证集的AE变化情况,验证集AE变化非常剧烈,震荡严重,后期过拟合的AE值也非常大。
训练集AE变化趋势
验证集AE变化趋势

1. 网络深度问题

颜色恒常性领域所用的模型大都比较简单,其深度往往没有ResNet那样的深度,因此,从必要性角度来说,不需要使用BN层来加速训练,网络也一般不会出现梯度爆炸(消失)问题。

2. 特别的对于颜色恒常性任务本身不适用

最近将VGG第一层+BoTNet Block+1x1卷积+GAP进行了模型搭建,其中保留了原BoTNet设计时的BN层,训练出现了以下奇怪的现象:
训练集的loss和AE(Angular Error)随着训练的进行都在下降,而验证集的AE几乎没有什么变化。并且,验证集的AE基本与初始化相关,不同的初始化导致验证集AE始终保持在某一数值范围内。

原本以为是过拟合,遂减少BoTNet Block数量,从12->3->1,发现该现象仍然出现。

从原理上分析,所设计的模型的任务是判断输入图像已被白平衡的概率,因此使用BN层,将导致图像特征在整体上获得归一化,该归一化过程破坏了本任务最重要的特征,即,颜色恒常性问题的最大有效特征体现在特征在特征空间上的整体偏移情况。因此,BN不适用于颜色恒常性任务。

移除BN层,该现象得到缓解,基本上验证集随测试集趋势变化,也进一步说明了BN层不适用于该任务。
训练集AE
验证集AE

这篇关于关于BN层在颜色恒常性任务中的思考的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1032553

相关文章

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

FreeRTOS学习笔记(二)任务基础篇

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、 任务的基本内容1.1 任务的基本特点1.2 任务的状态1.3 任务控制块——任务的“身份证” 二、 任务的实现2.1 定义任务函数2.2 创建任务2.3 启动任务调度器2.4 任务的运行与切换2.4.1 利用延时函数2.4.2 利用中断 2.5 任务的通信与同步2.6 任务的删除2.7 任务的通知2

Flink任务重启策略

概述 Flink支持不同的重启策略,以在故障发生时控制作业如何重启集群在启动时会伴随一个默认的重启策略,在没有定义具体重启策略时会使用该默认策略。如果在工作提交时指定了一个重启策略,该策略会覆盖集群的默认策略默认的重启策略可以通过 Flink 的配置文件 flink-conf.yaml 指定。配置参数 restart-strategy 定义了哪个策略被使用。常用的重启策略: 固定间隔 (Fixe

第49课 Scratch入门篇:骇客任务背景特效

骇客任务背景特效 故事背景:   骇客帝国特色背景在黑色中慢慢滚动着! 程序原理:  1 、 角色的设计技巧  2 、克隆体的应用及特效的使用 开始编程   1、使用 黑色的背景: ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/7d74c872f06b4d9fbc88aecee634b074.png#pic_center)   2

AsyncTask 异步任务解析

1:构建AsyncTask 子类的回调方法: A:doInBackground:   必须重写,所有的耗时操作都在这个里面进行; B: onPreExecute:     用户操作数据前的调用; 例如:显示一个进度条 等 ; C: onPostExecute:    当doInBackground 执行完成后;会自动把数据传给onPostExecute方法;也就是说:这个方法是处理返回的数据的方法

渐变颜色填充

GradientFill函数可以对特定的矩形区域或者三角形区域进行渐变颜色的填充。我们先来看看GradientFill函数到底长得什么样子,帅不帅。 [cpp]  view plain copy print ? BOOL GradientFill(     _In_  HDC hdc,     _In_  PTRIVERTEX pVertex,     _In_  ULONG

使用Node-API进行异步任务开发

一、Node-API异步任务机制概述         Node-API异步任务开发主要用于执行耗时操作的场景中使用,以避免阻塞主线程,确保应用程序的性能和响应效率。         1、应用场景: 文件操作:读取大型文件或执行复杂的文件操作时,可以使用异步工作项来避免阻塞主线程。网络请求:当需要进行网络请求并等待响应时,可以使用异步工作项来避免阻塞主线程,从而提高应用程序的响应性能。数据库操

探索Invoke:Python自动化任务的瑞士军刀

文章目录 探索Invoke:Python自动化任务的瑞士军刀背景:为何选择Invoke?`invoke`是什么?如何安装`invoke`?简单的`invoke`库函数使用方法场景应用:`invoke`在实际项目中的使用场景一:自动化测试场景二:代码格式化场景三:部署应用 常见问题与解决方案问题一:命令执行失败问题二:权限不足问题三:并发执行问题 总结 探索Invoke:P

【编程底层思考】详解Java的JUC多线程并发编程底层组件AQS的作用及原理

Java中的AbstractQueuedSynchronizer(简称AQS)是位于java.util.concurrent.locks包中的一个核心组件,用于构建锁和其他同步器。AQS为实现依赖于FIFO(先进先出)等待队列的阻塞锁和相关同步器提供了一套高效、可扩展的框架。 一、AQS的作用 统一同步状态管理:AQS提供了一个int类型的成员变量state,用于表示同步状态。子类可以根据自己

RISC-V (十)任务同步和锁

并发与同步 并发:指多个控制流同时执行。         多处理器多任务。一般在多处理器架构下内存是共享的。           单处理器多任务,通过调度器,一会调度这个任务,一会调度下个任务。  共享一个处                                理器一个内存。                 单处理器任务+中断: 同步: 是为了保证在并发执行的环境中各个控制流可