传统卷积 vs CoordConv 详细对比
- 传统卷积对空间位置不敏感,CoordConv通过显式添加坐标信息解决这个问题
- 在特征图中嵌入(x, y)坐标和可选的径向距离
r
- 使模型能够感知空间位置关系
1. 传统卷积的"空间位置不敏感"问题
传统卷积的特点:
- 输入:
[B, C, H, W]
例如[4, 3, 224, 224]
(批次大小4,RGB 3通道,224x224图像) - 卷积核在整个图像上滑动时,只关心局部模式,不知道自己在图像的哪个位置
- 例如:一个检测边缘的卷积核,无论在图像左上角还是右下角检测到边缘,输出都是一样的
问题举例:
# 假设有一个3x3的卷积核
# 在位置(10,10)检测到一个边缘 -> 输出值 0.8
# 在位置(200,200)检测到同样的边缘 -> 输出值还是 0.8
# 卷积核完全不知道自己在哪个空间位置!
2. CoordConv如何解决这个问题
CoordConv的做法:
在原始特征图基础上显式添加坐标通道
让我用具体数字说明:
输入变化对比:
传统卷积输入:
原始输入: [B=4, C=1792, H=28, W=28] # 来自CNN的特征图
CoordConv输入:
# Step 1: 创建坐标网格
xx_channel = [[-1, -0.93, -0.86, ..., 0.86, 0.93, 1], # 28个值,从-1到1
[-1, -0.93, -0.86, ..., 0.86, 0.93, 1], # 重复28行
...
[-1, -0.93, -0.86, ..., 0.86, 0.93, 1]]
yy_channel = [[-1, -1, -1, ..., -1, -1, -1], # 第一行全是-1
[-0.93, -0.93, ..., -0.93, -0.93], # 第二行全是-0.93
...
[1, 1, 1, ..., 1, 1, 1]] # 最后一行全是1
# Step 2: 拼接原始特征和坐标
最终输入: [B=4, C=1792+2, H=28, W=28] # 增加了2个坐标通道