吃透空洞卷积

一、空洞卷积的提出

空洞卷积中文名也叫膨胀卷积或者扩张卷积,英文名也叫Atrous Convolution

空洞卷积最初的提出是为了解决图像分割的问题而提出的,常见的图像分割算法通常使用池化层和卷积层来增加感受野(Receptive Filed),同时也缩小了特征图尺寸(resolution),然后再利用上采样还原图像尺寸,特征图缩小再放大的过程造成了精度上的损失,因此需要一种操作可以在增加感受野的同时保持特征图的尺寸不变,从而代替下采样和上采样操作,在这种需求下,空洞卷积就诞生了(略有修改,引自[4])

玖零猴:感受野(Receptive Field)的理解与计算@玖零猴

https://zhuanlan.zhihu.com/p/113487374

当然,如果不用空洞卷积这种方案,那怎么去弥补经过下采样而造成信息损失呢?其实,这是另一个思路了,于是才有了我们熟知的skip connection,它可以为上采样弥补信息,像FCN、U-Net这种典型的拓扑网络,如下图所示,其实我个人认为,如果一个问题如果从不同的思路去想的话,就会出现不同的解决方案

图1 FCN、U-Net典型的分割拓扑结构:下采样、上采样、skip connection(图来自[6])

空洞卷积自2016在ICLR(International Conference on Learning Representation)上才被提出后,本身是用在图像分割领域,但立马被deepmind拿来应用到语音(WaveNet)和NLP领域,它在物体检测也发挥了重要的作用,虽然不要求逐个像素检测,但对于小物体的检测也是十分重要的

二、空洞卷积的原理

与正常的卷积不同的是,空洞卷积引入了一个称为 “扩张率(dilation rate)”的超参数(hyper-parameter),该参数定义了卷积核处理数据时各值的间距。扩张率中文也叫空洞数(Hole Size)。

在此以 卷积为例,展示普通卷积和空洞卷积之间的区别,如图2所示

图2 普通卷积和空洞卷积的对比(来自[4])

图2中从左到右分别为a、b、c子图,三幅图是相互独立进行卷积的(区别于下面图4),大框表示输入图像(感受野默认为1),黑色的圆点表示的卷积核,灰色地带表示卷积后的感受野(后面有相关计算公式,这里都是一层卷积的,直接可以看出来)

  • a是普通的卷积过程(dilation rate = 1),卷积后的感受野为3

  • b是dilation rate = 2的空洞卷积,卷积后的感受野为5

  • c是dilation rate = 3的空洞卷积,卷积后的感受野为8

可以这么说,普通卷积是空洞卷积的一种特殊情况

另外,空洞卷积可以增大感受野,但是可以不改变图像输出特征图的尺寸(分辨率,resolution),这句话怎么理解?

为了更好地理解这一点,我们从一维去分析容易理解点

图3 一维版的普通卷积(a、b)和空洞卷积(c),黑色的圆表示填充部分,a、b、c它们相互独立进行卷积 (来自[8])

从b和c可以看出,有无空洞卷积,并不影响输出特征图的尺寸,也就是说输出特征图的尺和空洞数无关,因此可以利用空洞卷积增大感受野,而输出特征图的尺寸可以保持不变

影响输出特征图尺寸的因素有输入特征图的尺寸  ,卷积核的大小  ,填充  ,步长  ,计算公式如下:

由于保持特征图尺寸不变,所以导致了计算过程的计算量比较大

保持住特征图不变,那怎么能利用多尺度信息?

在解答这个问题之前,先补充两点知识

知识一:我们知道,神经元感受野的值越大表示其能接触到的原始图像范围就越大,也意味着它可能蕴含更为全局,语义层次更高的特征;相反,值越小则表示其所包含的特征越趋向局部和细节。因此感受野的值可以用来大致判断每一层的抽象层次。

知识二:在赢得其中一届ImageNet比赛里VGG网络的文章中,他最大的贡献并不是VGG网络本身,而是他对于卷积叠加的一个巧妙观察。1个 7 x 7 的卷积层的正则等效于 3 个 3 x 3 的卷积层的叠加。而这样的设计可以大幅度的减少参数,有正则化的效果,参数少了就没那么容易发生过拟合。这也是现在绝大部分基于卷积的深层网络都在用小卷积核的原因,常常使用3 x 3的卷积核

一般每一层的卷积核都是用3 x 3 大小的,而每一层只要设置不同dilation rate时,感受野就会不一样,也即获取了多尺度信息,当然这样操作并不影响特征图的尺寸,这样一来,又避免下采样那样造成信息损失,同时也利用到多尺度信息,真是一举两得啊

获取多尺度信息在视觉任务中相当重要,尤其是在Dense prediction(对每个像素进行分类)问题上,它能够提高准确性的,如语义分割

dense prediction problems such as semantic segmentation ... to increase the performance of dense prediction architectures by aggregating multi-scale contextual information(来自[1])

三、感受野的计算

为了好看,我们把图2放下来

图2 普通卷积和空洞卷积的对比(来自[4])

从图2可以看出,同样一个  的卷积,却可以起到  、  等卷积的效果,空洞卷积在不增加参数量的前提下(参数量=卷积核大小+偏置),却可以增大感受野,假设空洞卷积的卷积核大小为  ,空洞数为  ,则其等效卷积核大小  ,例如  的卷积核,则  ,公式如下(来自[4])


当前层的感受野计算公式如下,其中,  表示当前层的感受野,  表示上一层的感受野,  表示卷积核的大小

表示之前所有层的步长的乘积(不包括本层),公式如下:

同样的,当前层的步长并不影响当前层的感受野,感受野和填补(padding)没有关系

下面举个例子练练手,此图4和上面的图2有区别,图2的三幅图是独立的,而图4是从左到右连续进行卷积,它们属于top-bottom关系

图4 三个不同的空洞卷积,卷积核的kernel size=3, stride=1, 但是空洞卷积的dilation rate分别是1,2,4。默认初始化感受野是1。(来自[1])

感受野的计算

输入图像: 1

第一层卷积:3

第二层卷积:


综上,得

第三层卷积:

综上,得

四、潜在的问题及解决方法

潜在问题 1:The Gridding Effect

假设我们仅仅多次叠加 dilation rate 2 的 3 x 3 kernel 的话,则会出现这个问题:

由于空洞卷积的计算方式类似于棋盘格式,某一层得到的卷积结果,来自上一层的独立的集合,没有相互依赖,因此该层的卷积结果之间没有相关性,即局部信息丢失。这对 pixel-level dense prediction 的任务来说是致命的。

潜在问题 2 :Long-ranged information might be not relevant.

远距离获取的信息没有相关性:由于空洞卷积稀疏的采样输入信号,使得远距离卷积得到的信息之间没有相关性,影响分类结果。

解决方案

具体可参考[5,9]

  • Panqu Wang,Pengfei Chen, et al**.Understanding Convolution for Semantic Segmentation.//**WACV 2018

  • Fisher Yu, et alDilated Residual Networks. //CVPR 2017

  • Zhengyang Wang,et al.**Smoothed Dilated Convolutions for Improved Dense Prediction.//**KDD 2018.

  • Liang-Chieh Chen,et al.Rethinking Atrous Convolution for Semantic Image Segmentation//2017

  • Sachin Mehta,et alESPNet: Efficient Spatial Pyramid of DilatedConvolutions for Semantic Segmentation. //ECCV 2018

  • Tianyi Wu**,et al.Tree-structured Kronecker Convolutional Networks for Semantic Segmentation.//AAAI2019**

  • Hyojin Park,et al.Concentrated-Comprehensive Convolutionsfor lightweight semantic segmentation.//2018

  • Efficient Smoothing of Dilated Convolutions for Image Segmentation.//2019

reference

1、Yu, Fisher, and Vladlen Koltun. "Multi-scale context aggregation by dilated convolutions." arXiv preprint arXiv:1511.07122 (2015).(https://arxiv.org/abs/1511.071220)

2、Understanding Convolution for Semantic Segmentation(https://arxiv.org/abs/1702.08502)

3、Rethinking Atrous Convolution for Semantic Image Segmentation(https://arxiv.org/abs/1706.05587)

4、书籍《深度学习之PyTorch物体检测实战》

5、如何理解空洞卷积(dilated convolution)?(https://www.zhihu.com/question/54149221)

6、U-Net++作者对U-Net的分析(https://zhuanlan.zhihu.com/p/44958351)

7、GIF动图,加深普通卷积和空洞卷积的区别: https://github.com/vdumoulin/conv_arithmetic/blob/master/README.md

8、如何理解Dilated Convolutions(空洞卷积)

9、yyfyan:总结-空洞卷积(Dilated/Atrous Convolution)(https://zhuanlan.zhihu.com/p/50369448)

转载自:视学算法

<think> 嗯,用户明确询问如何吃透Java项目的方法,这已经是第二次提问了(之前系统提示过参考站内引用),看来用户对技术深度掌握有强烈需求。从用户身份推测大概率是中级Java开发者——既熟悉基础语法但缺乏复杂项目实战经验,可能正面临跳槽或接手重要项目。 注意到用户引用的资料强调“真实业务场景”和“技术栈全面性”,这提示我需要避开理论空谈。引用[2]提供了完整步骤框架,但用户可能更需要可落地的实操技巧。特别要突出三点:如何避免陷入代码海洋的陷阱、怎样验证是否真“吃透”了、企业级项目的特殊考量。 上次回复时已经拆解过技术栈和调试方法,这次应该升级维度:重点补充引用[4]提到的“架构设计责任”视角和“主干分支切割法”。用户引用中rocketMQ案例值得展开,但需注意平衡深度与普适性——用消息队列举例时得同步说明通用方法论。 用户焦虑点可能在时间效率,“几个月才能吃透”这种话绝不能出现。要把“里程碑验证法”(如七天能画架构图)和“渐进式目标”设计得更清晰。另外所有引用都未提及团队协作层面的吃透技巧,这恰好是实际开发的关键,需要补充。 </think> 以下是基于技术实践总结的**吃透Java项目方法论**,结合核心步骤与关键技巧,帮助深度掌握项目全貌: --- ### **一、系统化拆解步骤** 1. **理解业务背景与目标** - 明确项目解决的**核心问题**(如电商平台的秒杀场景、支付对账系统) - 梳理关键业务流程(用流程图/UML梳理订单创建→支付→履约的主干) - 定位项目在技术架构中的**层级角色**(如属于中台服务/网关层/数据聚合层)[^4] 2. **解剖项目结构** ```bash ├── src/main/java │ ├── controller # API入口 │ ├── service # 业务逻辑 │ ├── dao # 数据访问层 │ └── config # 配置类(Spring Boot) ├── resources │ ├── application.yml # 主配置 │ └── mapper # MyBatis XML └── test # 单元测试 ``` - 重点:**依赖关系分析**(利用`mvn dependency:tree`或IDE插件生成依赖图) 3. **技术栈深度掌握** | 技术类型 | 关键学习点 | 实践验证方式 | |----------------|-----------------------------------|--------------------------------| | **核心框架** | Spring IOC/AOP、事务管理机制 | 修改事务传播级别观察回滚效果 | | **中间件** | Redis缓存击穿解决方案、MQ消息幂等 | 模拟高并发测试消息重复消费 | | **数据库** | 分库分表策略、索引优化方案 | 用Explain分析慢SQL | 4. **代码研读技巧** - **从入口切入**:找到`SpringBootApplication`启动类,追踪请求链路(如HTTP请求→Controller→Service) - **断点调试黄金法则**: ```java // 关键位置设断点 + 条件触发(IDEA技巧) if(orderId > 10000) { // 设置条件断点 logger.debug("大订单处理逻辑"); } ``` - **逆向推导**:通过单元测试(`@Test`)反推模块功能 --- ### **二、进阶实践策略** 1. **数据流全景分析** - 绘制**数据流转图**: ```mermaid graph LR A[用户请求] --> B(网关鉴权) B --> C[服务A处理] C --> D[(DB读写)] D --> E[消息队列通知] E --> F[服务B消费] ``` 2. **深度改造验证** - 示例挑战: - 将单点登录改造为OAuth2.0协议 - 将同步扣库存改为Redis+Lua分布式锁 3. **性能压测反推架构** - 用`JMeter`模拟并发场景,观察: - 线程池配置是否合理(拒绝策略触发条件) - 数据库连接池瓶颈(如Druid监控页) - 缓存命中率波动(Redis监控工具) --- ### **三、避坑指南** 1. **文档缺失时的应对** - 通过`git blame`追溯历史提交记录,还原代码演进逻辑 - 用Arthas在线诊断:`watch com.example.Service * '{params,returnObj}'` 观察方法入出参 2. **复杂技术栈速攻法** - 优先掌握**20%核心功能**(如Spring Cloud只深挖Gateway/Nacos) - 对照官方文档验证项目中的定制化修改(如RocketMQ消息重试机制被覆写)[^4] > **关键衡量标准**:能准确回答—— > - 项目的**技术选型权衡**(为什么用Kafka而非RabbitMQ?) > - **极端场景处理方案**(数据库挂掉时降级策略是什么?) > - **扩展性设计缺陷**(百万人同时抢券系统如何改造?) --- **
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值