Uber发布的CoordConv遭深度质疑,“翻译个坐标也需要训练?”

简介: 前几天,Uber AI实验室发布了一篇非常瞩目的论文,说卷积神经网络 (CNN) 在一些很简单很直接的任务里面,会失守。

前几天,Uber AI实验室发布了一篇非常瞩目的论文,说卷积神经网络 (CNN) 在一些很简单很直接的任务里面,会失守。


image

比如,一张白色图片,上面有个黑点。给CNN喂食这个点的 (i,j) 坐标,它就是画不出原来那幅图。

总结起来,监督渲染、监督坐标分类,以及监督回归,对CNN来说都是大难题。

于是,团队提出了CoordConv,来回收这些失陷的领土。



image


不过很快,这篇论文,和拯救CNN的主角CoordConv,就被一篇有点长的博文“鞭尸”了。

博客的主人Filip Piekniewski (暂称菲菲) 说,他给这项研究做了尸检。

加个特征,而已

首先,关于 (上文白纸黑点) 定位问题,Uber团队发现,CNN不擅长把笛卡尔坐标 (i,j) 转换成独热像素空间 (One-Hot Pixel Space) 里的位置。

菲菲提到,CNN的结构,从福岛邦彦新认知机 (Neocognitron) 的年代开始,基本就设计成“忽略位置”的了。



image

而CoordConv要做的,就在给神经网络的输入里,加上两个坐标通道,一个i一个j,明确告诉AI哪是哪。

果然很有道理啊。可是……

总感觉,随便一个小伙伴在实操的时候,都能对CNN做个类似的小加工,就是加个特征,解码起来更舒服嘛。

菲菲说,做计算机视觉的同行们,没有人会觉得加了几个特征就是不得了的事情。

image

△ 平平无奇
虽然,有一个非常火热纯学术辩题,就是一些学者认为,大家只应该用那些学习到的特征 (Learned Features) ,而经济实用派的选手们不同意。

从这个角度上来说,如今现在深度学习圈的人们,也开始认同特征工程 (Feature Engineering) 了,可以可以可以。

训练成果,啊这也需要训练?

加了一层坐标之后,团队就测试了一下神经网络的表现。

可爱的是,这里用的数据集名字叫“Not-So-Clevr”。


image

任务就是,用坐标生成独热图像,以及用独热图像生成坐标。

结果表明,神经网络的性能确实比没加那一层的时候,好了一些。

不过,如果这些人不要那么激动,坐下冷静冷静,可能就会发现,直接搭一个能把笛卡尔坐标和独热编码互相转换的神经网络,不就好了么?

菲菲有了这个想法,就自己写了一串代码——

1import scipy.signal as sp
2import numpy as np
3# Fix some image dimensions
4I_width = 100
5I_height = 70
6# Generate input image
7A=np.zeros((I_height,I_width))
8# Generate random test position
9pos_x = np.random.randint(0, I_width-1)
10pos_y = np.random.randint(0, I_height-1)
11# Put a pixel in a random test position
12A[pos_y, pos_x]=1
13# Create what will be the coordinate features
14X=np.zeros_like(A)
15Y=np.zeros_like(A)
16# Fill the X-coordinate value
17for x in range(I_width):
18   X[:,x] = x
19# Fill the Y-coordinate value
20for y in range(I_height):
21   Y[y,:] = y
22# Define the convolutional operators
23op1 = np.array([[0, 0, 0],
24                [0, -1, 0],
25                [0, 0, 0]])
26opx = np.array([[0, 0, 0],
27                [0, I_width, 0],
28                [0, 0, 0]])
29opy = np.array([[0, 0, 0],
30                [0, I_height, 0],
31                [0, 0, 0]])
32# Convolve to get the first feature map DY
33CA0 = sp.convolve2d(A, opy, mode='same')
34CY0 = sp.convolve2d(Y, op1, mode='same')
35DY=CA0+CY0
36# Convolve to get the second feature map DX
37CA1 = sp.convolve2d(A, opx, mode='same')
38CX0 = sp.convolve2d(X, op1, mode='same')
39DX=CA1+CX0
40# Apply half rectifying nonlinearity
41DX[np.where(DX<0)]=0
42DY[np.where(DY<0)]=0
43# Subtract from a constant (extra layer with a bias unit)
44result_y=I_height-DY.sum()
45result_x=I_width-DX.sum()
46# Check the result
47assert(pos_x == int(result_x))
48assert(pos_y == int(result_y))
49print result_x 
50print result_y

一个卷积层,一个非线性激活,一个加和,一个减法。解决战斗。

他说,这种事情,就别花时间训练了。

100个GPU

论文主体结束之后,正片才开始。

Appendix里面,有这样一个表格。

image

Uber团队拿他们的坐标特征,在ImageNet上搞了一下。

具体做法是,加在了ResNet-50的第一层。

菲菲觉得,这样玩应该没什么X用,因为ImageNet里的类别,根本不是位置的函数。就算开始有这样的偏见,训练中的数据扩增也会把它抹掉了。

令人惊喜的是,研究人员用了100个GPU来训练这个改进之后的神经网络。

结果是,到了小数点后第三位,他们终于获得了微弱的安慰奖。

image

菲菲说,如果有一万台GPU,大概也是可以用上的,无限风光,在险峰嘛。

真有那么壕的话,不想做点更有意义的训练么?

请开始你的表演

菲菲的嘲讽熔成一句话——

这样的作品,还有人叫好,真让人难过。

那么,你怎么看?

原文发布时间为:2018-07-16
本文来自云栖社区合作伙伴“量子位”,了解相关信息可以关注“量子位

相关文章
|
机器学习/深度学习 计算机视觉 知识图谱
YoloV8最新改进手册——高阶篇
本专栏是讲解如何改进Yolov8的专栏。改进方法采用了最新的论文提到的方法。改进的方法包括:增加注意力机制、更换卷积、更换block、更换backbone、更换head、更换优化器等;每篇文章提供了一种到N种改进方法。 评测用的数据集是我自己标注的数据集,里面包含32种飞机。每种改进方法我都做了测评,并与官方的模型做对比。 代码和PDF版本的文章,我在验证无误后会上传到百度网盘中,方便大家下载使用。 这个专栏,求质不求量,争取尽心尽力打造精品专栏!!! 专栏链接: ''' https://blog.csdn.net/m0_47867638/category_12295903
2402 0
|
开发工具 Python
milvus的delete操作
milvus的delete操作
1623 0
|
6月前
|
缓存 监控 Cloud Native
Java Solon v3.2.0 高并发与低内存实战指南之解决方案优化
本文深入解析了Java Solon v3.2.0框架的实战应用,聚焦高并发与低内存消耗场景。通过响应式编程、云原生支持、内存优化等特性,结合API网关、数据库操作及分布式缓存实例,展示其在秒杀系统中的性能优势。文章还提供了Docker部署、监控方案及实际效果数据,助力开发者构建高效稳定的应用系统。代码示例详尽,适合希望提升系统性能的Java开发者参考。
355 4
Java Solon v3.2.0 高并发与低内存实战指南之解决方案优化
|
缓存 JavaScript 前端开发
如何优化事件委托以提高性能?
【10月更文挑战第29天】通过以上优化方法,可以在一定程度上提高事件委托的性能,使其在处理大量DOM元素的事件时更加高效和可靠,为用户提供更流畅的交互体验。在实际应用中,可以根据具体的项目场景和性能瓶颈,有针对性地选择和应用这些优化策略。
|
7月前
|
存储 人工智能 运维
当四大美女遇上 MetaGPT,一键解锁跨时空AI畅聊新体验
MetaGPT 是一个开源多智能体框架,通过角色专业化分工与流程标准化控制,突破传统单模型系统的能力瓶颈。本方案结合阿里云百炼模型服务和 Serverless AI 开发平台 Function AI,构建支持多角色、多场景的对话应用,并部署至函数计算。用户可快速获取 API-KEY、配置参数并部署项目,体验如“西游取经”、“成语接龙”等示例应用,实现高效协同推理与垂直领域专业内容动态更新,显著降低成本并提升开发效率。
|
开发框架 前端开发 JavaScript
React、Vue.js 和 Angular主流前端框架和选择指南
在当今的前端开发领域,选择合适的框架对于项目的成功至关重要。本文将介绍几个主流的前端框架——React、Vue.js 和 Angular,探讨它们各自的特点、开发场景、优缺点,并提供选择框架的建议。
382 6
|
JavaScript 前端开发 开发者
Vue 3中的Proxy
【10月更文挑战第23天】Vue 3中的`Proxy`为响应式系统带来了更强大、更灵活的功能,解决了Vue 2中响应式系统的一些局限性,同时在性能方面也有一定的提升,为开发者提供了更好的开发体验和性能保障。
539 7
|
机器学习/深度学习 计算机视觉
YOLOv8改进 | 卷积模块 | 用坐标卷积CoordConv替换Conv
💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡
|
消息中间件 存储 Java
RocketMQ实战教程之NameServer与BrokerServer
这是一个关于RocketMQ实战教程的概要,主要讨论NameServer和BrokerServer的角色。NameServer负责管理所有BrokerServer,而BrokerServer存储和传输消息。生产者和消费者通过NameServer找到合适的Broker进行交互,不需要直接知道Broker的具体信息。工作流程包括生产者向NameServer查询后发送消息到Broker,以及消费者同样通过NameServer获取消息进行消费。这种设计类似于服务注册中心的概念,便于系统扩展和集群管理。
|
存储 安全 Java
【多线程】线程安全问题原因与解决方案
线程不安全的原因及解决方案,synchronized,volatile