2017年10月30日星期一

大咖来信|李国杰院士:AI创业光靠算法走不远,警惕命运魔咒

李根 发自 凹非寺量子位 报道 | 公众号 QbitAI

AI对中国工程院院士、中科曙光董事长李国杰而言,并不是新事物。

作为中国最早一批计算机科学领域的专家学者,他在美国求学时便已亲身经历过上一波人工智能浪潮,其后又在科研任教和工业研发中,在并行处理、计算机体系结构、人工智能、组合优化等领域,颇多建树。当然,AI也是中科曙光的最新战略重点所在。

在近日接受量子位等媒体的采访时,李国杰院士谈到了他对当前AI发展的看法,特别是中国在AI竞争中存在的机会和挑战,他也提醒AI创业公司,要摆脱众多公司之前"不是被收购就是死亡"的命运,注重技术和商业的结合。

量子位《大咖来信》栏目在不改变原意的基础上,以第一人称的方式,把我们与李国杰院士的对话进行了整理。

李国杰院士

AlphaGo带动人工智能火热之后,不少人问我:现在的人工智能进入了什么阶段,会不会再进入50年代和80年代的历史周期?

我想每一个新技术的发展,都有一个类似四季春夏秋冬的过程,云计算是这样、物联网是这样,可能智慧城市也会是这样。

人工智能有点不同,因为人工智能已经热过好几回了,好像没有分明的四季,这其中有它的特殊性。

但我个人判断而言,人工智能现在的"季节"是秋天,即到了收获的季节,这背后有几个方面的原因。

一方面,深度学习的算法、规则都相对成熟了,而且不是大家熟知的AlphaGo才开始的。

像我的朋友李凯和李飞飞发起ImageNet的时候,已经是8年前的事,很难想象一开始申请经费都得不到批准。

再后来Hinton用深度学习的方法,一下子把在ImageNet上的识别率提高到了80%多,让大家看到了方向。

不过这也是有时代背景的。为什么以前的机器没有这个能力?核心是数据没有这么多,联网设备也没有这么多,所以现在条件保证了,人工智能也就见效了。

这就好比你在路上走,你的路径、车灯数据都有了,所以现在沿着过去的积累,一切狂飙突进都变得水到渠成了。而且新的器件、超导、量子计算等新规则都在不断涌现,可能会进一步加强加快这个过程。

所以我认为AI进入到一个新时代,今后一二十年都应该会有更多进一步的发展。

不过,这也不意味着此次人工智能在任何领域都能一帆风顺。

我们回顾过去,AI发展从来不会水银泻地般突破各个领域。

比如无人车,2004年美国DARPA开始搞无人车测试,结果所有的车都翻车了,200英里的比赛没有车跑过10英里就翻了,才让参赛者意识到人工自己编写系统是不行的,于是转而走人工神经网络来做。

但其后神经网络也不是就完全没有问题,也出过笑话。比如微软机器人网上聊天,被年轻人胡乱教一气,最后机器就认为911是假的,希特勒是好的。本来这些和机器聊天的年轻人是恶作剧,但机器辨别不了,你给它正确的东西它就学习正确的,你给它错误的知识它也学习,最核心的是没有"常识"。

所以现在美国AI计划里,特别强调推理、解释等方面的尝试,这可能是一条光明的路,但肯定还有很多的困难需要进一步克服。

靠算法弯道超车?

当然,每每谈到当前人工智能,话题肯定也离不开大国竞争,中美对比。

之前也谈过,人工智能产业要像一棵大树,必须扎根在系统结构和软件理论的深土中,发展人工智能不能停留在算法层面,要关注从算法、软件、人机截面到系统结构和芯片这一完整的产业链和生态系统。

但现在国内来看,更多还关注在算法层面,这可能不足以支撑我们走更远。

重视算法也无可厚非,因为算法的作用比较容易显现。

现在越来越多的科研机构、公司都以算法为核心,原因是算法研究的门槛比较低、论文发表的难度也低,容易出成果,这是人之常情、可以理解。

但问题也随之而来。一个公司光靠算法,或者行业都围着算法你争我赶,很难有竞争力。今天你看着算法机会多,容易赚钱,但也很容易被别人赶超。

而且真正标新立异的颠覆性算法现在还比较少,更多还是一些改进性的算法,所以把大部分的精力集中在算法上,是不全面的。

这也是中国的问题,我们现在总说我们和国外的差距如何如何,每讲到核心技术,总是受制于人,但对于基础技术方面又没有积累和投入的意识,这样的亏吃得还不够多吗?

比如芯片,国外的领先优势就在两代以上,我们一直没能缩短。我们现在用的20纳米不太成熟,以后别人都是28纳米、14纳米,甚至7纳米,我们都没有办法跟上,更别说赶超了。

还有很多基础软件,最核心的基础的东西都是别人的,我们只在上面做一些小修改,整个生态都建立在别人的基础上,原来是X86,后来就更多。

这些基础问题不解决,就容易地动山摇,整个国家的竞争实力就要受制于人。

全世界200强的公司中,美国有14家芯片公司,14家软件公司,中国呢?一家都没有,所以这个差距不得不重视,越是基础的东西,对我们的未来越重要,这是衡量一个国家人工智能强不强的基本判断之一。

另一个基本判断是计算。人工智能是计算出来了,没有计算就没有智能,计算力也是一个非常基础的东西。

但如果按照服务器拥有量来衡量国家计算力,我们现在和国外的差距也不小。国外每年花在服务器上的钱,可能是整个终端投入的60%-70%,但中国只有20%-30%,在这些基础设施上,我们的重视程度也还不够。

值得注意的是,重视基础就不能"喜新厌旧"。

中国人很重"名","名不正则言不顺",信息领域不断创造新名词,一旦新名词、新学科上升为行业意志,原来的基础学科就被边缘化。

去年国家自然科学基金计算机学科的4863项申请项目中,计算机科学的基础理论只有16项,计算机体系结构22项,程序设计语言及支撑环境13项,高速数据传输技术2项。

但是,计算机图像与视频处理有439项,模式识别理论及应用357项,人工智能应用258项,这是巨大的反差。

基础!基础!基础!没有基础的话,将来还是难以扳回局面。

中国的AI优势

中国的优势在于用户多,网民多,这就让我们在数据方面有优势。

不说BAT了,就说滴滴这样一家年轻的公司,他们切入的这个领域,以后的数据量可能不比阿里、腾讯少,因为每天都有那么多的车在给它产生数据。

所以在中国这个大市场里,人工智能应用就有得天独厚的条件,中国搞算法的多、人才多,有后备力量,在相关方面就比国外超前。

比如云识别、人脸识别等模式和算法领域,都是世界一流。在目前最核心的图像和语音识别领域,应用也越来越多。

但人工智能不限于这些,还有很多和智能制造、无人驾驶、医疗健康等相关的领域,这不是算法好和市场大就能快速起来的。

还需要相关垂直领域的专家配合,比如AI+医疗,你就需要借助医疗、智能医疗方面的专家。

未来我们想在人工智能发展中做大做强,不仅需要巩固算法和市场这样的优势领域,还需要在那些会结合但又不强的地方,加大力量投入。

产学研结合 理论创新

我们有数据和市场的优势,在算法方面也不弱,有机会能在下一波AI技术跃迁中占得先机,甚至理论创新上领先。

我个人看来,下一波AI技术跃迁,核心突破肯定还是在于算法和理论。

人工智能这几年取得了很大突破,但还是没能解决一些在人看来很基础的问题。

比如你教小孩认识事物,可能不出10、20张图片就能让他知道这是马、这是车,但对于机器还做不到,可能机器需要的是上百万张图片。

这就是典型的小数据学习,为什么人可以,机器不可以?但如果考虑到人类一代代经过了几百万年的进化,才慢慢形成人脑的连接、基因,并有了固定的人脑结构,这好像也能解释为什么会有从大数据到小数据的过程。

所以现在的关键是,把AI提升到理论上能解释的地步,比如还有很多很多的基本的东西没能搞明白,深度学习效果这么好,但决策过程可能我们还无法解释,黑箱还没变成白箱,这需要一些基本理论的研究。

这些基本理论的研究,也可能会借由其他领域取得突破,比如量子力学。之前我演讲举例说过,以色列科学家提出"信息瓶颈"理论,有一套完整的科学,他们发现这个过程和深度学习极为相似,这甚至是"深度学习"发明时预料不到的。

但我们也应该看到,现在很多重大理论上的突破,中国并不在其中。

理论创新难以规划产生

之所以不能太乐观,一方面是投入确实不算多,另一方面还是基础研究的特性,它不是能规划出来的,是冒出来的,所以对国家来说,环境培育更重要。

我们国家刚颁布了人工智能战略规划,跟美国一比较,我们做得很细。但参与拟定规划的潘云鹤院士也跟我说,基础研究方面,可能会"有心栽花花不开",可能你列了5个,但5个都没有冒大成果来。

所以政策层面,基础研究不能太受指南之类的影响,除了大方向上给予指导,可能也要鼓励一些自己选方向的发展,主要看这个人和团队。

归结起来,我们发展AI,应该是生态式的,而不是方向式的,有魄力支持一些人去做现在可能还想不到的事情。

也有人问,在AI发展里,国家和企业应该怎么分工,才能更好促进整个产业发展?

我想我们国家一方面有钱、有积极性,这是好事,但也要分清楚政府和市场的定位。

我认为政府主要做的事,应该是人工智能突飞猛进之后,如何树立一个公平经营、竞争的环境,有政策、有导向防止两极分化之类的事情。政府主要还是给一个好的环境、生态。

至于具体的研究方向、投多少钱,可能交给企业去做更合适。

地方政府现在扶持或落地一些AI项目也是这样,有钱、有政策导向是好事,但具体方向、重点领域如何选择等,交给企业更合适,因为AI里面还有很多未知的东西。

另外,现在我最担心的问题,是公有开放的机器训练平台的缺乏。

BAT都有自己的大数据平台,但让智能软件和服务行业每个中小型创业公司都建立自己的机器学习训练平台,既无必要也不可能。各地双创园区要建立共享的大数据分析平台和机器学习训练平台,这是新时代的重要基础设施,另外,也不能让中小企业被迫都使用BAT的平台,让这些企业未来受限于垄断。

最后,涉及政府层面的,还有政府数据怎么公开,让大家都用起来、共享起来,需要动一些脑筋,据说青岛在山东各地区中是做得比较好的,政府的数据共享、打通等已经做了很多工作,但如果我们能够进一步在电子病历等方面打通,可能以后智慧医疗就会发展很快。

而医疗健康之类的产业,才是AI应用、科技方案中需要优先解决的"刚需"。

现在有一些应用完全是满足吸引眼球的需求,大家一乐就结束了。刚性需求,像涉及人的健康、安全等方面可能不太容易马上反映在GDP中,但老百姓需要。比如关心残疾人、关心老人等弱势群体,都是刚性寻求,我们的AI不能完全朝着高校、白领等年轻人群做,否则很容易两极分化,政府应该在其中有一些引导。

AI初创公司命运魔咒

对于AI初创公司,之前还有一些魔咒。过去,人工智能创业公司只有两个命运:一个是被大公司收购,一个是倒闭。

AI公司要在卖产品、授权、广告、服务模式中找到新的赚钱末路,或者另外开辟技术变成钱的商业模式。AI公司要做大做强,不但要有一技之长,而且要有自己的平台和特有的数据,软件和硬件都要有过人的实力。

现在,人工智能企业还是以高技术的为主,未必都是企业家,真正让技术和商业结合,找到帮助企业成长的模式,还是一个难题。

所以我的判断是让更多技术型人才和商业型人才结合。

人工智能肯定还会冒出很多新技术,也会产生很大的市场,几百亿、几千亿之类的都有可能,但也需要时间。

我们看到国外的统计材料,一个新的技术出来变成十亿的市场要二十年,变成一百亿的市场可能要三四十年,需要一个过程。

所以现在看起来,今后十到十五年,真正变成市场的技术,可能不是这几年变出来的,肯定在应有的技术方面如何创新商业模式,要在这方面动脑筋,不光是技术上有新的发明,在商业模式上还要有新的创新,结合起来才可以把新的技术用好。

给年轻学子的建议

对一些年轻人想从事AI,我有一个基本的判断,人工智能从科研角度来讲,它就是计算机科学的前沿研究,从应用来讲也是计算机的应用。

本质上是计算机的技术,是计算技术,虽然可以从脑科学学到一些东西,从数学里拿到一些东西,但是离不开计算机的基本技术,所以在国外人工智能的一些学习者学习课程,开课都开在计算机系里面,极少有搞一个人工智能学院、系等。

首先要搞清楚这是一个计算机学科的重要的组成部分,所以离不开计算机的本身,如果抛开计算机是不行的,想投入这个行业的人,至少把计算机的一些基本的课程要学的比较扎实,包括算法的课程、系统结构、软件等都是基础,现在还没有案例说:缺少计算机基础的人可以做好人工智能。

还有就是明确科幻、舆论和科研之间的距离,宣传总是会超前一些。比如一讲就是机器要超过人,通讯之间不需要机器等,一讲就是很新奇的想法,很吸引人,对这个难度要充分的估计,不是这么简单的。

现在有一些被广泛传播的实验,比如一个人在国外,一个人在国内,两个人不说话,脑之间有脑电波收到一个信号,给到美国去,两个人不见面,我想说你好,这个信号就会通过脑电波传到你的脑电波里面去,那个人就知道你在讲你好,这样的实验已经有了,但是真正所谓的脑脑之间完全靠电波来联系,不是做两个例子,这是很长的路要走。

人脑是多少万年的进化,所以年轻人不要觉得未来把脑科学的东西变成人工智能的东西,好像马上就可以应用,得有一种走艰苦路的思想准备,不是一天两天就可以搞成的。

总而言之,人工智能任重而道远,最后引用一首诗与大家共勉:

莫言下岭便无难,

赚得行人空欢喜。

正入万山圈子里,

一山放过一山拦。

——宋•杨万里《过松原晨炊漆公店》

大咖来信往期回顾

大咖来信 | 李开复:美国AI见闻录

大咖来信 | 姚期智:算法将推动下一波AI浪潮,现有革新将达极限

欢迎大家关注我们的专栏:量子位 - 知乎专栏

诚挚招聘

量子位正在招募编辑/记者,工作地点在北京中关村。期待有才气、有热情的同学加入我们!相关细节,请在量子位公众号(QbitAI)对话界面,回复"招聘"两个字。

量子位 QbitAI

վ'ᴗ' ի 追踪AI技术和产品新动态



via 量子位 - 知乎专栏 http://ift.tt/2zkHfRX
RSS Feed

RSS5

IFTTT

大咖来信|李国杰院士:AI创业光靠算法走不远,警惕命运魔咒

李根 发自 凹非寺量子位 报道 | 公众号 QbitAI

AI对中国工程院院士、中科曙光董事长李国杰而言,并不是新事物。

作为中国最早一批计算机科学领域的专家学者,他在美国求学时便已亲身经历过上一波人工智能浪潮,其后又在科研任教和工业研发中,在并行处理、计算机体系结构、人工智能、组合优化等领域,颇多建树。当然,AI也是中科曙光的最新战略重点所在。

在近日接受量子位等媒体的采访时,李国杰院士谈到了他对当前AI发展的看法,特别是中国在AI竞争中存在的机会和挑战,他也提醒AI创业公司,要摆脱众多公司之前"不是被收购就是死亡"的命运,注重技术和商业的结合。

量子位《大咖来信》栏目在不改变原意的基础上,以第一人称的方式,把我们与李国杰院士的对话进行了整理。

李国杰院士

AlphaGo带动人工智能火热之后,不少人问我:现在的人工智能进入了什么阶段,会不会再进入50年代和80年代的历史周期?

我想每一个新技术的发展,都有一个类似四季春夏秋冬的过程,云计算是这样、物联网是这样,可能智慧城市也会是这样。

人工智能有点不同,因为人工智能已经热过好几回了,好像没有分明的四季,这其中有它的特殊性。

但我个人判断而言,人工智能现在的"季节"是秋天,即到了收获的季节,这背后有几个方面的原因。

一方面,深度学习的算法、规则都相对成熟了,而且不是大家熟知的AlphaGo才开始的。

像我的朋友李凯和李飞飞发起ImageNet的时候,已经是8年前的事,很难想象一开始申请经费都得不到批准。

再后来Hinton用深度学习的方法,一下子把在ImageNet上的识别率提高到了80%多,让大家看到了方向。

不过这也是有时代背景的。为什么以前的机器没有这个能力?核心是数据没有这么多,联网设备也没有这么多,所以现在条件保证了,人工智能也就见效了。

这就好比你在路上走,你的路径、车灯数据都有了,所以现在沿着过去的积累,一切狂飙突进都变得水到渠成了。而且新的器件、超导、量子计算等新规则都在不断涌现,可能会进一步加强加快这个过程。

所以我认为AI进入到一个新时代,今后一二十年都应该会有更多进一步的发展。

不过,这也不意味着此次人工智能在任何领域都能一帆风顺。

我们回顾过去,AI发展从来不会水银泻地般突破各个领域。

比如无人车,2004年美国DARPA开始搞无人车测试,结果所有的车都翻车了,200英里的比赛没有车跑过10英里就翻了,才让参赛者意识到人工自己编写系统是不行的,于是转而走人工神经网络来做。

但其后神经网络也不是就完全没有问题,也出过笑话。比如微软机器人网上聊天,被年轻人胡乱教一气,最后机器就认为911是假的,希特勒是好的。本来这些和机器聊天的年轻人是恶作剧,但机器辨别不了,你给它正确的东西它就学习正确的,你给它错误的知识它也学习,最核心的是没有"常识"。

所以现在美国AI计划里,特别强调推理、解释等方面的尝试,这可能是一条光明的路,但肯定还有很多的困难需要进一步克服。

靠算法弯道超车?

当然,每每谈到当前人工智能,话题肯定也离不开大国竞争,中美对比。

之前也谈过,人工智能产业要像一棵大树,必须扎根在系统结构和软件理论的深土中,发展人工智能不能停留在算法层面,要关注从算法、软件、人机截面到系统结构和芯片这一完整的产业链和生态系统。

但现在国内来看,更多还关注在算法层面,这可能不足以支撑我们走更远。

重视算法也无可厚非,因为算法的作用比较容易显现。

现在越来越多的科研机构、公司都以算法为核心,原因是算法研究的门槛比较低、论文发表的难度也低,容易出成果,这是人之常情、可以理解。

但问题也随之而来。一个公司光靠算法,或者行业都围着算法你争我赶,很难有竞争力。今天你看着算法机会多,容易赚钱,但也很容易被别人赶超。

而且真正标新立异的颠覆性算法现在还比较少,更多还是一些改进性的算法,所以把大部分的精力集中在算法上,是不全面的。

这也是中国的问题,我们现在总说我们和国外的差距如何如何,每讲到核心技术,总是受制于人,但对于基础技术方面又没有积累和投入的意识,这样的亏吃得还不够多吗?

比如芯片,国外的领先优势就在两代以上,我们一直没能缩短。我们现在用的20纳米不太成熟,以后别人都是28纳米、14纳米,甚至7纳米,我们都没有办法跟上,更别说赶超了。

还有很多基础软件,最核心的基础的东西都是别人的,我们只在上面做一些小修改,整个生态都建立在别人的基础上,原来是X86,后来就更多。

这些基础问题不解决,就容易地动山摇,整个国家的竞争实力就要受制于人。

全世界200强的公司中,美国有14家芯片公司,14家软件公司,中国呢?一家都没有,所以这个差距不得不重视,越是基础的东西,对我们的未来越重要,这是衡量一个国家人工智能强不强的基本判断之一。

另一个基本判断是计算。人工智能是计算出来了,没有计算就没有智能,计算力也是一个非常基础的东西。

但如果按照服务器拥有量来衡量国家计算力,我们现在和国外的差距也不小。国外每年花在服务器上的钱,可能是整个终端投入的60%-70%,但中国只有20%-30%,在这些基础设施上,我们的重视程度也还不够。

值得注意的是,重视基础就不能"喜新厌旧"。

中国人很重"名","名不正则言不顺",信息领域不断创造新名词,一旦新名词、新学科上升为行业意志,原来的基础学科就被边缘化。

去年国家自然科学基金计算机学科的4863项申请项目中,计算机科学的基础理论只有16项,计算机体系结构22项,程序设计语言及支撑环境13项,高速数据传输技术2项。

但是,计算机图像与视频处理有439项,模式识别理论及应用357项,人工智能应用258项,这是巨大的反差。

基础!基础!基础!没有基础的话,将来还是难以扳回局面。

中国的AI优势

中国的优势在于用户多,网民多,这就让我们在数据方面有优势。

不说BAT了,就说滴滴这样一家年轻的公司,他们切入的这个领域,以后的数据量可能不比阿里、腾讯少,因为每天都有那么多的车在给它产生数据。

所以在中国这个大市场里,人工智能应用就有得天独厚的条件,中国搞算法的多、人才多,有后备力量,在相关方面就比国外超前。

比如云识别、人脸识别等模式和算法领域,都是世界一流。在目前最核心的图像和语音识别领域,应用也越来越多。

但人工智能不限于这些,还有很多和智能制造、无人驾驶、医疗健康等相关的领域,这不是算法好和市场大就能快速起来的。

还需要相关垂直领域的专家配合,比如AI+医疗,你就需要借助医疗、智能医疗方面的专家。

未来我们想在人工智能发展中做大做强,不仅需要巩固算法和市场这样的优势领域,还需要在那些会结合但又不强的地方,加大力量投入。

产学研结合 理论创新

我们有数据和市场的优势,在算法方面也不弱,有机会能在下一波AI技术跃迁中占得先机,甚至理论创新上领先。

我个人看来,下一波AI技术跃迁,核心突破肯定还是在于算法和理论。

人工智能这几年取得了很大突破,但还是没能解决一些在人看来很基础的问题。

比如你教小孩认识事物,可能不出10、20张图片就能让他知道这是马、这是车,但对于机器还做不到,可能机器需要的是上百万张图片。

这就是典型的小数据学习,为什么人可以,机器不可以?但如果考虑到人类一代代经过了几百万年的进化,才慢慢形成人脑的连接、基因,并有了固定的人脑结构,这好像也能解释为什么会有从大数据到小数据的过程。

所以现在的关键是,把AI提升到理论上能解释的地步,比如还有很多很多的基本的东西没能搞明白,深度学习效果这么好,但决策过程可能我们还无法解释,黑箱还没变成白箱,这需要一些基本理论的研究。

这些基本理论的研究,也可能会借由其他领域取得突破,比如量子力学。之前我演讲举例说过,以色列科学家提出"信息瓶颈"理论,有一套完整的科学,他们发现这个过程和深度学习极为相似,这甚至是"深度学习"发明时预料不到的。

但我们也应该看到,现在很多重大理论上的突破,中国并不在其中。

理论创新难以规划产生

之所以不能太乐观,一方面是投入确实不算多,另一方面还是基础研究的特性,它不是能规划出来的,是冒出来的,所以对国家来说,环境培育更重要。

我们国家刚颁布了人工智能战略规划,跟美国一比较,我们做得很细。但参与拟定规划的潘云鹤院士也跟我说,基础研究方面,可能会"有心栽花花不开",可能你列了5个,但5个都没有冒大成果来。

所以政策层面,基础研究不能太受指南之类的影响,除了大方向上给予指导,可能也要鼓励一些自己选方向的发展,主要看这个人和团队。

归结起来,我们发展AI,应该是生态式的,而不是方向式的,有魄力支持一些人去做现在可能还想不到的事情。

也有人问,在AI发展里,国家和企业应该怎么分工,才能更好促进整个产业发展?

我想我们国家一方面有钱、有积极性,这是好事,但也要分清楚政府和市场的定位。

我认为政府主要做的事,应该是人工智能突飞猛进之后,如何树立一个公平经营、竞争的环境,有政策、有导向防止两极分化之类的事情。政府主要还是给一个好的环境、生态。

至于具体的研究方向、投多少钱,可能交给企业去做更合适。

地方政府现在扶持或落地一些AI项目也是这样,有钱、有政策导向是好事,但具体方向、重点领域如何选择等,交给企业更合适,因为AI里面还有很多未知的东西。

另外,现在我最担心的问题,是公有开放的机器训练平台的缺乏。

BAT都有自己的大数据平台,但让智能软件和服务行业每个中小型创业公司都建立自己的机器学习训练平台,既无必要也不可能。各地双创园区要建立共享的大数据分析平台和机器学习训练平台,这是新时代的重要基础设施,另外,也不能让中小企业被迫都使用BAT的平台,让这些企业未来受限于垄断。

最后,涉及政府层面的,还有政府数据怎么公开,让大家都用起来、共享起来,需要动一些脑筋,据说青岛在山东各地区中是做得比较好的,政府的数据共享、打通等已经做了很多工作,但如果我们能够进一步在电子病历等方面打通,可能以后智慧医疗就会发展很快。

而医疗健康之类的产业,才是AI应用、科技方案中需要优先解决的"刚需"。

现在有一些应用完全是满足吸引眼球的需求,大家一乐就结束了。刚性需求,像涉及人的健康、安全等方面可能不太容易马上反映在GDP中,但老百姓需要。比如关心残疾人、关心老人等弱势群体,都是刚性寻求,我们的AI不能完全朝着高校、白领等年轻人群做,否则很容易两极分化,政府应该在其中有一些引导。

AI初创公司命运魔咒

对于AI初创公司,之前还有一些魔咒。过去,人工智能创业公司只有两个命运:一个是被大公司收购,一个是倒闭。

AI公司要在卖产品、授权、广告、服务模式中找到新的赚钱末路,或者另外开辟技术变成钱的商业模式。AI公司要做大做强,不但要有一技之长,而且要有自己的平台和特有的数据,软件和硬件都要有过人的实力。

现在,人工智能企业还是以高技术的为主,未必都是企业家,真正让技术和商业结合,找到帮助企业成长的模式,还是一个难题。

所以我的判断是让更多技术型人才和商业型人才结合。

人工智能肯定还会冒出很多新技术,也会产生很大的市场,几百亿、几千亿之类的都有可能,但也需要时间。

我们看到国外的统计材料,一个新的技术出来变成十亿的市场要二十年,变成一百亿的市场可能要三四十年,需要一个过程。

所以现在看起来,今后十到十五年,真正变成市场的技术,可能不是这几年变出来的,肯定在应有的技术方面如何创新商业模式,要在这方面动脑筋,不光是技术上有新的发明,在商业模式上还要有新的创新,结合起来才可以把新的技术用好。

给年轻学子的建议

对一些年轻人想从事AI,我有一个基本的判断,人工智能从科研角度来讲,它就是计算机科学的前沿研究,从应用来讲也是计算机的应用。

本质上是计算机的技术,是计算技术,虽然可以从脑科学学到一些东西,从数学里拿到一些东西,但是离不开计算机的基本技术,所以在国外人工智能的一些学习者学习课程,开课都开在计算机系里面,极少有搞一个人工智能学院、系等。

首先要搞清楚这是一个计算机学科的重要的组成部分,所以离不开计算机的本身,如果抛开计算机是不行的,想投入这个行业的人,至少把计算机的一些基本的课程要学的比较扎实,包括算法的课程、系统结构、软件等都是基础,现在还没有案例说:缺少计算机基础的人可以做好人工智能。

还有就是明确科幻、舆论和科研之间的距离,宣传总是会超前一些。比如一讲就是机器要超过人,通讯之间不需要机器等,一讲就是很新奇的想法,很吸引人,对这个难度要充分的估计,不是这么简单的。

现在有一些被广泛传播的实验,比如一个人在国外,一个人在国内,两个人不说话,脑之间有脑电波收到一个信号,给到美国去,两个人不见面,我想说你好,这个信号就会通过脑电波传到你的脑电波里面去,那个人就知道你在讲你好,这样的实验已经有了,但是真正所谓的脑脑之间完全靠电波来联系,不是做两个例子,这是很长的路要走。

人脑是多少万年的进化,所以年轻人不要觉得未来把脑科学的东西变成人工智能的东西,好像马上就可以应用,得有一种走艰苦路的思想准备,不是一天两天就可以搞成的。

总而言之,人工智能任重而道远,最后引用一首诗与大家共勉:

莫言下岭便无难,

赚得行人空欢喜。

正入万山圈子里,

一山放过一山拦。

——宋•杨万里《过松原晨炊漆公店》

大咖来信往期回顾

大咖来信 | 李开复:美国AI见闻录

大咖来信 | 姚期智:算法将推动下一波AI浪潮,现有革新将达极限

欢迎大家关注我们的专栏:量子位 - 知乎专栏

诚挚招聘

量子位正在招募编辑/记者,工作地点在北京中关村。期待有才气、有热情的同学加入我们!相关细节,请在量子位公众号(QbitAI)对话界面,回复"招聘"两个字。

量子位 QbitAI

վ'ᴗ' ի 追踪AI技术和产品新动态



via 量子位 - 知乎专栏 http://ift.tt/2zkHfRX
RSS Feed

RSS5

IFTTT

百行代码构建神经网络黑白图片自动上色系统

使用神经网络对图片进行风格化渲染是计算机视觉领域的热门应用之一。本文将向你介绍一种简单而有效的黑白图片上色方法,仅需 100 行代码,你也可以搭建自己的神经网络,几秒钟内让计算机自动完成手动工作需要几个月的任务。


今年 7 月,Amir Avni 用神经网络向 Reddit 的 Colorization 社区宣战——那是一个为历史黑白照片上色的版面,用户们通常使用的工具是 Photoshop。


社区用户们惊讶于 Amir 的深度学习系统。以前人们需要几个月手工上色的任务在计算机那里只需要几秒钟就完成了。我也被 Amir 的神经网络迷住了,所以在看到结果之后我开始试着复现它。首先,让我们看看我们自动上色的成果/失败品。



目前,图片上色的工作主要由人们通过 Photoshop 手工完成,这需要相当多的工序和时间。


简而言之,一张照片可能需要一个月的时间来上色。对于画师来说,这还意味着很多研究工作,一张人脸可能需要 20 张粉色、绿色和蓝色图层,经过不断调整最终才能获得正确的效果。


本文面向初学者,如果你认为自己对于深度学习理解不足,可先看看:

http://ift.tt/2yD5Gda

http://ift.tt/2yNr0bU

以及 Andrej Karpathy 的 CS231 课程视频:https://www.youtube.com/watch?v=LxfUGhug-iQ


本文将展示如何三步构建自己的神经网络上色系统。


第一部分先解释核心逻辑。我们会构建一个 40 行的神经网络作为「Alpha」上色机器人,其中没有应用到太多深度技术,这个过程会让我们熟悉模型的核心机制。


第二部是创建一个可以泛化的神经网络——我们的「beta」版本。它可以让我们对此前未见的图片进行上色。


在「正式版」中,我们会将神经网络与分类器相结合。我们会使用训练过 120 万张图片的 Inception ResNet V2,为了让上色风格更符合现代审美,我们使用 Unsplash 上的图片来训练神经网络。


该项目的 Jupyter Notebook:http://ift.tt/2xEXDwk

FloydHub:http://ift.tt/2kMBtSE

GitHub:http://ift.tt/2xDBu1d

以及 FloydHub 上的云 GPU 实验:http://ift.tt/2kN88aX


核心逻辑

在本节中,我会介绍如何渲染图像,数字色彩的机理以及神经网络的主要逻辑。黑白图片可以在像素网格中表示。每个像素由对应其亮度的数值,范围在 0-255 之间,对应从黑到白。


彩色图像(RGB)由三个层组成:红色层、绿色层与蓝色层。若将白色背景上一片绿叶的图片分析为三个通道。直观地,你可能认为树叶只存在于绿色层。但是正如你所见到的,树叶在三个通道中都出现了,这是因为图层不仅决定颜色,还决定亮度。



为了实现白色,你需要让三种颜色的分布平均,通过为红色和蓝色加入相同数值——结果就是绿色变得更亮了。所以,彩色图像使用三个通道的数值对比对颜色进行编码。


对于黑白图片,每个图层的数值都是 0-255 之间的相同值。如果所有通道数值为 0,则这个像素为黑色。你可能知道神经网络会在输入与输出之间构建联系。将这个思路归纳到我们的着色任务中——神经网络需要找到灰度图像和彩色图像之间的联系。


再准确一点,我们在寻找的是将灰度值链接到三色图层数值的方法。


Alpha 版本

我们将从神经网络的简单版本开始,先来为这张图片中的人脸进行着色。这样你就可以熟悉模型的核心机制了。


只需 40 行代码,我们就可以做到下图中的着色效果。下图中间是神经网络的着色,而右侧是原图。神经网络也经过了这张图的训练。在 Beta 版本的段落中我们将对此进行详细解释。



色彩空间

首先,我们需要用算法来改变颜色通道,从 RGB 到 Lab。L 代表亮度,而 a 和 b 代表颜色光谱绿-红和蓝-黄。


正如下图所示,Lab 编码的图片有一个灰度层,而颜色层由三个减少为两个。这意味着我们可以在最终的预测中使用原来的灰度图片,同时只需要预测两个通道。



从实验上来说,人类眼睛里大约 94% 的细胞是用来探测亮度的,只有剩下 6% 是用来感应颜色的。正如你在上图中所看到的,灰度图比颜色图看起来清楚多了,这也是我们需要在神经网络输出中保留灰度图的另一个原因。

从黑白到彩色

神经网络的最终预测就像这样:我们有一张灰度图的输入,我们希望以此来预测两个色彩图层,Lab 中的 ab。最终的图像包括了输入的灰度图层 L 和预测的两个图层,最终组成 Lab 图片。



为了将一层转换为两层,我们需要使用卷积滤波器。你可以把他们想象为 3D 眼镜中的蓝/红色偏振镜。每个偏振镜都会决定我们看到的图片是什么样的,它可以突出或删除图片中的部分信息。神经网络也可以从一个/多个过滤器组合之上创造新的图像。


对于卷积神经网络而言,每一个滤波器都会自动调整以帮助达到预期的结果。我们先要从堆叠数百个滤波器,并将它们塞进两个颜色图层 a、b 中做起。不过首先,我们来看看代码。


在 FloydHub 中部署代码

如果你不太了解 FloydHub,你可以先看看它的安装指南:

http://ift.tt/2kuQPKF

或我的上手指南:

http://ift.tt/2yD5Gda


Alpha 版本

安装完 FloydHub 后,键入下列命令:

git clone https://github.com/emilwallner/Coloring-greyscale-images-in-Keras

打开文件夹,启动 FloydHub。

cd Coloring-greyscale-images-in-Keras/floydhub
floyd init colornet

FloydHub 的网络控制面板就在网页里。系统将提示你创建一个名为 colornet 的新 FloydHub 项目。一旦完成,回到你的终端并运行相同的 init 命令。

floyd init colornet

好了,开始运行我们的程序:

floyd run --data emilwallner/datasets/colornet/2:data --mode jupyter --tensorboard

注意:我们已经在 FloydHub 上安装了一个公开数据集(我已经上传了),数据集的目录在这里:

--dataemilwallner/datasets/colornet/2:data

你可以直接在 FloydHub 上使用这个数据集(其他的也是)并且:

  • 通过--tensorboard 指令开启 Tensorboard
  • 通过--mode jupyter 指令运行 Jupyter Notebook 模式
  • 如果你有可用 GPU,你可以在命令行中加入 GPU flag: --gpu,这样训练的速度可以大约快上 50 倍。

在 FloydHub 网站的 Jobs 标签下,点击 Jupyter Notebook 链接,并找到这个文件:

floydhub/Alpha version/working_floyd_pink_light_full.ipynb

打开它,并运行所有代码块,随着逐渐增加的 epoch 值,我们可以体会神经网络是如何学习的。

model.fit(x=X, y=Y, batch_size=1, epochs=1)

首先从 epoch 值为 1 开始,逐渐增加到 10、100。Epoch 的数值表示神经网络从训练集图像中学习的次数。在训练完神经网络后,你可以在的 img_result.png 主文件夹中找到结果图。

# Get images image = img_to_array(load_img('woman.png')) image = np.array(image, dtype=float) # Import map images into the lab colorspace X = rgb2lab(1.0/255*image)[:,:,0] Y = rgb2lab(1.0/255*image)[:,:,1:] Y = Y / 128 X = X.reshape(1, 400, 400, 1) Y = Y.reshape(1, 400, 400, 2) model = Sequential() model.add(InputLayer(input_shape=(None, None, 1))) # Building the neural network model = Sequential() model.add(InputLayer(input_shape=(None, None, 1))) model.add(Conv2D(8, (3, 3), activation='relu', padding='same', strides=2)) model.add(Conv2D(8, (3, 3), activation='relu', padding='same')) model.add(Conv2D(16, (3, 3), activation='relu', padding='same')) model.add(Conv2D(16, (3, 3), activation='relu', padding='same', strides=2)) model.add(Conv2D(32, (3, 3), activation='relu', padding='same')) model.add(Conv2D(32, (3, 3), activation='relu', padding='same', strides=2)) model.add(UpSampling2D((2, 2))) model.add(Conv2D(32, (3, 3), activation='relu', padding='same')) model.add(UpSampling2D((2, 2))) model.add(Conv2D(16, (3, 3), activation='relu', padding='same')) model.add(UpSampling2D((2, 2))) model.add(Conv2D(2, (3, 3), activation='tanh', padding='same')) # Finish model model.compile(optimizer='rmsprop',loss='mse') #Train the neural network model.fit(x=X, y=Y, batch_size=1, epochs=3000) print(model.evaluate(X, Y, batch_size=1)) # Output colorizations output = model.predict(X) output = output * 128 canvas = np.zeros((400, 400, 3)) canvas[:,:,0] = X[0][:,:,0] canvas[:,:,1:] = output[0] imsave("img_result.png", lab2rgb(cur)) imsave("img_gray_scale.png", rgb2gray(lab2rgb(cur)))

运行神经网络的 FloydHub 命令:

floyd run --data emilwallner/datasets/colornet/2:data --mode jupyter --tensorboard


技术说明

简单来说,输入就是以网格表示的黑白图像,输出是两个具有颜色值的网格。在输入和输出之间用滤波器将它们连接起来。这是一个卷积神经网络。

从左侧开始,分别是 B&W 输入、滤波器和神经网络的预测。


我们需要在相同的区间将预测值和真实值建立映射,从而将值进行比较。区间的范围在-1 到 1 之间。为了映射预测值,我们使用了 tanh 激活函数。tanh 函数的任意输入的输出值都在-1 到 1 之间。


真实的颜色值分布在-128 到 128 的区间内。这是 Lab 色彩空间的默认区间。用 128 除这些值就能获得-1 到 1 的区间分布。这种「标准化」操作使我们能比较预测的误差。


计算除最后的误差之后,网络将更新滤波器以减少总误差。网络会持续迭代这个过程直到误差尽可能的小。接下来我们将描述代码片段中的一些想法与表达。

X = rgb2lab(1.0/255*image)[:,:,0]
Y = rgb2lab(1.0/255*image)[:,:,1:]

1.0/255 表示我们使用了一个 24 比特的 RGB 色彩空间,意味着在每个色彩通道中使用 0-255 之间的一个数字,总共有 1670 万个色彩组合。


由于人类只能感知 200 万到 1000 万种颜色,使用这么大的色彩空间不太必要。

Y = Y / 128


Lab 色彩空间的分布范围和 RGB 不同。Lab 的色谱范围从-128 到 128。通过用 128 除输出层的值,可以将范围转换为-1 到 1。


我们的神经网络的输出也是在这个范围内,因此可以互相匹配。


在使用 rgb2lab() 函数转换色彩空间后,我们用 [ : , : , 0] 选择灰度层,这是神经网络的输入,[ : , : , 1: ] 选择的是绿-红、蓝-黄这两个层。在训练了神经网络之后,根据最后预测结果生成图像。

output = model.predict(X)
output = output * 128


在这里,我们使用灰度图像作为输入,并用于训练神经网络。我们对所有的位于-1 到 1 范围内输出乘上 128,从而得到 Lab 色彩空间的真实颜色。

canvas = np.zeros((400, 400, 3))
canvas[:,:,0] = X[0][:,:,0]
canvas[:,:,1:] = output[0]

最后,通过三层全为 0 值的网格创建一个黑色 RGB 画布,然后从测试图像中复制灰度图像,并将这两个颜色层添加到 RGB 画布上去,最后将这个像素值阵列转换为一张图像。


研究经验

  • 阅读研究文献是个难关:一旦我总结了每一篇论文中的核心特征之后,浏览论文就变得容易多了,我还学会将细节放入特定的背景中理解。
  • 从简单的开始很关键:我在网上找到的大多数实现都是 2000 到 10000 行的长度的代码。这使得理解问题的核心逻辑变得很困难。一旦获得主要思维框架之后,阅读代码实现和研究文献就变得容易多了。
  • 探索开源项目:为了粗略理解写代码的要领,我在 GitHub 上浏览了 50-100 个着色项目。
  • 过程不总是很顺利:在刚开始的时候,网络只能生成红色和黄色。我最初用 ReLU 函数作为最后一层的激活函数,由于它只能将数字映射为正值,而无法输出负值,即蓝色和绿色的色谱。通过改为使用 tanh 为激活函数解决了这个问题。
  • 从理解到加速:我见过的大多数的实现工作得很快但很难使用。而我更注重模型革新的速度,而不是代码执行速度。


beta 版本

如果想理解 alpha 版本的弱点,可以尝试为未训练过的图片上色,可以看到,它通常会给出糟糕的结果,因为网络只对信息进行了记忆,从而无法为没见过的图像上色。我们将以这个方向在 beta 版本做出改进,即让它学会泛化。


特征提取器

我们的网络能找到连接灰度图像和其色彩版本的特征。


假设你需要对黑白图像上色,但因为一些限制你一次只能看到 9 个像素。你可以从左上方到右下方扫描每一张图像并尝试预测每一个像素对应的颜色。



例如,这 9 个像素是下方所示的女人的鼻孔的边缘。可以想象,这几乎不可能做出正确的上色。因此需要分成几步来完成。


首先,寻找简单的模式:对角线、所有的黑色像素,等等。在每一个方块中寻找相同的模式并移除不匹配的像素。从 64 个小型滤波器中生成 64 张新图像。



当再次扫描图像的时候,你能找到与已经检测到的相同的小范围模式。为了获得对图像的高层次的理解,需要将图像尺寸减半。



目前仍然只有一个 3x3 滤波器用于扫描每一张图像。但通过用低级的滤波器组合成新的 9 像素滤波器,可以探测更加复杂的模式。每个像素组合可能用于探测一个半圆、一个点或一条线。你可以重复地在图像中提取相同的特征。这一次总共生成了 128 张新的过滤图像。


经过几步的过滤之后,过滤图像的样子可能如下图所示:



之前提到过,这个过程从低级的特征开始,比如边缘,靠近输出的层将其组合成模式,然后再组合成面部细节,最后转换成一张脸。这个视频教程中提供了更详细的解释:https://www.youtube.com/watch?v=AgkfIQ4IGaM


整个过程和大部分处理视觉的神经网络很相似。这里用的神经网络的类型是卷积神经网络。这些网络组合多个滤波器以理解图像中的语境。

从特征提取到色彩

神经网络以试验和调试误差的方式训练。它首先为每一个像素给出一个随机预测,基于每一个像素计算出的误差,通过反向传播提升特征提取的性能。


在我们的案例中,调整网络的目标是颜色的匹配度和目标的定位。我们的网络从将所有目标转换为褐色开始。褐色是和所有其它颜色相差最小的颜色,因此产生的误差最小。


由于大多数的训练数据都很相似,网络在分辨不同的目标时遇到了困难。这将使网络在生成更加细致的颜色时失败。这将是我们在完整的版本中要探索的问题。


以下是 beta 版本的代码,随后是代码的技术解释。

# Get images X = [] for filename in os.listdir('../Train/'):     X.append(img_to_array(load_img('../Train/'+filename))) X = np.array(X, dtype=float) # Set up training and test data split = int(0.95*len(X)) Xtrain = X[:split] Xtrain = 1.0/255*Xtrain #Design the neural network model = Sequential() model.add(InputLayer(input_shape=(256, 256, 1))) model.add(Conv2D(64, (3, 3), activation='relu', padding='same')) model.add(Conv2D(64, (3, 3), activation='relu', padding='same', strides=2)) model.add(Conv2D(128, (3, 3), activation='relu', padding='same')) model.add(Conv2D(128, (3, 3), activation='relu', padding='same', strides=2)) model.add(Conv2D(256, (3, 3), activation='relu', padding='same')) model.add(Conv2D(256, (3, 3), activation='relu', padding='same', strides=2)) model.add(Conv2D(512, (3, 3), activation='relu', padding='same')) model.add(Conv2D(256, (3, 3), activation='relu', padding='same')) model.add(Conv2D(128, (3, 3), activation='relu', padding='same')) model.add(UpSampling2D((2, 2))) model.add(Conv2D(64, (3, 3), activation='relu', padding='same')) model.add(UpSampling2D((2, 2))) model.add(Conv2D(32, (3, 3), activation='relu', padding='same')) model.add(Conv2D(2, (3, 3), activation='tanh', padding='same')) model.add(UpSampling2D((2, 2))) # Finish model model.compile(optimizer='rmsprop', loss='mse') # Image transformer datagen = ImageDataGenerator(         shear_range=0.2,         zoom_range=0.2,         rotation_range=20,         horizontal_flip=True) # Generate training data batch_size = 50 def image_a_b_gen(batch_size):     for batch in datagen.flow(Xtrain, batch_size=batch_size):         lab_batch = rgb2lab(batch)         X_batch = lab_batch[:,:,:,0]         Y_batch = lab_batch[:,:,:,1:] / 128         yield (X_batch.reshape(X_batch.shape+(1,)), Y_batch) # Train model TensorBoard(log_dir='/output') model.fit_generator(image_a_b_gen(batch_size), steps_per_epoch=10000, epochs=1) # Test images Xtest = rgb2lab(1.0/255*X[split:])[:,:,:,0] Xtest = Xtest.reshape(Xtest.shape+(1,)) Ytest = rgb2lab(1.0/255*X[split:])[:,:,:,1:] Ytest = Ytest / 128 print model.evaluate(Xtest, Ytest, batch_size=batch_size) # Load black and white images color_me = [] for filename in os.listdir('../Test/'):         color_me.append(img_to_array(load_img('../Test/'+filename))) color_me = np.array(color_me, dtype=float) color_me = rgb2lab(1.0/255*color_me)[:,:,:,0] color_me = color_me.reshape(color_me.shape+(1,)) # Test model output = model.predict(color_me) output = output * 128 # Output colorizations for i in range(len(output)):         cur = np.zeros((256, 256, 3))         cur[:,:,0] = color_me[i][:,:,0]         cur[:,:,1:] = output[i]         imsave("result/img_"+str(i)+".png", lab2rgb(cur))

下面是 FloydHub 指令,用来运行 Beta 神经网络:

floyd run --data emilwallner/datasets/colornet/2:data --mode jupyter --tensorboard


技术说明

该网络与其他视觉神经网络的主要不同是像素位置的重要性。在上色网络中,图像大小或比例在网络中保持不变。在其他类型的网络中,图像距离最后一层越近就越失真。


分类网络中的最大池化层增加了信息密度,同时也使图像失真。它只对信息估值,而不是图像的布局。在上色网络中,我们使用步幅 2(带 padding)以减少一半的宽度和高度。这也会增加信息密度,但不会使图像失真。



两个进一步的区别是:上采样层和图像比例的保持问题。分类网络只关心最后的分类。因此,整个网络架构将持续降低图像的大小和质量。


上色网络保持图像比率的稳定。这通过添加空白填充(如上图所示)来完成。此外,每个卷积层剪切图像。它通过参数 padding='SAME'来完成。


为了使图像大小翻倍,上色网络使用上采样层http://ift.tt/2eZ8PrW)。

for filename in os.listdir('/Color_300/Train/'):
X.append(img_to_array(load_img('/Color_300/Test'+filename)))


该循环首先计算目录中所有文件名称,然后通过图像目录进行迭代,将图像转换成像素阵列。最后,将它们连接成为巨型向量(giant vector)。

datagen = ImageDataGenerator(
shear_range=0.2,
zoom_range=0.2,
rotation_range=20,
horizontal_flip=True)


我们可以使用 ImageDataGenerator(http://ift.tt/2cWx4s8)调整图像生成器的设置。这样,每个图像都不一样,从而提高学习率。shear_range 使图像向左或向右倾斜,另一种设置是放大、旋转和水平翻转。

batch_size = 50
def image_a_b_gen(batch_size):
for batch in datagen.flow(Xtrain, batch_size=batch_size):
lab_batch = rgb2lab(batch)
X_batch = lab_batch[:,:,:,0]
Y_batch = lab_batch[:,:,:,1:] / 128
yield (X_batch.reshape(X_batch.shape+(1,)), Y_batch)


我们使用文件夹 Xtrain 中的图像,来生成基于以上设置的图像。然后我们为 X_batch 提取黑色层和白色层,并为两个色彩层(color layer)提取两个颜色值。

model.fit_generator(image_a_b_gen(batch_size), steps_per_epoch=1, epochs=1000)


GPU 越强大,可以拟合的图像就越多。通过这个设置,你可以每次迭代中使用 50-100 张图像。steps_per_epoch 通过将训练的图像数量除以批次大小(batch size)来计算。


例如,如果有 100 张图像,而批次大小为 50,则 steps_per_epoch 为 2。epoch 表示训练全部图像的次数。在一个 Tesla K80 GPU 上用 10000 张图像训练 21 个 epoch 需要大约 11 个小时。


研究经验

  • 在大规模运行之前先进行大量小批次实验。即使实验了二三十次,还是能发现错误。因为运行不代表就一定奏效。神经网络中的 bug 通常比传统编程错误更加细微。
  • 更多样的数据集使图像更加呈褐色。如果你的图像很相似,那么无需过于复杂的架构,你就可以得到不错的结果。缺点是网络的泛化效果不好。
  • 形状、形状、形状。每个图像的大小必须确定且与网络比例相符。一开始,我用的是一个大小 300 的图像。把这个图像分割了三次,得到 150、75 和 35.5 的图像。结果是丢了一半的像素!这导致很多不好的结果,直到我意识到最好使用 2 的幂次方:2、8、16、32、64、256 等。
  • 创建数据集:a)停用.DS_Store 文件。b)有创造性。我最后使用了 Chrome console 脚本和扩展程序 ImageSpark 来下载文件。c)复制抓取的原始文件,使你的清理脚本结构化。

完整版

我们最终版的上色神经网络有四个组成部分。我们将之前的网络分割成编码器和解码器。在二者中间,使用一个融合层。如果你对分类网络不是很了解,推荐学习该教程:http://ift.tt/1eG8tnt


与编码器并行,输入图像还在最强大的分类器之一 Inception ResNet v2 中运行。这是一个在 120 万张图像上训练的神经网络。我们提取分类层,然后将它与编码器的输出融合起来。



原始论文详细可视化:http://ift.tt/2k1ULDl


通过从分类器到上色网络的迁移学习,该网络可以了解图像中有什么。这样就可以使该网络通过上色机制匹配目标表示(object representation)。


这里是部分验证图像,仅使用 20 张图像用于网络训练。



大部分图像的输出结果效果不好。但是我在一个较大的验证集(包含 2500 个图像)上找到了一些不错的图像。在更多图像上训练模型可以给出更一致的结果,但是大多数图像经过处理后呈褐色。我使用多个图像(包括验证图像)进行了一些实验,全部实验列表:http://ift.tt/2kQ2tRx


这里是之前研究中最常见的架构:

常见色彩空间:Lab、YUV、HSV 和 LUV

常见损失函数:均方差、分类、加权分类


我选择了「融合层」架构(上述列表的第五个)。


因为融合层的输出结果最好,而且在 Keras 中理解和复现都更加容易。尽管它不是最强大的上色网络,但很适合初学者,而且最适合理解上色问题的动态。


我使用 Federico Baldassarre 等人论文中设计的神经网络http://ift.tt/2kLPcsZ),在 Keras 中进行了自己的操作。


技术说明

我们想级联或融合多个模型,Keras 的功能性 API 非常合适。(API 地址:http://ift.tt/2jqmEzS



首先,我们下载 Inception ResNet v2 神经网络,加载权重。由于我们将并行使用这两个模型(Inception ResNet v2 和编码器),我们需要明确要使用的模型。这两个模型可以使用带 TensorFlow 后端的 Keras 实现:

inception = InceptionResNetV2(weights=None, include_top=True)
inception.load_weights('/data/inception_resnet_v2_weights_tf_dim_ordering_tf_kernels.h5')
inception.graph = tf.get_default_graph()


我们使用图像微调来创建批次,然后将它们转换成黑白图像,在 Inception ResNet 模型中运行。

grayscaled_rgb = gray2rgb(rgb2gray(batch))
embed = create_inception_embedding(grayscaled_rgb)


首先,我们必须调整图像的大小,使之适应 Inception 模型。然后使用预处理器根据模型对像素和颜色值进行格式处理。最后,在 Inception 模型中运行该图像,并提取模型的最后一层。

def create_inception_embedding(grayscaled_rgb):
grayscaled_rgb_resized = []
for i in grayscaled_rgb:
i = resize(i, (299, 299, 3), mode='constant')
grayscaled_rgb_resized.append(i)
grayscaled_rgb_resized = np.array(grayscaled_rgb_resized)
grayscaled_rgb_resized = preprocess_input(grayscaled_rgb_resized)
with inception.graph.as_default():
embed = inception.predict(grayscaled_rgb_resized)
return embed


我们回过头来看一下生成器。每一个批次都生成 20 个图像,格式如下。这在 Tesla K80 GPU 上需要花费大约一个小时。在没有内存问题的情况下,该模型最多可以一次性生成 50 个图像。

yield ([X_batch, create_inception_embedding(grayscaled_rgb)], Y_batch)


这和我们的 colornet 模型的格式相匹配。

model = Model(inputs=[encoder_input, embed_input], outputs=decoder_output)


将 encoder_input 馈送至编码器模型,然后在融合层中把编码器模型的输出和 embed_input 融合起来;融合层的输出作为解码器模型的输入,然后返回最终输出 decoder_output。

fusion_output = RepeatVector(32 * 32)(embed_input) 
fusion_output = Reshape(([32, 32, 1000]))(fusion_output)
fusion_output = concatenate([fusion_output, encoder_output], axis=3)
fusion_output = Conv2D(256, (1, 1), activation='relu')(fusion_output)


在融合层中,我们首先将带有 1000 个类别的层级乘 1024 (32 * 32)。这样,我们就使用 Inception 模型的最后一层得到了 1024 个单元。


然后将它们从 2D 重塑为 3D,即将维度更改为 32 x 32x1000 的张量。然后把它们和编码器模型的输出连接起来。我们使用 256 个 1X1 卷积核的卷积网络,馈送到 ReLU 激活函数后作为融合层的最终输出。

下一步

为图像上色是一个非常有趣迷人的问题。它是一个科学问题,也是一个艺术问题。我写这篇文章的目的就是使大家可以了解图像上色,并且继续开发相关技术。以下是一些初学建议:

  • 使用另一个预训练模型实现它
  • 尝试一个不同的数据集
  • 使用更多图像来提高网络的准确率
  • 在 RGB 色彩空间内构建一个放大器。创建一个与上色网络类似的模型,该模型使用高饱和彩色图像作为输入,正确的彩色图像作为输出。
  • 实现加权分类
  • 将该网络应用到视频。不用担心上色,试图使图像之间的转换更加连贯。你还可以对较大的图像进行一些类似的操作。

你还可以使用 FloydHub,用这三个版本的上色神经网络为黑白图像上色。

  • 对于 alpha 版本,只需要将 woman.jpg 文件替换成你自己的同名文件即可(图像大小 400x400)。
  • 对于 beta 版本和完整版本,将你的图像添加至 Test 文件夹,然后运行 FloydHub 命令。如果 Notebook 正在运行的话,你还可以将 Notebook 中的图像直接上传至 Test 文件夹。注意:这些图像必须是 256x256 像素。还有,你可以上传彩色图像作为测试图像,因为系统可以自动将它们转换成黑白图像。

代码

注意:使用下列代码时我从 Keras 序列模型转向了它们的功能性 API。(文档:http://ift.tt/2jqmEzS

# Get images X = [] for filename in os.listdir('/data/images/Train/'):     X.append(img_to_array(load_img('/data/images/Train/'+filename))) X = np.array(X, dtype=float) Xtrain = 1.0/255*X #Load weights inception = InceptionResNetV2(weights=None, include_top=True) inception.load_weights('/data/inception_resnet_v2_weights_tf_dim_ordering_tf_kernels.h5') inception.graph = tf.get_default_graph() embed_input = Input(shape=(1000,)) #Encoder encoder_input = Input(shape=(256, 256, 1,)) encoder_output = Conv2D(64, (3,3), activation='relu', padding='same', strides=2)(encoder_input) encoder_output = Conv2D(128, (3,3), activation='relu', padding='same')(encoder_output) encoder_output = Conv2D(128, (3,3), activation='relu', padding='same', strides=2)(encoder_output) encoder_output = Conv2D(256, (3,3), activation='relu', padding='same')(encoder_output) encoder_output = Conv2D(256, (3,3), activation='relu', padding='same', strides=2)(encoder_output) encoder_output = Conv2D(512, (3,3), activation='relu', padding='same')(encoder_output) encoder_output = Conv2D(512, (3,3), activation='relu', padding='same')(encoder_output) encoder_output = Conv2D(256, (3,3), activation='relu', padding='same')(encoder_output) #Fusion fusion_output = RepeatVector(32 * 32)(embed_input)  fusion_output = Reshape(([32, 32, 1000]))(fusion_output) fusion_output = concatenate([encoder_output, fusion_output], axis=3)  fusion_output = Conv2D(256, (1, 1), activation='relu', padding='same')(fusion_output) #Decoder decoder_output = Conv2D(128, (3,3), activation='relu', padding='same')(fusion_output) decoder_output = UpSampling2D((2, 2))(decoder_output) decoder_output = Conv2D(64, (3,3), activation='relu', padding='same')(decoder_output) decoder_output = UpSampling2D((2, 2))(decoder_output) decoder_output = Conv2D(32, (3,3), activation='relu', padding='same')(decoder_output) decoder_output = Conv2D(16, (3,3), activation='relu', padding='same')(decoder_output) decoder_output = Conv2D(2, (3, 3), activation='tanh', padding='same')(decoder_output) decoder_output = UpSampling2D((2, 2))(decoder_output) model = Model(inputs=[encoder_input, embed_input], outputs=decoder_output) #Create embedding def create_inception_embedding(grayscaled_rgb):     grayscaled_rgb_resized = []     for i in grayscaled_rgb:         i = resize(i, (299, 299, 3), mode='constant')         grayscaled_rgb_resized.append(i)     grayscaled_rgb_resized = np.array(grayscaled_rgb_resized)     grayscaled_rgb_resized = preprocess_input(grayscaled_rgb_resized)     with inception.graph.as_default():         embed = inception.predict(grayscaled_rgb_resized)     return embed # Image transformer datagen = ImageDataGenerator(         shear_range=0.4,         zoom_range=0.4,         rotation_range=40,         horizontal_flip=True) #Generate training data batch_size = 20 def image_a_b_gen(batch_size):     for batch in datagen.flow(Xtrain, batch_size=batch_size):         grayscaled_rgb = gray2rgb(rgb2gray(batch))         embed = create_inception_embedding(grayscaled_rgb)         lab_batch = rgb2lab(batch)         X_batch = lab_batch[:,:,:,0]         X_batch = X_batch.reshape(X_batch.shape+(1,))         Y_batch = lab_batch[:,:,:,1:] / 128         yield ([X_batch, create_inception_embedding(grayscaled_rgb)], Y_batch) #Train model       tensorboard = TensorBoard(log_dir="/output") model.compile(optimizer='adam', loss='mse') model.fit_generator(image_a_b_gen(batch_size), callbacks=[tensorboard], epochs=1000, steps_per_epoch=20) #Make a prediction on the unseen images color_me = [] for filename in os.listdir('../Test/'):     color_me.append(img_to_array(load_img('../Test/'+filename))) color_me = np.array(color_me, dtype=float) color_me = 1.0/255*color_me color_me = gray2rgb(rgb2gray(color_me)) color_me_embed = create_inception_embedding(color_me) color_me = rgb2lab(color_me)[:,:,:,0] color_me = color_me.reshape(color_me.shape+(1,)) # Test model output = model.predict([color_me, color_me_embed]) output = output * 128 # Output colorizations for i in range(len(output)):     cur = np.zeros((256, 256, 3))     cur[:,:,0] = color_me[i][:,:,0]     cur[:,:,1:] = output[i]     imsave("result/img_"+str(i)+".png", lab2rgb(cur))


以下是运行完整版神经网络的 FloydHub 命令:

floyd run --data emilwallner/datasets/colornet/2:data --mode jupyter --tensorboard


]]> 原文: http://ift.tt/2A1Hcb3
RSS Feed

机器知心

IFTTT

一文概览卷积神经网络中的类别不均衡问题

该论文的作者以两种典型的不均衡为例,系统地研究并比较了解决 CNN 中类别不均衡问题的各种方法,在三个常用数据集MINIST、CIFAR-10 和 ImageNet上用统一标准进行实验,得出了综合性的结果,富有参考和指导意义。


论文链接:http://ift.tt/2hKX1ue


摘要:在这篇论文中,我们系统地研究了卷积神经网络中类别不均衡会给分类性能带来的影响,并且对比了常用于解决该问题的一些方法。类别不均衡是一个普遍的问题,虽然这个问题在分类机器学习中被广泛地研究,然而在深度学习领域很少有可用的系统性研究。在我们的研究中,我们用了三个复杂度依次递增的基准测试集来研究类别不均衡对性能的影响,并对用来解决这个问题的几种方法做了广泛对比,这三个数据集分别是:MINIST、CIFAR-10 和 ImageNet,这 4 种常用解决方法分别是:过采样(oversampling,相当于插值),下采样(downsampling,相当于压缩),两阶段训练(two-phase training),以及阈值化(threholding),阈值化可以补偿先验的类别概率。因为全局准确率在不均衡的数据中是很难确定的,所以我们的主要评价指标是 ROC 曲线下面的面积(ROC AUC)。从我们的实验可以得出以下结论:(i) 不均衡数据会给分类性能带来损害;(ii) 解决不均衡数据问题的方法中,占主导地位的是过采样,它几乎存在于所有的分析场景中; (iii) 过采样应该被用在那些需要完全消除不均衡的情况中,而下采样在只需要从一定程度消除不均衡的情况中的效果可能更好;(iv) 与一些传统的机器学习模型不同的是,过采样也不一定会造成卷积神经网络的过拟合;(v) 当对被正确分类的例子的总数感兴趣的时候,为了补偿先验类别概率,就应该使用阈值化方法。

1 引言

卷积神经网络(CNN)在很多机器学习应用领域都被越来越重视,目前在最近为计算机视觉贡献了很多当前最先进的技术成果,包括目标检测、图像分类、图像分割等等。卷积神经网络也被广泛地应用在自然语言处理和语音识别领域,在这些领域里,CNN 要么替代传统技术,要么帮助改善传统机器学习模型 [1]。卷积神经网络在模型中集合了自动特征提取器和分类器,这是它和传统机器学习技术之间最大的不同。这个特性让卷积神经网络能够学习分层表征 [2]。标准的卷积神经网络由全连接层、多个包含卷积层、激活函数层以及最大池化层的模块组成 [3,4,5]。卷积神经网络本质上就是很复杂的,所以训练和测试网络的时候需要很大的计算量,这通常都是借助于现代的 GPU 来解决的。


在现实生活的应用中,基于深度学习的一个常见问题是:在训练集中,一些类的样本量远大于其他类。这种差别被称为类别不均衡。在以下领域中有很多这种例子:比如计算机视觉 [6,7,8,9,10],医疗诊断 [11,12],欺诈检测 [13] 以及其他领域 [14,15,16],在这些领域中这个问题非常重要,某个类别(比如癌症患者)的样本频率可以比其他类别(比如非癌症患者)小 1000 倍。已经确定的是,类别不均衡问题可以给传统分类器 [17] 带来严重的性能损害,包括多层感知机在内 [18]。它既影响了在训练模型阶段的收敛,也影响到在测试集上的泛化能力。尽管这个问题也同样影响着深度学习,但是,并没有关于这个问题的可用的系统性研究。


应对不均衡问题的方法在传统机器学习模型上已经有了一些研究成果 [19,17,20,18]。最直接最通用的就是使用一些采样方法,这些方法直接对数据本身(而不是针对模型)进行处理,以提升数据的均衡性。最广泛使用的,也被证明是比较鲁棒的一种方法就是过采样(oversampling)[21]。另一个就是下采样(downsampling)。一个比较朴素的版本就是简单地把多数类中的样本随机移除 [17],这个方法被称为随机多数下采样(random majority downsampling)。类别不均衡问题也可以在分类器的层面处理。在这种情况下,学习算法应该被修正,例如,给误分类的样本引入不同的权重系数 [22],或者具体地调节先验类别概率 [23]。


之前的研究证展示了深度神经网络中与敏感学习(cost sensitive learning)相关的一些结果 [24,25,26]。用于神经网络训练的新的损失函数也被开发出了 [27]。最近,有人提出了一种用于卷积神经网络的新方法,就是分两阶段去训练网络,首先在均衡数据上训练神经网络,然后再微调输出层 [28]。尽管在深度学习方面还没有对不均衡性进行系统性的分析,也没有可用的能够处理这种问题的方法,但是基于直觉、一些中间测试结果以及在传统机器学习上可用的一些系统性结果来看,研究者们采用的一些方法可能正在解决这个问题。根据我们对文献的调研,深度学习中使用最广泛的方法是过采样。


本文其他内容组织如下:第 2 节总结了解决不均衡问题的一些方法;第 3 节描述了我们的实验设置,给出了关于比较方法、数据集和所用测试模型的细节内容;第 4 节展示了实验结果和比较方法;最后,在第 5 节总结了整篇论文的工作。

2 解决不均衡问题的方法

解决类别不均衡问题的方法可以被分为两大类 [29]。第一大类是数据层面的方法,这类方法对训练数据进行处理,改变它的类别分布。这类方法的目标就是朝着使标准训练算法能够起作用的目标去改变数据集。另一大类则包括分类器(算法)层面的。这些方法保持训练数据集不变,仅仅调整训练(或者推理)算法。另外,结合这两类的方法也是可以使用的。在这一部分我们会概述常常被使用的这两类方法,既包含在经典机器学习模型,也包括在深度神经网络中使用的。


图 1:不均衡数据集的示例分布,包含对应的参数值。(a、 b):阶跃式不均衡,参数:ρ 和 µ;(c):线性不均衡,参数:ρ。


表 1:所用数据集总览,每类图像的数量指的是实验中用到的子数据集中完美均衡的一个。ImageNet 的图像维度是缩放之后的结果。

3 实验

3.2 这篇论文中所比较的解决不均衡问题的方法

我们总共试验了 7 种用来解决卷积神经网络中类别不均衡问题的方法,这 7 种方法包含了深度学习中使用的大多数方法:1. 随机少数过采样;2. 随机多数下采样;3. 两阶段训练,在随机过采样的数据集上进行预训练;4. 两阶段训练,在随机下采样的数据集上进行预训练;5. 使用先验概率的阈值化方法;6. 使用阈值化方法的过采样;7. 使用阈值化方法的下采样。

3.3 数据集和模型

在我们的研究中,总共使用了 3 个基准测试数据集: MNIST [52],CIFAR-10 [53],以及 ImageNet Large Scale Visual Recognition Challenge (ILSVRC) 2012 [54]。所有的数据集都被划分成了具有标签的训练集和测试集。对于每一个数据集,我们选择了不用的模型,每个模型都具有一个超参数集,这些超参数集都是在一些相关文献中使用过并且表现良好的。数据集的复杂程度和模型的复杂程度是正相关的。这使得我们在一些简单的任务上得出了一些结论,并验证了这些结论是如何推广到更加复杂的任务上的。


表 2: 在 MNIST 数据集实验中使用的 LeNet-5 卷积神经网络的架构。


表 3: 在 CIFAR-10 数据集实验中使用的 All-CNN 网络结构。


图 2: 在 ILSVRC-2012 实验中使用的 ResNet 中的单残差模块网络架构。

4. 结果

4.1 类别不均衡对分类性能的影响,以及几种解决这个问题的方法的比较


图 3: 每种方法对应的多类 ROC AUC 对比:(a - c).MNIST,(d - f).CIFAR-10,(d - f). 具有固定少数类别数目的阶跃式不均衡数据。


图 4: 每种方法对应的多类 ROC AUC 对比:(a - c).MNIST,(d - f).CIFAR-10,(d - f). 具有固定少数类别比例的阶跃式不均衡数据。


图 5:线性不均衡下每种方法对应的多类 ROC AUC 对比。

4.2 ImageNet 数据集上的结果


表 4 : ImageNet 上多类 ROC AUC 对比。

4..4 使用多类阈值化来提升准确度分数


图 6: 各种方法的准确率比较:(a - c).MNIST,(d - f).CIFAR-10,(d - f). 具有固定少数类别数目的阶跃式不均衡数据。

4.5 通过下采样和过采样减小数据集的不均衡率


图 7: MNIST 数据集中,原始不均衡度为 1000(最多和最少类别的数目比)时,通过过采样和下采样来减小不均衡度后 ROC AUC 对比。

4.6 采样方法的推广


图 8: 分别使用基线和采样方法之后,模型收敛的对比。使用 CIFAR-10 数据集,阶跃不平衡,5 个类别,不平衡比率为 50。

5. 结论

在这篇论文中,我们研究了类别不均衡问题对卷积神经网络分类性能的影响,并对比研究了解决该问题的不同的方法的效果。我们定义了两种不同类型的不均衡,并将它们参数化,也就是阶跃性不均衡和线性不均衡。然后在 MNIST,CIFAR-10 和 ImageNet (ILSVRC-2012) 数据集中分出子数据集,人为地让它们产生不均衡性。我们对比了常用采样方法、基本阈值化方法和两阶段训练方法。


与类别不均衡有关的实验结论如下:

  • 类别不均衡会对分类性能产生有害的影响。
  • 随着任务规模的扩大,类别不均衡性对分类性能的影响越大。
  • 类别不均衡的影响不能简单地以训练样本数量的不足来解释,它依赖于各类样本的分布。


根据在处理卷积神经网络中类别不均衡数据集时对各种不同方法的选择,我们得到以下结论:

  • 将多类 ROC AUC 作为评价指标时,在绝大多数情况下表现最优异的方法是过采样。
  • 对于极端不均衡比率,以及大部分类别都是少数样本的情况,下采样比过采样具有更好的效果。
  • 为了实现最佳准确率,应该使用阈值化方法来补偿先验类别概率。最可取的方法是阈值化方法和过采样的结合,然而不应该将阈值化方法和下采样方法结合。
  • 过采样方法应该应用在需要完全消除不均衡性的情况,而下采样则更适合于仅需要从一定程度上消除不均衡性的情况。
  • 与一些经典机器学习方法不同的是,过采样并不一定会在卷积神经网络中导致过拟合。


]]> 原文: http://ift.tt/2xAMkRz
RSS Feed

机器知心

IFTTT

JavaScript 之父联手近万名开发者集体讨伐 Oracle:给 JavaScript 一条活路吧!- InfoQ 每周精要848期

「每周精要」 NO. 848 2024/09/21 头条 HEADLINE JavaScript 之父联手近万名开发者集体讨伐 Oracle:给 JavaScript 一条活路吧! 精选 SELECTED C++ 发布革命性提案 "借鉴"Rust...