springboot找不到页面667vs页面了,安全联盟wwW667vsCom已栏截的占

怎么我这边667vs用不了,如何wwW667vsCom才能解除_白龙镇阳白龙镇dg6_新浪博客
怎么我这边667vs用不了,如何wwW667vsCom才能解除
8.信心问题:我有信心做好这份工作吗?
  9.市场需求问题:市场上对这个职位有需求吗?需求量大吗?
  10.时间问题:追求我的就业方向需要多长时间?我是否有时间追求我的就业方向?
  11.吃苦问题:这份工作是否很苦,我能不能吃这种苦?
  12.风险预估问题:我是否预估到从事这个职业有什么风险?我是否有能力承担这种风险?
  一般来说,衡量就业方向是否适合自己,最主要就看前面四点。只要跟我生命中最重要的东西没有冲突,又适合我的性格,还是我喜欢的工作,又能获得持续稳定的发展。多好啊!但是后面几点往往会影响我们的选择。比如,我喜欢做翻译,我的性格也比较适合做翻译,跟价值观没有冲突,又有“同声传译”这个追求目标,随着资历提高,薪资会有很大的突破(跟前面四点基本相符)。但是市场上的企业对纯翻译的需求太少,几乎没有,在企业里难以找到适合自己的工作,而且没有翻译证,也不是英文专业,还达不到做一个纯翻译的门槛(跟第六点,第九点不相符),所以就不选择翻译作为就业方向,最好是随着英语水平的不断提高,考虑今后将翻译作为兼职。
  另外,我们容易因为门槛的问题选择一个自己不喜欢不适合自己的工作,也容易因为门槛问题放弃自己喜欢的职业。比如,我现在的条件基本满足做PMC或者做一个外贸跟单员的要求。为了更容易找到一份工作,我很有可能选择这两个职位。因为,选择应聘这两个职位可以最快地解决生存的问题。但是,第一,我非常不喜欢做PMC,经常要加班。所以我一直不考虑做PMC。第二,我虽然比较喜欢做外贸跟单员。但是,如果我选择了做外贸跟单员,我的人生就会很没有追求,很压抑。因为虽然我喜欢跟客户交流,但是我不喜欢做女强人,不喜欢去拓展客户,不喜欢讲价,不喜欢在企业做管理。而且,我的性格也不适合做销售,我太老实,容易被人压价容易被欺负。所以,如果我选择做外贸跟单员,我就希望一辈子做外贸跟单员。难道一辈子做外贸跟单员吗?
  我这里特意把吃苦问题列了出来,是因为我觉得,80后很多人是不能吃苦的。吃苦问题影响了我们的就业选择。我们希望选择一个不太辛苦又高工资的工作。但是我的经验告诉我,没有容易的职业,每个职业都有它不容易的地方。如果年纪轻轻就怕吃苦,就找容易的工作,不学东西不进取,那么当年纪大了,被社会淘汰了怎么办呢?
  做教师是我小时候很多很多年的梦想,我一直觉得如果我是老师,我一定会是个优秀的老师。我非常热衷于研究适合学生的教学方法。但是自从高中做了英语科代表之后,我发现做老师没有想像中的容易。站在讲台上,一心一意希望把学生教好,但是面对不听话的学生很辛苦。因为害怕这种辛苦,我竟然退缩了。这里还有个信心问题,担心自己不能承担这种辛苦,对自己缺乏信心。如果我提前知道每个职业都不容易,我不会浪费这么多年,放弃自己小时候的梦想,放弃最适合自己的职业。但是要做教师,现在还达不到做教师的门槛。
  提到风险预估的问题,是当我们选择一个职业发展的时候,我们是否能预见到这个职业可能面临的风险,是否能承担这种风险,在出现这各种风险的时候是否能不惊慌。如果你能提前预估到风险,那么当你遇见风险时,你就不会轻易退缩,不会轻易跳槽转职,因为这些风险你都已经考虑过了。(未完待续)
    十二,教你如何选择就业方向
  看到天涯有人在问先就业再择业,还是先择业再就业的问题。我先谈谈对这个问题的看法。大学刚毕业找工作时,老师们都建议先就业再择业。我们也很慌张,因为不知道自己能做什么,怕找不到工作,就觉得应该先就业再择业,病急乱投医,什么类型的工作都找,匆匆忙忙地找了家单位就签下来。结果发现自己不适合这份工作。
  实际上,我当年对“先就业再择业”这句话有误解,我想很多人对这句话也有同样的误解,以为择业就是找一份工作,其实择业应该理解为选择就业方向,而不是一份工作那么简单。如果我们还不了解自己的就业方向,就去工作,往往会积累了不适合自己就业方向的经验。当然,对于运气好的人来说,可能第一份工作就非常适合自己。
  所以,我们最好应该先择业,再就业。择业不是选择一份具体的工作,而是选择适合自己的就业方向。
  现在手把手教你如何选择自己的就业方向,首先,把你可能的工作方向全列下来,一个人可能的工作方向无非是这几种,已掌握的技能,已有的经验,自己的专业,自己的爱好,自己的特长,小时候的梦想和家人的希望。以我为例,我可能的工作方向如下:
  1.文秘,助理(自己的专业)
  2.PMC,(已有的技能、经验)
  3.外贸 (已有的技能、经验)
  4.翻译 (自己的爱好)
  5.教师 (小时候的梦想,家人的希望)
  6.公务员 (家人的希望)
  已经把你可能的工作方向尽可能多地列下来了吗?如果你只有一个选择,那就没有什么好迷茫了,不用再往下看了。
  现在,把你每一个职业对照上面列出的12个问题,如果其中有一个职业对照这12个问题都不是问题,那么,恭喜你!!找到非常好的工作方向。但是进来看的应该都是有觉得有问题的,觉得迷茫的。有些人因为自己没做过的工作,就不确定自己是不是喜欢,是否适合;有些人对于自己喜欢的工作没有信心,有些人不满意薪资……所以要进一步做出分析选择。
  第一步,像做选择题排除法一样,把自己明确非常非常不喜欢的工作删除掉,比如,我就把PMC删掉了。不确定自己是否不喜欢的就不用删了。第二步,把自己觉得完全没有发展前景的删掉,这里,我删掉1.文秘。为什么呢?因为大家都知道文秘吃的是青春饭。(但是,如果喜欢在企业里工作,文秘还是可以作为切入点的。先进去,再找机会转型。但是这就说明文秘不能作为一个长远方向,只能作为一个切入点,所以删了它。)第三步,把即使通过努力也完全不可能的职业删掉。这里我删掉了公务员。因为在我这个地区,公务员招中文专业的很少,即使有招中文专业,有些要求应届,有些要求身高,有些要求视力。我拿它没辄。第四步,把市场需求量太小,又入不了门槛的删掉。这里我就删了翻译。人家招英语翻译普遍要求英语专业,而且要专业八级。而且市场上几乎很少招纯翻译的。
鐧介緳闀囬槼鐧介緳闀嘾g6
博客等级:
博客积分:0
博客访问:18
关注人气:0
荣誉徽章:找不到667vs页面了,平安同盟wwW667vsCom已栏截的占_百度知道
找不到667vs页面了,平安同盟wwW667vsCom已栏截的占
我有更好的答案
无缝不起浪的你别纠结【gsn.gf5.tech 】了
为您推荐:
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。深度学习大讲堂致力于推送人工智能,深度学习方面的最新技术,产品以及活动。请关注我们的知乎专栏!&br&&br&&p&相信社区中很多小伙伴和我一样使用了很长时间的Caffe深度学习框架,也非常希望从代码层次理解Caffe的实现从而实现新功能的定制。本文将从整体架构和底层实现的视角,对Caffe源码进行解析。&/p&&p&&b&1.Caffe总体架构&/b&&/p&&p&Caffe框架主要有五个组件,Blob,Solver,Net,Layer,Proto,其结构图如下图1所示。Solver负责深度网络的训练,每个Solver中包含一个训练网络对象和一个测试网络对象。每个网络则由若干个Layer构成。每个Layer的输入和输出Feature map表示为Input Blob和Output Blob。Blob是Caffe实际存储数据的结构,是一个不定维的矩阵,在Caffe中一般用来表示一个拉直的四维矩阵,四个维度分别对应Batch Size(N),Feature Map的通道数(C),Feature Map高度(H)和宽度(W)。Proto则基于Google的Protobuf开源项目,是一种类似XML的数据交换格式,用户只需要按格式定义对象的数据成员,可以在多种语言中实现对象的序列化与反序列化,在Caffe中用于网络模型的结构定义、存储和读取。&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-e3f56d8fd8f00feae16885b44def948a_b.jpg& data-rawwidth=&667& data-rawheight=&354& class=&origin_image zh-lightbox-thumb& width=&667& data-original=&https://pic3.zhimg.com/v2-e3f56d8fd8f00feae16885b44def948a_r.jpg&&&/figure&&p&&b&2.Blob解析&/b&&/p&&p&下面介绍Caffe中的基本数据存储类Blob。Blob使用SyncedMemory类进行数据存储,数据成员 data_指向实际存储数据的内存或显存块,shape_存储了当前blob的维度信息,diff_这个保存了反向传递时候的梯度信息。在Blob中其实不是只有num,channel,height,width这种四维形式,它是一个不定维度的数据结构,将数据展开存储,而维度单独存在一个vector&int& 类型的shape_变量中,这样每个维度都可以任意变化。&br&&/p&&p&来一起看看Blob的关键函数,data_at这个函数可以读取的存储在此类中的数据,diff_at可以用来读取反向传回来的误差。顺便给个提示,尽量使用data_at(const vector&int&& index)来查找数据。Reshape函数可以修改blob的存储大小,count用来返回存储数据的数量。BlobProto类负责了将Blob数据进行打包序列化到Caffe的模型中。&br&&/p&&p&&b&3.工厂模式说明&/b&&/p&&p&接下来介绍一种设计模式Factory Pattern,Caffe 中Solver和Layer对象的创建均使用了此模式,首先看工厂模式的UML的类图:&br&&/p&&p&&figure&&img src=&https://pic1.zhimg.com/v2-0fffc1bbdc6f5dc4368cd3faece45d91_b.jpg& data-rawwidth=&539& data-rawheight=&320& class=&origin_image zh-lightbox-thumb& width=&539& data-original=&https://pic2.zhimg.com/v2-0fffc1bbdc6f5dc4368cd3faece45d91_r.jpg&&&/figure&如同Factory生成同一功能但是不同型号产品一样,这些产品实现了同样Operation,很多人看了工厂模式的代码,会产生这样的疑问为何不new一个出来呢,这样new一个出来似乎也没什么问题吧。试想如下情况,由于代码重构类的名称改了,或者构造函数参数变化(增加或减少参数)。而你代码中又有N处new了这个类。如果你又没用工厂,就只能一个一个找来改。工厂模式的作用就是让使用者减少对产品本身的了解,降低使用难度。如果用工厂,只需要修改工厂类的创建具体对象方法的实现,而其他代码不会受到影响。&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-6d5bfb3c4ea555cdda9bb8_b.jpg& data-rawwidth=&132& data-rawheight=&183& class=&content_image& width=&132&&&/figure&&p&举个例子,写代码少不得饿了要加班去吃夜宵,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory。&/p&&p&&b&4.Solver解析&/b&&br&&/p&&p&接下来切回正题,我们看看Solver这个优化对象在Caffe中是如何实现的。SolverRegistry这个类就是我们看到的上面的factory类,负责给我们一个优化算法的产品,外部只需要把数据和网络结构定义好,它就可以自己优化了。&br&&/p&&p&Solver&Dtype&* CreateSolver(const SolverParameter& param)这个函数就是工厂模式下的CreateProduct的操作, Caffe中这个SolverRegistry工厂类可以提供给我们6种产品(优化算法):&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-efeadae7270acb95c7c8bc_b.jpg& data-rawwidth=&632& data-rawheight=&146& class=&origin_image zh-lightbox-thumb& width=&632& data-original=&https://pic1.zhimg.com/v2-efeadae7270acb95c7c8bc_r.jpg&&&/figure&&p&这六种产品的功能都是实现网络的参数更新,只是实现方式不一样。那我们来看看他们的使用流程吧。当然这些产品类似上面Product类中的Operation,每一个Solver都会继承Solve和Step函数,而每个Solver中独有的仅仅是ApplyUpdate这个函数里面执行的内容不一样,接口是一致的,这也和我们之前说的工厂生产出来的产品一样功能一样,细节上有差异,比如大多数电饭煲都有煮饭的功能,但是每一种电饭煲煮饭的加热方式可能不同,有底盘加热的还有立体加热的等。接下里我们看看Solver中的关键函数。&/p&&p&Solver中Solve函数的流程图如下:&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-bfff95d71f_b.jpg& data-rawwidth=&324& data-rawheight=&736& class=&content_image& width=&324&&&/figure&&p&Solver类中Step函数流程图:&br&&figure&&img src=&https://pic4.zhimg.com/v2-a6ea60efe6c_b.jpg& data-rawwidth=&455& data-rawheight=&832& class=&origin_image zh-lightbox-thumb& width=&455& data-original=&https://pic1.zhimg.com/v2-a6ea60efe6c_r.jpg&&&/figure&&/p&&p&Solver中关键的就是调用Sovle函数和Step函数的流程,你只需要对照Solver类中两个函数的具体实现,看懂上面两个流程图就可以理解Caffe训练执行的过程了。&/p&&p&&b&&a href=&https://link.zhihu.com/?target=http%3A//5.Net& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&5.Net&/span&&span class=&invisible&&&/span&&/a&类解析&/b&&/p&&p&分析过Solver之后我们来分析下Net类的一些关键操作。这个是我们使用Proto创建出来的深度网络对象,这个类负责了深度网络的前向和反向传递。以下是Net类的初始化方法NetInit函数调用流程:&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-a291a82e023d25142a47c_b.jpg& data-rawwidth=&511& data-rawheight=&563& class=&origin_image zh-lightbox-thumb& width=&511& data-original=&https://pic1.zhimg.com/v2-a291a82e023d25142a47c_r.jpg&&&/figure&&p&Net的类中的关键函数简单剖析&/p&&p&&b&1).&/b&ForwardBackward:按顺序调用了Forward和Backward。&/p&&p&&b&2).&/b&ForwardFromTo(int start, int end):执行从start层到end层的前向传递,采用简单的for循环调用。&/p&&p&&b&3).&/b&BackwardFromTo(int start, int end):和前面的ForwardFromTo函数类似,调用从start层到end层的反向传递。&/p&&p&&b&4).&/b&ToProto函数完成网络的序列化到文件,循环调用了每个层的ToProto函数。&/p&&p&&b&6.Layer解析&/b&&br&&/p&&p&Layer是Net的基本组成单元,例如一个卷积层或一个Pooling层。本小节将介绍Layer类的实现。&br&&/p&&p&&b&6.1Layer的继承结构&/b&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-fa0709dc53ffb274bd145c5_b.jpg& data-rawwidth=&353& data-rawheight=&395& class=&content_image& width=&353&&&/figure&&p&&b&6.2 Layer的创建&/b&&/p&&p&与Solver的创建方式很像,Layer的创建使用的也是工厂模式,这里简单说明下几个宏函数:&br&&/p&&p&REGISTER_LAYER_CREATOR负责将创建层的函数放入LayerRegistry。&br&&/p&&p&&figure&&img src=&https://pic1.zhimg.com/v2-b15ba9e46ea6b2b5ae5372_b.jpg& data-rawwidth=&618& data-rawheight=&204& class=&origin_image zh-lightbox-thumb& width=&618& data-original=&https://pic3.zhimg.com/v2-b15ba9e46ea6b2b5ae5372_r.jpg&&&/figure&我们来看看大多数层创建的函数的生成宏REGISTER_LAYER_CLASS,可以看到宏函数比较简单的,将类型作为函数名称的一部分,这样就可以产生出一个创建函数,并将创建函数放入LayerRegistry。&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-a1d1feb8b11f5_b.jpg& data-rawwidth=&670& data-rawheight=&127& class=&origin_image zh-lightbox-thumb& width=&670& data-original=&https://pic2.zhimg.com/v2-a1d1feb8b11f5_r.jpg&&&/figure&&p&REGISTER_LAYER_CREATOR(type, Creator_##type##Layer)&/p&&p&这段代码在split_layer.cpp文件中&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-adbd768c8f8caeac8026143_b.jpg& data-rawwidth=&443& data-rawheight=&67& class=&origin_image zh-lightbox-thumb& width=&443& data-original=&https://pic4.zhimg.com/v2-adbd768c8f8caeac8026143_r.jpg&&&/figure&&p&REGISTER_LAYER_CLASS(Split)。&/p&&p&这样我们将type替换过以后给大家做个范例,参考下面的代码。&br&&/p&&p&&figure&&img src=&https://pic2.zhimg.com/v2-e9a89ab94d52edd69957_b.jpg& data-rawwidth=&668& data-rawheight=&88& class=&origin_image zh-lightbox-thumb& width=&668& data-original=&https://pic4.zhimg.com/v2-e9a89ab94d52edd69957_r.jpg&&&/figure&当然这里的创建函数好像是直接调用,没有涉及到我们之前工厂模式的一些问题。所有的层的类都是这样吗?当然不是,我们仔细观察卷积类。&br&&/p&&p&&figure&&img src=&https://pic3.zhimg.com/v2-f8e7ab462f0f00bb18713ccb_b.jpg& data-rawwidth=&439& data-rawheight=&53& class=&origin_image zh-lightbox-thumb& width=&439& data-original=&https://pic2.zhimg.com/v2-f8e7ab462f0f00bb18713ccb_r.jpg&&&/figure&卷积层怎么没有创建函数呢,当然不是,卷积的层的创建函数在LayerFactory.cpp中,截图给大家看下,具体代码如下:&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-745b984d8ad4c11ccd27fb_b.jpg& data-rawwidth=&602& data-rawheight=&116& class=&origin_image zh-lightbox-thumb& width=&602& data-original=&https://pic4.zhimg.com/v2-745b984d8ad4c11ccd27fb_r.jpg&&&/figure&&p&这样两种类型的Layer的创建函数都有了对应的声明。这里直接说明除了有cudnn实现的层,其他层都是采用第一种方式实现的创建函数,而带有cudnn实现的层都采用的第二种方式实现的创建函数。&/p&&p&&b&6.3 Layer的初始化&/b&&br&&/p&&p&介绍完创建我们看看层里面的几个函数都是什么时候被调用的。&br&&/p&&p&关键函数Setup此函数在之前的流程图中的NetInit时候被调用,代码如下:&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-7effb366ecbbf7ab3d22de_b.jpg& data-rawwidth=&449& data-rawheight=&172& class=&origin_image zh-lightbox-thumb& width=&449& data-original=&https://pic3.zhimg.com/v2-7effb366ecbbf7ab3d22de_r.jpg&&&/figure&&p&这样整个Layer初始化的过程中,CheckBlobCounts被最先调用,然后接下来是LayerSetUp,后面才是Reshape,最后才是SetLossWeights。这样Layer初始化的生命周期大家就有了了解。&/p&&p&&b&6.4 Layer的其他函数的介绍&/b&&br&&/p&&p&Layer的Forward函数和Backward函数完成了网络的前向和反向传递,这两个函数在自己实现新的层必须要实现。其中Backward会修改bottom中blob的diff_,这样就完成了误差的方向传导。&br&&/p&&p&&b&7.Protobuf介绍&/b&&/p&&p&Caffe中的Caffe.proto文件负责了整个Caffe网络的构建,又负责了Caffemodel的存储和读取。下面用一个例子介绍Protobuf的工作方式:&br&&/p&&p&利用protobuffer工具存储512维度图像特征:&br&&/p&&p&&b&1).&/b&message 编写:新建txt文件后缀名改为proto,编写自己的message如下,并放入解压的protobuff的文件夹里;&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-332eec8280_b.jpg& data-rawwidth=&422& data-rawheight=&153& class=&origin_image zh-lightbox-thumb& width=&422& data-original=&https://pic1.zhimg.com/v2-332eec8280_r.jpg&&&/figure&&p&其中,dwFaceFeatSize表示特征点数量;pfFaceFeat表示人脸特征。&/p&&p&&b&2).&/b&打开windows命令窗口(cmd.exe)----&cd空格,把protobuff的文件路径复制粘贴进去------&enter;&br&&/p&&p&&b&3).&/b&输入指令protoc *.proto --cpp_out=.
---------&enter&br&&/p&&p&&b&4).&/b&可以看到文件夹里面生成“ *.pb.h”和“*.pb.cpp”两个文件,说明成功了&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-c5eb0ba309ceb4dca3cb5a3cea05f2a8_b.jpg& data-rawwidth=&653& data-rawheight=&71& class=&origin_image zh-lightbox-thumb& width=&653& data-original=&https://pic1.zhimg.com/v2-c5eb0ba309ceb4dca3cb5a3cea05f2a8_r.jpg&&&/figure&&p&&b&5).&/b&下面可以和自己的代码整合了:&/p&&p&&b&(1) &/b&新建你自己的工程,把“ *.pb.h”和“*.pb.cpp”两个文件添加到自己的工程里,并写上#include& *.pb.h&&br&&/p&&p&&b&(2) &/b&按照配库的教程把库配置下就可以了&/p&&p&VS下Protobuf的配库方法:&br&&/p&&p&解决方案----&右击工程名----&属性&br&&/p&&p&&b&(1)c/c++---&常规---&附加包含目录---& &/b&&br&&/p&&p&($your protobuffer include path)\protobuffer &br&&/p&&p&&b&(2)c/c++---&链接器--&常规---&附加库目录--&&/b&&br&&/p&&p&($your protobuffer lib path)\protobuffer&br&&/p&&p&&b&(3) c/c++---&链接器--&输入---&附加依赖项--&&/b&&br&&/p&&p&libprotobufd.(带d的为debug模式)&br&&/p&&p&或libprotobuf.(不带d,为release模式)&/p&&p&使用protobuf进行打包的方法如下代码:&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-35b1dad4b522fc2f35bdf3_b.jpg& data-rawwidth=&636& data-rawheight=&430& class=&origin_image zh-lightbox-thumb& width=&636& data-original=&https://pic4.zhimg.com/v2-35b1dad4b522fc2f35bdf3_r.jpg&&&/figure&&p&&b&7.1
Caffe的模型序列化&/b&&/p&&p&BlobProto其实就是Blob序列化成Proto的类,Caffe模型文件使用了该类。Net调用每个层的Toproto方法,每个层的Toproto方法调用了Blob类的ToProto方法,这样完整的模型就被都序列化到proto里面了。最后只要将这个proto继承于message类的对象序列化到文件就完成了模型写入文件。Caffe打包模型的时候就只是简单调用了WriteProtoToBinaryFile这个函数,而这个函数里面的内容如下:&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-c82d228cacbdaffca9b692_b.jpg& data-rawwidth=&629& data-rawheight=&70& class=&origin_image zh-lightbox-thumb& width=&629& data-original=&https://pic3.zhimg.com/v2-c82d228cacbdaffca9b692_r.jpg&&&/figure&&p&至此Caffe的序列化模型的方式就完成了。&/p&&p&&b&7.2 Proto.txt的简单说明&/b&&/p&&p&Caffe网络的构建和Solver的参数定义均由此类型文件完成。Net构建过程中调用ReadProtoFromTextFile将所有的网络参数读入。然后调用上面的流程进行整个caffe网络的构建。这个文件决定了怎样使用存在caffe model中的每个blob是用来做什么的,如果没有了这个文件caffe的模型文件将无法使用,因为模型中只存储了各种各样的blob数据,里面只有float值,而怎样切分这些数据是由prototxt文件决定的。&br&&/p&&p&Caffe的架构在框架上采用了反射机制去动态创建层来构建Net,Protobuf本质上定义了graph,反射机制是由宏配合map结构形成的,然后使用工厂模式去实现各种各样层的创建,当然区别于一般定义配置采用xml或者json,该项目的写法采用了proto文件对组件进行组装。&br&&/p&&p&&b&总结&/b&&/p&&p&以上为Caffe代码架构的一个总体介绍,希望能借此帮助社区的小伙伴找到打开定制化Caffe大门的钥匙。本文作者希望借此抛砖引玉,与更多期望了解Caffe和深度学习框架底层实现的同行交流。&/p&&br&&p&&b&该文章属于“深度学习大讲堂”原创,如需要转载,请联系&a href=&https://www.zhihu.com/people/guo-dan-qing/answers& class=&internal&&@果果是枚开心果.&/a&&/b&&br&&/p&&p&&b&作者简介:&/b&&br&&/p&&p&&figure&&img src=&https://pic3.zhimg.com/v2-19ea668a2dba_b.jpg& data-rawwidth=&110& data-rawheight=&123& class=&content_image& width=&110&&&/figure&&b&薛云峰,&/b&(&a href=&https://link.zhihu.com/?target=https%3A//github.com/HolidayXue& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&HolidayXue (HolidayXue)&/a&),主要从事视频图像算法的研究,就职于浙江捷尚视觉科技股份有限公司担任深度学习算法研究员。捷尚致力于视频大数据和视频监控智能化,现诚招业内算法和工程技术人才,招聘主页&a href=&https://link.zhihu.com/?target=http%3A//www.icarevision.cn/job.php& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&浙江捷尚视觉科技股份有限公司--安全服务运营商&/a&,联系邮箱:&br&&/p&&br&&p&&b&原文链接:&a href=&https://link.zhihu.com/?target=http%3A//mp.weixin.qq.com/s/rWDCYO5k06zT9BcXk21JJg& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&深度学习框架Caffe源码解析&/a&&br&&/b&&/p&&p&&b&欢迎大家关注我们的微信公众号,搜索微信名称:深度学习大讲堂&/b&&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-a29f11dacaf2c3a3f8b93_b.jpg& data-rawwidth=&346& data-rawheight=&67& class=&content_image& width=&346&&&/figure&
深度学习大讲堂致力于推送人工智能,深度学习方面的最新技术,产品以及活动。请关注我们的知乎专栏! 相信社区中很多小伙伴和我一样使用了很长时间的Caffe深度学习框架,也非常希望从代码层次理解Caffe的实现从而实现新功能的定制。本文将从整体架构和底层…
&figure&&img src=&https://pic1.zhimg.com/20e007dbd30a8dcd5f11f_b.jpg& data-rawwidth=&581& data-rawheight=&434& class=&origin_image zh-lightbox-thumb& width=&581& data-original=&https://pic4.zhimg.com/20e007dbd30a8dcd5f11f_r.jpg&&&/figure&深度学习大讲堂致力于推送人工智能,深度学习方面的最新技术,产品以及活动。请关注我们的知乎专栏! &br&&p&&b&一.DL基础理论&/b&&br&&/p&&p&&figure&&img src=&https://pic4.zhimg.com/7b6c19c2b40d1afcdad8cedbaaa4374f_b.jpg& data-rawwidth=&667& data-rawheight=&484& class=&origin_image zh-lightbox-thumb& width=&667& data-original=&https://pic4.zhimg.com/7b6c19c2b40d1afcdad8cedbaaa4374f_r.jpg&&&/figure&本页PPT给出了本节内容概要,我们从MCP神经元模型开始,首先回顾全连接层、卷积层等基础结构单元,Sigmoid等激活函数,Softmax等损失函数,以及感知机、MLP等经典网络结构。接下来,将介绍网络训练方法,包括BP、Mini-batch SGD和LR Policy。最后我们会介绍深度网络训练中的两个理论问题:梯度消失和梯度溢出。&/p&&p&&figure&&img src=&https://pic4.zhimg.com/8ddb87f7c6_b.jpg& data-rawwidth=&649& data-rawheight=&477& class=&origin_image zh-lightbox-thumb& width=&649& data-original=&https://pic3.zhimg.com/8ddb87f7c6_r.jpg&&&/figure&MCP神经元模型提出于1943年,可以看作是人工神经网络研究的起点。MCP是作者名字的缩写。MCP模型中包括多个输入参数和权重、内积运算和二值激活函数等人工神经网络的基础要素。MCP模型的提出甚至早于1946年第一台计算机的发明。&/p&&p&&figure&&img src=&https://pic1.zhimg.com/68a25ac016cf034b022d057_b.jpg& data-rawwidth=&662& data-rawheight=&479& class=&origin_image zh-lightbox-thumb& width=&662& data-original=&https://pic4.zhimg.com/68a25ac016cf034b022d057_r.jpg&&&/figure&在MCP神经元模型的基础上,我们可以得到全连接结构。输入层神经元和输入层神经两两相连,故名全连接。全连接层实际上是内积运算,我们也给出了全连接层前向和后向计算的公式。&/p&&p&&figure&&img src=&https://pic4.zhimg.com/66ccb1c46fdce80ab267d02_b.jpg& data-rawwidth=&652& data-rawheight=&479& class=&origin_image zh-lightbox-thumb& width=&652& data-original=&https://pic3.zhimg.com/66ccb1c46fdce80ab267d02_r.jpg&&&/figure&下面我们介绍卷积层,卷积是深度网络的重要结构单元之一。我们给出了2D卷积的连续和离散形式,注意卷积核需要做中心翻转。在Caffe实现中,卷积核假设已经翻转,所以卷积运算可以看作当前窗口和卷积核的一个内积(不考虑bias项),上图我们给出了一个卷积运算的示意。&/p&&p&&figure&&img src=&https://pic2.zhimg.com/87ac8ca9c0b9ab2d7f44c1e_b.jpg& data-rawwidth=&647& data-rawheight=&484& class=&origin_image zh-lightbox-thumb& width=&647& data-original=&https://pic3.zhimg.com/87ac8ca9c0b9ab2d7f44c1e_r.jpg&&&/figure&与全连接层相比,卷积层的输出神经元只和部分输入层神经元连接,同时相同响应图内,不同空间位置共享卷积核参数,因此卷积层大大降低了要学习的参数数量。&/p&&p&&figure&&img src=&https://pic1.zhimg.com/7bf89ed88ed5a203e531cb_b.jpg& data-rawwidth=&647& data-rawheight=&478& class=&origin_image zh-lightbox-thumb& width=&647& data-original=&https://pic4.zhimg.com/7bf89ed88ed5a203e531cb_r.jpg&&&/figure&Caffe当中,为了避免卷积运算中频繁的内存访问和过深的循序嵌套,对卷积运算进行了以下加速:通过Im2Col操作一次取出所有的patch并组成矩阵,与kernel矩阵做乘法运算直接得到卷积结果。&/p&&p&&figure&&img src=&https://pic2.zhimg.com/acfbd0ca65cedef8bdabbaef_b.jpg& data-rawwidth=&652& data-rawheight=&476& class=&origin_image zh-lightbox-thumb& width=&652& data-original=&https://pic4.zhimg.com/acfbd0ca65cedef8bdabbaef_r.jpg&&&/figure&有卷积就有反卷积,反卷积是卷积的逆运算,实现了信号的复原。在全卷积网络中,反卷积层实现了图像的上采样,从而得到如输入图像大小相同的输出。&/p&&figure&&img src=&https://pic7.zhimg.com/5e2e2737cffeab_b.jpg& data-rawwidth=&664& data-rawheight=&487& class=&origin_image zh-lightbox-thumb& width=&664& data-original=&https://pic4.zhimg.com/5e2e2737cffeab_r.jpg&&&/figure&&p& Pooling层一般配合卷积层使用,可以获得特征的不变性。常见的Pooling操作有max pooling、mean pooling和随机pooling。其中max pooling取最大值,mean pooling取均值,随机pooling按响应值的大小依概率选择。&br&&/p&&p&&figure&&img src=&https://pic4.zhimg.com/ef1f97a1556_b.jpg& data-rawwidth=&646& data-rawheight=&480& class=&origin_image zh-lightbox-thumb& width=&646& data-original=&https://pic3.zhimg.com/ef1f97a1556_r.jpg&&&/figure&激活函数一般用于卷积层和全连接层之后,激活函数是深度网络非线性的主要来源。常见的激活函数Sigmoid, 双曲正切,ReLU(生物启发,克服了梯度消失问题), PReLU(alpha可学习), ELU和maxout。 其中PReLU和ELU都是ReLU的改进。&/p&&p&&figure&&img src=&https://pic2.zhimg.com/f09b2fb4a7ae5a5c0d3aec7_b.jpg& data-rawwidth=&641& data-rawheight=&484& class=&origin_image zh-lightbox-thumb& width=&641& data-original=&https://pic4.zhimg.com/f09b2fb4a7ae5a5c0d3aec7_r.jpg&&&/figure&Dropout由Hinton组提出于2012年,Dropout随机将比例为p的神经元输出设置为0,是一种避免深度网络过拟合的随机正则化策略,同时Dropout也可以看作是一种隐式的模型集成。&/p&&p&&figure&&img src=&https://pic1.zhimg.com/e452cadd02ab2a88b0fa3_b.jpg& data-rawwidth=&646& data-rawheight=&476& class=&origin_image zh-lightbox-thumb& width=&646& data-original=&https://pic4.zhimg.com/e452cadd02ab2a88b0fa3_r.jpg&&&/figure&Batch Normalization提出于2015年,通过逐层尺度归一(零均值方差归一,scale和shift),BN避免了梯度消失和梯度溢出。BN可以加速收敛5x~20x, 作为一种正则化技术也提高了泛化能力。&/p&&figure&&img src=&https://pic4.zhimg.com/066e755d760f662be41083_b.jpg& data-rawwidth=&654& data-rawheight=&489& class=&origin_image zh-lightbox-thumb& width=&654& data-original=&https://pic4.zhimg.com/066e755d760f662be41083_r.jpg&&&/figure&&p&下面我们介绍损失函数:用于单标签分类问题的Softmax损失函数,用于实值回归问题的欧式损失函数,用于多标签分类的Sigmoid交叉熵损失和用于深度测度学习的Contrastive损失。&/p&&p&&figure&&img src=&https://pic3.zhimg.com/244d409d410fe54dc93d790_b.jpg& data-rawwidth=&642& data-rawheight=&479& class=&origin_image zh-lightbox-thumb& width=&642& data-original=&https://pic1.zhimg.com/244d409d410fe54dc93d790_r.jpg&&&/figure&下面我们介绍经典网络结构。1957年,Rosenblatt提出了感知机模型。最早感知机模型用于解决二分类问题,在MCP模型的基础上增加了一个损失函数。随后,感知机也被扩展到多分类问题和回归问题,成为解决机器学习问题的一个通用学习器。&/p&&p&&figure&&img src=&https://pic2.zhimg.com/ebbc6abb4_b.jpg& data-rawwidth=&654& data-rawheight=&486& class=&origin_image zh-lightbox-thumb& width=&654& data-original=&https://pic1.zhimg.com/ebbc6abb4_r.jpg&&&/figure&1969年,Minsky在一本名为感知机的专著中指出,感知机不能解决XOR问题,从而宣告了感知机甚至人工神经网络研究的死刑,造成了NN长达十几年的寒冬,这也是NN研究的第一次寒冬。遗憾的是,Rosenblatt 1971年死于意外,没有等到春天的到来(下图是Rosenblatt的墓碑)。&/p&&p&&figure&&img src=&https://pic2.zhimg.com/6ca50dabc5ccb2584c14ecefda68824e_b.jpg& data-rawwidth=&253& data-rawheight=&319& class=&content_image& width=&253&&&/figure&&figure&&img src=&https://pic4.zhimg.com/08d62efc609b9bac3d69_b.jpg& data-rawwidth=&649& data-rawheight=&472& class=&origin_image zh-lightbox-thumb& width=&649& data-original=&https://pic2.zhimg.com/08d62efc609b9bac3d69_r.jpg&&&/figure&1986年之后,随着误差反向传导算法的再次发明并在Nature上发表,多层感知机和卷积神经网络成为NN研究新亮点。然而由于多层网络训练困难:梯度消失问题,训练数据和计算资源不足,NN研究在20世纪末再次进入寒冬,这段时间更为流行的方法包括决策树,SVM等,八卦一下,NN研究曾长期是一门“显学”,SVM引用次数最多的那篇文章的题目叫Support Vector Network。&br&&/p&&p&&figure&&img src=&https://pic3.zhimg.com/1ac4ae916e3fcb5d00a5811d8ebe6393_b.jpg& data-rawwidth=&644& data-rawheight=&482& class=&origin_image zh-lightbox-thumb& width=&644& data-original=&https://pic4.zhimg.com/1ac4ae916e3fcb5d00a5811d8ebe6393_r.jpg&&&/figure&2006年,NN的研究迎来转机,Hinton、Bengio等人经过跨世纪的努力,提出了通过分层无监督预训练的策略来解决多层网络收敛困难的问题,深度学习也因此得名。&/p&&p&&figure&&img src=&https://pic3.zhimg.com/a6bdecfacfcd32_b.jpg& data-rawwidth=&648& data-rawheight=&487& class=&origin_image zh-lightbox-thumb& width=&648& data-original=&https://pic3.zhimg.com/a6bdecfacfcd32_r.jpg&&&/figure&下面我们介绍优化方法。首先误差反向传导,实际上在1974年,Webos在其博士论文中就提出来BP的思想,今天我们广为使用的BP算法则由Hinton等人“重新”发明于1986年。&/p&&p&&figure&&img src=&https://pic1.zhimg.com/3aafda52b48a6f6b6ec72e72_b.jpg& data-rawwidth=&651& data-rawheight=&483& class=&origin_image zh-lightbox-thumb& width=&651& data-original=&https://pic3.zhimg.com/3aafda52b48a6f6b6ec72e72_r.jpg&&&/figure&有了BP算法传递的梯度,基于梯度下降方法,就可以对网络参数进行更新。梯度下降方法的缺点是速度慢且数据量大的时候内存不足,随机梯度下降方法的缺点是方差大导致损失函数震荡严重。两者折中的Mini-batch SGD,我们也给出了基于Mini-batch SGD的NN训练流程。&/p&&p&&figure&&img src=&https://pic4.zhimg.com/e7db4ccdebc3079_b.jpg& data-rawwidth=&645& data-rawheight=&490& class=&origin_image zh-lightbox-thumb& width=&645& data-original=&https://pic2.zhimg.com/e7db4ccdebc3079_r.jpg&&&/figure&进一步的,在Mini-batch SGD中,有两个关键技术细节:weight decay和momentum. Weight decay是一种避免过拟合的正则化手段,而Momentum通过对历史梯度的moving average来避免陷入局部最优。&/p&&p&&figure&&img src=&https://pic3.zhimg.com/43fc818f92ecdf5bdea463c_b.jpg& data-rawwidth=&654& data-rawheight=&485& class=&origin_image zh-lightbox-thumb& width=&654& data-original=&https://pic1.zhimg.com/43fc818f92ecdf5bdea463c_r.jpg&&&/figure& Learning rate的控制是网络收敛的关键,Caffe中支持四种策略,其中使用较多的是step和polynomial。&/p&&p&&figure&&img src=&https://pic1.zhimg.com/56a9b1a36e5ef52156c32_b.jpg& data-rawwidth=&654& data-rawheight=&491& class=&origin_image zh-lightbox-thumb& width=&654& data-original=&https://pic3.zhimg.com/56a9b1a36e5ef52156c32_r.jpg&&&/figure&下面我介绍网络训练中的两个理论问题。首先是梯度消失,梯度消失的主要原因是sigmoid激活函数“糟糕”的解析性质,一阶梯度的取值范围是[0,1/4],梯度向下传导一次最少会减小1/4,随着深度的增加,梯度传导的过程中不断减小从而引发所谓的“梯度消失”问题。&/p&&p&&figure&&img src=&https://pic4.zhimg.com/148b5d2dedd3c00b74576_b.jpg& data-rawwidth=&649& data-rawheight=&483& class=&origin_image zh-lightbox-thumb& width=&649& data-original=&https://pic3.zhimg.com/148b5d2dedd3c00b74576_r.jpg&&&/figure&为了解决梯度消失问题,学术界提出了多种策略,例如,LSTM中的选择性记忆和遗忘机制,Hinton等提出的无监督pre-train方法,新的激活函数ReLU, 辅助损失函数和Batch Normalization.&figure&&img src=&https://pic2.zhimg.com/8e4dfb7f04f82ef10709d5cf_b.jpg& data-rawwidth=&645& data-rawheight=&487& class=&origin_image zh-lightbox-thumb& width=&645& data-original=&https://pic4.zhimg.com/8e4dfb7f04f82ef10709d5cf_r.jpg&&&/figure&&/p&除了梯度消失之外,梯度溢出也是深度网络训练中的一个常见问题,例如Softmax损失变成86.33并且保持不变,这是因为梯度溢出导致网络参数NAN。梯度溢出的根本原因是网络参数初始化的尺度不平衡问题。PPT中展示了一个例子,W2的初始值是0.01,梯度却达到10^4。&p&&figure&&img src=&https://pic1.zhimg.com/a50ddcdff99c7c16f978df8fca7ab08b_b.jpg& data-rawwidth=&650& data-rawheight=&488& class=&origin_image zh-lightbox-thumb& width=&650& data-original=&https://pic4.zhimg.com/a50ddcdff99c7c16f978df8fca7ab08b_r.jpg&&&/figure&为了解决这个问题,Bengio等人提出了Xavier初始化策略,其基本思想是保持网络的尺度不变。&/p&&br&&b&二. CNN结构演化&/b&&p& 下面我们介绍CNN的结构演化。&/p&&p&&figure&&img src=&https://pic4.zhimg.com/e87c8ef509bb330c3beed7dc_b.jpg& data-rawwidth=&658& data-rawheight=&486& class=&origin_image zh-lightbox-thumb& width=&658& data-original=&https://pic1.zhimg.com/e87c8ef509bb330c3beed7dc_r.jpg&&&/figure&历史奔流向前,往事并不如烟。上图所示是我总结的CNN结构演化的历史,起点是神经认知机模型,已经出现了卷积结构,但是第一个CNN模型诞生于1989年,1998年诞生了LeNet。随着ReLU和dropout的提出,以及GPU和大数据带来的历史机遇,CNN在12年迎来了历史突破。12年之后,CNN的演化路径可以总结为四条:1)更深的网络,2)增强卷积模的功能以及上诉两种思路的融合,3)从分类到检测,4)增加新的功能模块。&/p&&p&&figure&&img src=&https://pic1.zhimg.com/c7f0924ffcb15e73b325e90da05cf011_b.jpg& data-rawwidth=&648& data-rawheight=&479& class=&origin_image zh-lightbox-thumb& width=&648& data-original=&https://pic2.zhimg.com/c7f0924ffcb15e73b325e90da05cf011_r.jpg&&&/figure&首先,我们介绍CNN的早期探索,1962年,Hubel和Wiesel提出了视觉皮层的功能模型,从简单细胞到复杂细胞再到超复杂细胞。受此启发,1980年,神经认知及提出,简单细胞被实现为卷积,复杂细胞被实现为pooling。&/p&&p&&figure&&img src=&https://pic1.zhimg.com/cfac2f221f_b.jpg& data-rawwidth=&659& data-rawheight=&483& class=&origin_image zh-lightbox-thumb& width=&659& data-original=&https://pic3.zhimg.com/cfac2f221f_r.jpg&&&/figure&神经认知机采用自组织的方式进行无监督的卷积核训练,因此并不是CNN(通过BP端到端训练)。&/p&&p&&figure&&img src=&https://pic2.zhimg.com/d69aecca10127_b.jpg& data-rawwidth=&648& data-rawheight=&486& class=&origin_image zh-lightbox-thumb& width=&648& data-original=&https://pic4.zhimg.com/d69aecca10127_r.jpg&&&/figure&第一个CNN模型诞生于1989年,发明人LeCun。需要指出的是,从诞生的第一天起,CNN自带deep属性。&/p&&p&&figure&&img src=&https://pic2.zhimg.com/88cc3c58f8acadff0fac79f4_b.jpg& data-rawwidth=&650& data-rawheight=&488& class=&origin_image zh-lightbox-thumb& width=&650& data-original=&https://pic1.zhimg.com/88cc3c58f8acadff0fac79f4_r.jpg&&&/figure& LeCun同时研究了四个问题,这也是文章中留下的四枚彩蛋,其中问题3)和Xavier初始化之间有神秘的联系。&/p&&p&&figure&&img src=&https://pic4.zhimg.com/f8eb24dacad13f7dc6dff8d_b.jpg& data-rawwidth=&645& data-rawheight=&487& class=&origin_image zh-lightbox-thumb& width=&645& data-original=&https://pic2.zhimg.com/f8eb24dacad13f7dc6dff8d_r.jpg&&&/figure&1998年,LeCun提出LeNet,并成功应用于美国手写数字识别。但很快,CNN的锋芒被SVM和手工设计的局部特征盖过。&/p&&figure&&img src=&https://pic4.zhimg.com/5ae8ec1bfdc6_b.jpg& data-rawwidth=&641& data-rawheight=&488& class=&origin_image zh-lightbox-thumb& width=&641& data-original=&https://pic3.zhimg.com/5ae8ec1bfdc6_r.jpg&&&/figure& 历史的转折在2012年到来,AlexNet, 在当年的ImageNet图像分类竞赛中,top-5错误率比上一年的冠军下降了十个百分点。AlexNet的成功既得益研究者的自我奋斗:Relu和Dropout的提出, 也是大历史进程的结果:大数据训练和GPU并行计算。&p&2012年之后,CNN朝着不同方向演化。&br&&/p&&p&&figure&&img src=&https://pic2.zhimg.com/2fc090dbb448e94c9e620c_b.jpg& data-rawwidth=&641& data-rawheight=&490& class=&origin_image zh-lightbox-thumb& width=&641& data-original=&https://pic1.zhimg.com/2fc090dbb448e94c9e620c_r.jpg&&&/figure&&figure&&img src=&https://pic1.zhimg.com/cdbce4ee973f87aa336d9_b.jpg& data-rawwidth=&665& data-rawheight=&504& class=&origin_image zh-lightbox-thumb& width=&665& data-original=&https://pic2.zhimg.com/cdbce4ee973f87aa336d9_r.jpg&&&/figure&&b&第二条演化路径,增强卷积模块的功能。&/b&&figure&&img src=&https://pic1.zhimg.com/a9e20d9c226f0dab6ff2a64c6213fadf_b.jpg& data-rawwidth=&651& data-rawheight=&489& class=&origin_image zh-lightbox-thumb& width=&651& data-original=&https://pic4.zhimg.com/a9e20d9c226f0dab6ff2a64c6213fadf_r.jpg&&&/figure&&/p&&figure&&img src=&https://pic3.zhimg.com/aa9cd8b4fb6b_b.jpg& data-rawwidth=&661& data-rawheight=&480& class=&origin_image zh-lightbox-thumb& width=&661& data-original=&https://pic4.zhimg.com/aa9cd8b4fb6b_r.jpg&&&/figure&&br&13年底,颜水成老师组提出了NIN结构,并于2014年取得了ILSVRC物体检测竞赛的冠军。&p&在NIN的基础上,Google于2014年提出了GoogLeNet(Inception V1),并随后改进出Inception V3和V4。&/p&&p&&figure&&img src=&https://pic4.zhimg.com/6f5dea07d722_b.jpg& data-rawwidth=&653& data-rawheight=&486& class=&origin_image zh-lightbox-thumb& width=&653& data-original=&https://pic3.zhimg.com/6f5dea07d722_r.jpg&&&/figure&&figure&&img src=&https://pic2.zhimg.com/cb472dbd17ea0356ca62_b.jpg& data-rawwidth=&657& data-rawheight=&481& class=&origin_image zh-lightbox-thumb& width=&657& data-original=&https://pic3.zhimg.com/cb472dbd17ea0356ca62_r.jpg&&&/figure&&figure&&img src=&https://pic1.zhimg.com/9fe53e8eb84_b.jpg& data-rawwidth=&657& data-rawheight=&479& class=&origin_image zh-lightbox-thumb& width=&657& data-original=&https://pic1.zhimg.com/9fe53e8eb84_r.jpg&&&/figure&&figure&&img src=&https://pic3.zhimg.com/e0c492b8cf0f6560775a_b.jpg& data-rawwidth=&672& data-rawheight=&492& class=&origin_image zh-lightbox-thumb& width=&672& data-original=&https://pic3.zhimg.com/e0c492b8cf0f6560775a_r.jpg&&&/figure&&figure&&img src=&https://pic2.zhimg.com/ac6bfcae7f254e2db4c35e5bea6476f7_b.jpg& data-rawwidth=&688& data-rawheight=&479& class=&origin_image zh-lightbox-thumb& width=&688& data-original=&https://pic4.zhimg.com/ac6bfcae7f254e2db4c35e5bea6476f7_r.jpg&&&/figure& Residual Net可以看作是前两条演化路径的集成。何凯明等人发现,单纯增加深度会导致网络退化,例如CIFAR-10数据集,网络从20层到56层性能反而会下降。为此ResNet中引入了一个shortcut结构,将输入跳层传递与卷积的结果相加。ReNet可以训练深达152层的网络,是15年ILSVRC不依赖外部数据的物体检测与物体识别竞赛的双料冠军。&/p&&p&&figure&&img src=&https://pic4.zhimg.com/218b062663ccf71dd4d9_b.jpg& data-rawwidth=&649& data-rawheight=&483& class=&origin_image zh-lightbox-thumb& width=&649& data-original=&https://pic2.zhimg.com/218b062663ccf71dd4d9_r.jpg&&&/figure&&figure&&img src=&https://pic2.zhimg.com/ecb4bf1d8be81ea98cef0ed37cab4aef_b.jpg& data-rawwidth=&673& data-rawheight=&487& class=&origin_image zh-lightbox-thumb& width=&673& data-original=&https://pic4.zhimg.com/ecb4bf1d8be81ea98cef0ed37cab4aef_r.jpg&&&/figure& 进一步的,Google将Inception结构与Residual Net结合,提出了Inception-Residual Net结构,实验表明,虽然采用Inception V4结构能够得到与ResNet可比的性能,但是残差结构能够加速收敛1倍以上。&/p&&figure&&img src=&https://pic1.zhimg.com/36bd6b6b390869eda97b_b.jpg& data-rawwidth=&665& data-rawheight=&480& class=&origin_image zh-lightbox-thumb& width=&665& data-original=&https://pic4.zhimg.com/36bd6b6b390869eda97b_r.jpg&&&/figure&&br&2016年初,何凯明等提出了恒等映射深度残差网络,通过去掉Addition操作后的ReLU操作,残差项跨层可加,损失层的梯度可以直接传到任意一层,使得1001层网络的训练成为可能,并在CIFAR-10上取得了4.92%的错误率,刷新了state-of-the-art。&p&&b&第三条演化路径:从物体识别到物体检测。&/b&&/p&&p&&figure&&img src=&https://pic4.zhimg.com/b5c6d103c2d9f6b0c7af42c_b.jpg& data-rawwidth=&653& data-rawheight=&481& class=&origin_image zh-lightbox-thumb& width=&653& data-original=&https://pic1.zhimg.com/b5c6d103c2d9f6b0c7af42c_r.jpg&&&/figure&&figure&&img src=&https://pic4.zhimg.com/096cb93aadfb43d5d94fe5f59f55203d_b.jpg& data-rawwidth=&663& data-rawheight=&484& class=&origin_image zh-lightbox-thumb& width=&663& data-original=&https://pic2.zhimg.com/096cb93aadfb43d5d94fe5f59f55203d_r.jpg&&&/figure&R-CNN的缺点是速度慢,Fast R-CNN是R-CNN和SPP Pooling的融合,这样每张图像只需要通过卷积网络一次同时支持端到端训练而不需要保存中间结果。&br&&/p&&figure&&img src=&https://pic4.zhimg.com/cd6f6dff8c_b.jpg& data-rawwidth=&675& data-rawheight=&486& class=&origin_image zh-lightbox-thumb& width=&675& data-original=&https://pic1.zhimg.com/cd6f6dff8c_r.jpg&&&/figure&&figure&&img src=&https://pic1.zhimg.com/daa6e63981d3e_b.jpg& data-rawwidth=&675& data-rawheight=&487& class=&origin_image zh-lightbox-thumb& width=&675& data-original=&https://pic3.zhimg.com/daa6e63981d3e_r.jpg&&&/figure&&p&Faster R-CNN支持多类物体的同时检测而只需要一个网络,目前基于Faster R-CNN的行人与车辆检测技术是汽车高级辅助驾驶系统的关键技术之一。&/p&&p&&b&第四条演化路径:增加新的功能模块。&/b&&/p&&p&本节介绍三个工作:反卷积层、ST-Net和CNN与RNN/LSTM的混合架构。&/p&&p&&figure&&img src=&https://pic3.zhimg.com/1d94bde6abca7_b.jpg& data-rawwidth=&641& data-rawheight=&493& class=&origin_image zh-lightbox-thumb& width=&641& data-original=&https://pic4.zhimg.com/1d94bde6abca7_r.jpg&&&/figure&&figure&&img src=&https://pic3.zhimg.com/87e48e4fbc5f7d55ccf125_b.jpg& data-rawwidth=&668& data-rawheight=&489& class=&origin_image zh-lightbox-thumb& width=&668& data-original=&https://pic2.zhimg.com/87e48e4fbc5f7d55ccf125_r.jpg&&&/figure&&figure&&img src=&https://pic4.zhimg.com/9a8b7bd96cce247c662e15_b.jpg& data-rawwidth=&677& data-rawheight=&480& class=&origin_image zh-lightbox-thumb& width=&677& data-original=&https://pic2.zhimg.com/9a8b7bd96cce247c662e15_r.jpg&&&/figure&&b&该文章属于“深度学习大讲堂”原创,如需要转载,请联系&a href=&https://www.zhihu.com/people/guo-dan-qing& class=&internal&&@果果是枚开心果&/a&.&/b&&/p&&br&&p&&b&作者简介:&/b&&/p&&br&&figure&&img src=&https://pic2.zhimg.com/1aec370a_b.jpg& data-rawwidth=&249& data-rawheight=&402& class=&content_image& width=&249&&&/figure&&b&刘昕&/b&,中国科学院计算技术研究所人脸识别研究组博士研究生,导师山世光研究员。博士阶段主要从事人脸识别与深度学习技术的研究与工业化应用。作为第一主力或并列第一主力获得 ICCV 2015 年龄估计竞赛亚军、ICCV 2015 文化事件识别竞赛冠军和 2015 年度阿里大规模图像检索竞赛总决赛冠军。&br&&p&&b&原文链接:&a href=&https://link.zhihu.com/?target=http%3A//mp.weixin.qq.com/s%3F__biz%3DMzI1NTE4NTUwOQ%3D%3D%26mid%3Didx%3D1%26sn%3D05b8d27dccf6efc3f85f47a%23rd& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&mp.weixin.qq.com/s?&/span&&span class=&invisible&&__biz=MzI1NTE4NTUwOQ==&mid=&idx=1&sn=05b8d27dccf6efc3f85f47a#rd&/span&&span class=&ellipsis&&&/span&&/a&&/b&&/p&&br&&p&&b&欢迎大家关注我们的微信公众号,搜索微信名称:深度学习大讲堂&/b&&/p&&figure&&img src=&https://pic1.zhimg.com/499b12b5d7aaa692b6637_b.jpg& class=&content_image&&&/figure&
深度学习大讲堂致力于推送人工智能,深度学习方面的最新技术,产品以及活动。请关注我们的知乎专栏! 一.DL基础理论 本页PPT给出了本节内容概要,我们从MCP神经元模型开始,首先回顾全连接层、卷积层等基础结构单元,Sigmoid等激活函数,Softmax等损失函数…
&figure&&img src=&https://pic3.zhimg.com/v2-1d697ebd1ba82e202d4ad1_b.jpg& data-rawwidth=&382& data-rawheight=&129& class=&content_image& width=&382&&&/figure&深度学习大讲堂致力于推送人工智能,深度学习方面的最新技术,产品以及活动。请关注我们的知乎专栏!&br&&br&&br&&br&&br&&br&&b&摘要&/b&&p&选读两篇IJCAI2016的深度学习论文,IBM东京研究院提出的基于模型性能预测的深度网络超参数快速选择算法和厦门大学纪荣嵘组提出的基于全局误差重构的深度网络模型压缩方法。&/p&&p&&b&IJCAI16会议介绍:&/b&&/p&&p&国际人工智能联合会议( International Joint Conference on Artificial Intelligence,IJCAI )是聚集人工智能领域研究者和从业者的盛会,也是人工智能领域中最主要的学术会议之一。1969 年到 2015 年,该大会在每个奇数年举办,现已举办了 24 届。随着近几年来人工智能领域的研究和应用的持续升温,从 2016 年开始,IJCAI 大会将变成每年举办一次的年度盛会;今年是该大会第一次在偶数年举办。第 25 届 IJCAI 大会于 7 月 9 日- 15 日在纽约举办。&/p&&p&&b&Guest Editor导读:&/b&&/p&&p&本届会议的举办地在繁华喧嚣的纽约时代广场附近,正映衬了人工智能领域几年来的火热氛围。此次大会包括7场特邀演讲、4场获奖演讲、551篇同行评议论文的presentation,41场workshop、37堂tutorial、22个demo等。深度学习成为了IJCAI 2016的关键词之一,以深度学习为主题的论文报告session共计有3个。本期我们从中选择了两篇篇深度学习领域的相关论文进行选读,组织了相关领域的博士研究生,介绍论文的主要思想,并对论文的贡献进行点评。&/p&&p&&b&1. Weight Features for Predicting Future Model Performance of Deep Neural Networks&/b&&/p&&p&IBM东京研究院的研究者研究了一个有趣且非常实用的问题,在深度学习的调参中如何快速的丢弃一些超参数的组合来加速调参。传统的方法只利用了网络训练过程中的learning curve(不同训练epoch的模型在测试集上最终性能构成的曲线), 却没有考虑网络模型参数与最终模型性能的相关性。本文提出利用网络训练阶段的参数作为特征,采用random forest学习回回归函数,直接建模参数和参数变化与最终模型性能的关系,预测网络的最终性能。&/p&&p&&figure&&img src=&https://pic4.zhimg.com/v2-b3b52b063082b_b.png& class=&content_image&&&/figure&&b&方法框架:&/b&特征设计和性能预测函数。特征设计部分参考了手工描述子的设计方式,比如对卷积核权重提取了等均值、方法、峰度、散度等特征,性能预测函数部分则直接使用了随机森林算法。通过在已有的learning curve上训练分类器器,可以在其他超参数组合训练的早期(比如前10个epoch)预测其最终模型的性能。&/p&&p&部分实验设计如表1,给出了ImageNet数据集上的超参数搜索空间。需要指出的是,在实践中,卷Act. func会默认为ReLU,大量实验表明ReLU效果更好。&br&&figure&&img src=&https://pic2.zhimg.com/v2-dbeac169f93ce9ab03c41a79_b.png& class=&content_image&&&/figure&下图所示为在三个数数据集的实验,虽然相比learning curve的方式,该方法的性能有显著的提高,但是分类正确率或者top-1错误率估计的均方误差(RMSE)还是达到0.13,这对于锱铢必较的细粒度调参来说暂时还达不到实用程度。但是一定意义上,通过文中方法early stop掉一些明显最终性能预期不好的超参数组合对于加速超参数搜索依旧有其实用价值。&br&&figure&&img src=&https://pic4.zhimg.com/v2-994a66bdc5a2a87e1c5a55b_b.png& class=&content_image&&&/figure&总结起来文章提供了一个通过模型参数来预测模型最高性能的方法,提供了超参数选择的一种思路。但是目前的实验结果尚不足以代精细化的调参,比如learning rate 0.01, 0.02….的细粒度调整。&/p&&p&本文方法的未来改进的空间在于由目前手工设计特征+分类器的两段式方法到非端到端的深度学习方法。此外,考虑实际应用中细粒度调参的需要也是本文方法的一个可能改进方向。&/p&&p&&b&2. Towards Convolutional Neural Networks Compression via Global Error Reconstruction&/b&&/p&&p&大规模深度卷积神经网络,例如VGGNet面临参数量大和计算复杂度高两个问题,现有的网络压缩方法如low-rank分层分解会带来层间的累积误差问题,影响网络全局逼近的精度。厦门大学纪荣嵘组的这篇论文设计了一种两段式网络压缩方法,首先对全连接层进行low–rank分解,接着引入了一个全局重构误差最小化的策略,通过最小化网络的重构误差来对压缩后的网络进行fine-tune,从而有效缓解了分层逼近带来的累积误差问题。&/p&&p&&b&方法框架:&/b&全连接层low-rank分解的方法图示如下,全连接矩阵W被分解为矩阵P和Q。&br&&figure&&img src=&https://pic1.zhimg.com/v2-cc0ffdcf5461eddcc28c06e5dd1e4700_b.png& class=&content_image&&&/figure&Low-rank分解的形式化如下:&br&&figure&&img src=&https://pic1.zhimg.com/v2-cade3cf7af2cd36be82463f0_b.png& class=&content_image&&&/figure&进一步的,基于全局误差最小化的优化目标,对low-rank分解后每一层的参数P1和Q1用误差反向传播算法进行更新。&br&&figure&&img src=&https://pic4.zhimg.com/v2-5bd08bb14d05e41a6c7ff_b.png& class=&content_image&&&/figure&在VGGNet上的实验结果如下图所示,文章提出的GER算法取得了state-of-the-art的性能。当然高压缩率情况下的GER明显的性能优势,理论上的意义更大一些,因为此时的性能损失已经太大。&br&&figure&&img src=&https://pic4.zhimg.com/v2-3e203dcb858aef895ce4816fee8b5c9b_b.jpg& class=&content_image&&&/figure&从实用性的角度,单独压缩全连接层虽然可以显著减少参数,但是理论意义更大,原因有两点:1)实践中已经越来越少使用全连接层,例如ResNet中就没有全连接层(分类器层除外)。2)卷积层占了主要的计算量,虽然显著压缩了参数,但并不能明显改善速度。&/p&&p&本文的潜在优势在于,卷积层的运算实际上可以写成patch展开后的矩阵(Caffe中的Im2Col操作)和kernel matrix的矩阵相乘,也可以采用low-rank的方法逼近,因此本文方法如果扩展到卷积层,则可以直接降低卷积层计算量和参数量,这也是GER在实际问题中的潜力所在。&/p&&br&&p&&b&参与人员:&/b&&/p&&p&&b&胡兰青,&/b&中科院计算所VIPL研究组博士研究生&/p&&p&&b&尹肖贻,&/b&中科院计算所VIPL研究组博士研究生&/p&&p&&b&刘昊淼,&/b&中科院计算所VIPL研究组博士研究生&/p&&p&&b&刘
昕,&/b&中科院计算所VIPL研究组博士研究生&/p&&br&&p&&b&该文章属于“深度学习大讲堂”原创,如需要转载,请联系&a href=&https://www.zhihu.com/people/guo-dan-qing& class=&internal&&@果果是枚开心果.&/a&&/b&&/p&&p&&b&Guest Editor:&/b&&/p&&p&&b&&figure&&img src=&https://pic2.zhimg.com/v2-50fecb565c4cf89f5a509_b.jpg& data-rawwidth=&118& data-rawheight=&117& class=&content_image& width=&118&&&/figure&朱鹏飞,&/b&天津大学机器学习与数据挖掘实验室副教授,硕士生导师。分别于年在哈尔滨工业大学能源科学与工程学院获得学士和硕士学位,2015年于香港理工大学电子计算学系获得博士学位。目前,在机器学习与计算机视觉国际顶级会议和期刊上发表论文20余篇,包括AAAI、IJCAI、ICCV、ECCV以及IEEE Transactions on Information Forensics and Security等。&br&&/p&&br&&p&&b&原文链接:&a href=&http://link.zhihu.com/?target=http%3A//mp.weixin.qq.com/s%3F__biz%3DMzI1NTE4NTUwOQ%3D%3D%26mid%3D%26idx%3D1%26sn%3D362d476d3bf%26chksm%3Df235a53fcb7e8f9b0ece7a03fa318d2%26scene%3D0%23wechat_redirect& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&IJCAI16论文速读:Deep Learning论文选读(上)&/a&&br&&/b&&/p&&p&&b&欢迎大家关注我们的微信公众号,搜索微信名称:深度学习大讲堂&/b&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-a29f11dacaf2c3a3f8b93_b.jpg& data-rawwidth=&346& data-rawheight=&67& class=&content_image& width=&346&&&/figure&
深度学习大讲堂致力于推送人工智能,深度学习方面的最新技术,产品以及活动。请关注我们的知乎专栏! 摘要选读两篇IJCAI2016的深度学习论文,IBM东京研究院提出的基于模型性能预测的深度网络超参数快速选择算法和厦门大学纪荣嵘组提出的基于全局误差重构的…
&figure&&img src=&https://pic3.zhimg.com/fa53a5422a8_b.jpg& data-rawwidth=&554& data-rawheight=&200& class=&origin_image zh-lightbox-thumb& width=&554& data-original=&https://pic1.zhimg.com/fa53a5422a8_r.jpg&&&/figure&&p&深度学习大讲堂致力于推送人工智能,深度学习方面的最新技术,产品以及活动。请关注我们的知乎专栏!&br&&/p&&br&&br&&br&&br&&p&&b&摘要&/b&&/p&&p&近年来,深度学习方法在物体跟踪领域有不少成功应用,并逐渐在性能上超越传统方法。本文对现有基于深度学习的目标跟踪算法进行了分类梳理,希望能给读者带来启发。&/p&&figure&&img src=&https://pic3.zhimg.com/fa53a5422a8_b.jpg& data-rawwidth=&554& data-rawheight=&200& class=&origin_image zh-lightbox-thumb& width=&554& data-original=&https://pic1.zhimg.com/fa53a5422a8_r.jpg&&&/figure&&p&开始本文之前,我们首先看上方给出的3张图片,它们分别是同一个视频的第1,40,80帧。在第1帧给出一个跑步者的边框(bounding-box)之后,后续的第40帧,80帧,bounding-box依然准确圈出了同一个跑步者。以上展示的其实就是目标跟踪(visual object tracking)的过程。目标跟踪(特指单目标跟踪)是指:给出目标在跟踪视频第一帧中的初始状态(如位置,尺寸),自动估计目标物体在后续帧中的状态。&/p&&p&人眼可以比较轻松的在一段时间内跟住某个特定目标。但是对机器而言,这一任务并不简单,尤其是跟踪过程中会出现目标发生剧烈形变、被其他目标遮挡或出现相似物体干扰等等各种复杂的情况。过去几十年以来,目标跟踪的研究取得了长足的发展,尤其是各种机器学习算法被引入以来,目标跟踪算法呈现百花齐放的态势。2013年以来,深度学习方法开始在目标跟踪领域展露头脚,并逐渐在性能上超越传统方法,取得巨大的突破。本文首先简要介绍主流的传统目标跟踪方法,之后对基于深度学习的目标跟踪算法进行介绍,最后对深度学习在目标跟踪领域的应用进行总结和展望。&/p&&p&&b&经典目标跟踪方法&/b&&/p&&p&目前跟踪算法可以被分为产生式(generative model)和判别式(discriminative model)两大类别。&/p&&p&产生式方法运用生成模型描述目标的表观特征,之后通过搜索候选目标来最小化重构误差。比较有代表性的算法有稀疏编码(sparse coding),在线密度估计(online density estimation)和主成分分析(PCA)等。产生式方法着眼于对目标本身的刻画,忽略背景信息,在目标自身变化剧烈或者被遮挡时容易产生漂移。&/p&&p&与之相对的,判别式方法通过训练分类器来区分目标和背景。这种方法也常被称为tracking-by-detection。近年来,各种机器学习算法被应用在判别式方法上,其中比较有代表性的有多示例学习方法(multiple instance learning), boosting和结构SVM(structured SVM)等。判别式方法因为显著区分背景和前景的信息,表现更为鲁棒,逐渐在目标跟踪领域占据主流地位。值得一提的是,目前大部分深度学习目标跟踪方法也归属于判别式框架。&/p&&p&近年来,基于相关滤波(correlation filter)的跟踪方法因为速度快,效果好吸引了众多研究者的目光。相关滤波器通过将输入特征回归为目标高斯分布来训练 filters。并在后续跟踪中寻找预测分布中的响应峰值来定位目标的位置。相关滤波器在运算中巧妙应用快速傅立叶变换获得了大幅度速度提升。目前基于相关滤波的拓展方法也有很多,包括核化相关滤波器(kernelized correlation filter, KCF), 加尺度估计的相关滤波器(DSST)等。&/p&&p&&b&基于深度学习的目标跟踪方法&/b&&/p&&p&不同于检测、识别等视觉领域深度学习一统天下的趋势,深度学习在目标跟踪领域的应用并非一帆风顺。其主要问题在于训练数据的缺失:深度模型的魔力之一来自于对大量标注训练数据的有效学习,而目标跟踪仅仅提供第一帧的bounding-box作为训练数据。这种情况下,在跟踪开始针对当前目标从头训练一个深度模型困难重重。目前基于深度学习的目标跟踪算法采用了几种思路来解决这个问题,下面将依据思路的不同展开介绍,并在最后介绍目前跟踪领域出现的运用递归神经网络(recurrent neural network)解决目标跟踪问题的新思路。&/p&&p&&b&利用辅助图片数据预训练深度模型,在线跟踪时微调&/b&&/p&&p&在目标跟踪的训练数据非常有限的情况下,使用辅助的非跟踪训练数据进行预训练,获取对物体特征的通用表示(general representation ),在实际跟踪时,通过利用当前跟踪目标的有限样本信息对预训练模型微调(fine-tune), 使模型对当前跟踪目标有更强的分类性能,这种迁移学习的思路极大的减少了对跟踪目标训练样本的需求,也提高了跟踪算法的性能。&/p&&p&这个方面代表性的作品有DLT和SO-DLT,都出自香港科技大学王乃岩博士。&/p&&p&&b&DLT(NIPS2013)&/b&&/p&&p&&b&Learning a Deep Compact Image Representation for Visual Tracking&/b&&/p&&figure&&img src=&https://pic4.zhimg.com/58a578d8abf_b.jpg& data-rawwidth=&2398& data-rawheight=&1172& class=&origin_image zh-lightbox-thumb& width=&2398& data-original=&https://pic4.zhimg.com/58a578d8abf_r.jpg&&&/figure&&p&DLT是第一个把深度模型运用在单目标跟踪任务上的跟踪算法。它的主体思路如上图所示:&/p&&p&&b&(1) &/b&
先使用栈式降噪自编码器(stacked denoising autoencoder,SDAE)在Tiny Images dataset这样的大规模自然图像数据集上进行无监督的离线预训练来获得通用的物体表征能力。预训练的网络结构如上图(b)所示,一共堆叠了4个降噪自编码器, 降噪自编码器对输入加入噪声,通过重构出无噪声的原图来获得更鲁棒的特征表达能力。SDAE24-512-256这样的瓶颈式结构设计也使获得的特征更加compact。&/p&&p&&b&(2) &/b&
之后的在线跟踪部分结构如上图(c)所示,取离线SDAE的encoding部分叠加sigmoid分类层组成了分类网络。此时的网络并没有获取对当前被跟踪物体的特定表达能力。此时利用第一帧获取正负样本,对分类网络进行fine-tune获得对当前跟踪目标和背景更有针对性的分类网络。在跟踪过程中,对当前帧采用粒子滤波(particle filter)的方式提取一批候选的patch(相当于detection中的proposal),这些patch输入分类网络中,置信度最高的成为最终的预测目标。&/p&&p&&b&(3)&/b&
在目标跟踪非常重要的模型更新策略上,该论文采取限定阈值的方式,即当所有粒子中最高的confidence低于阈值时,认为目标已经发生了比较大的表观变化,当前的分类网络已经无法适应,需要进行更新。&/p&&p&&b&小结:&/b&DLT作为第一个将深度网络运用于单目标跟踪的跟踪算法,首先提出了“离线预训练+在线微调”的思路,很大程度的解决了跟踪中训练样本不足的问题,在CVPR2013提出的OTB50数据集上的29个跟踪器中排名第5。&/p&&p&但是DLT本身也存在一些不足:&/p&&p&&b&(1) &/b&
离线预训练采用的数据集Tiny Images dataset只包含32*32大小的图片,分辨率明显低于主要的跟踪序列,因此SDAE很难学到足够强的特征表示。&/p&&p&&b&(2)
&/b& 离线阶段的训练目标为图片重构,这与在线跟踪需要区分目标和背景的目标相差甚大。&/p&&p&&b&(3)
&/b& SDAE全连接的网络结构使其对目标的特征刻画能力不够优秀,虽然使用了4层的深度模型,但效果仍低于一些使用人工特征的传统跟踪方法如Struck等。&/p&&p&&b&SO-DLT(arXiv2015)&/b&&/p&&p&&b&Transferring Rich Feature Hierarchies for Robust Visual Tracking&/b&&/p&&p&SO-DLT延续了DLT利用非跟踪数据预训练加在线微调的策略,来解决跟踪过程中训练数据不足的问题,同时也对DLT存在的问题做了很大的改进。&/p&&figure&&img src=&https://pic1.zhimg.com/da42f4f22a574d4b2e8a_b.jpg& data-rawwidth=&1357& data-rawheight=&252& class=&origin_image zh-lightbox-thumb& width=&1357& data-original=&https://pic3.zhimg.com/da42f4f22a574d4b2e8a_r.jpg&&&/figure&&p&&b&(1)&/b&
使用CNN作为获取特征和分类的网络模型。如上图所示,SO-DLT使用了的类似AlexNet的网络结构,但是有几大特点:一、针对跟踪候选区域的大小将输入缩小为100*100,而不是一般分类或检测任务中的224*224。 二、网络的输出为50*50大小,值在0-1之间的概率图(probability map),每个输出像素对应原图2*2的区域,输出值越高则该点在目标bounding-box中的概率也越高。这样的做法利用了图片本身的结构化信息,方便直接从概率图确定最终的bounding-box,避免向网络输入数以百计的proposal,这也是SO-DLT structured output得名的由来。三、在卷积层和全连接层中间采用SPP-NET中的空间金字塔采样(spatial pyramid pooling)来提高最终的定位准确度。&/p&&p&&b&(2)&/b&
在离线训练中使用ImageNet 2014的detection数据集使CNN获得区分object和非object(背景)的能力。&/p&&figure&&img src=&https://pic3.zhimg.com/ba599fc90a877c_b.jpg& data-rawwidth=&1345& data-rawheight=&444& class=&origin_image zh-lightbox-thumb& width=&1345& data-original=&https://pic3.zhimg.com/ba599fc90a877c_r.jpg&&&/figure&&p&SO-DLT在线跟踪的pipeline如上图所示:&/p&&p&&b&(1)
&/b& 处理第t帧时,首先以第t-1帧的的预测位置为中心,从小到大以不同尺度crop区域放入CNN当中,当CNN输出的probability map的总和高于一定阈值时,停止crop, 以当前尺度作为最佳的搜索区域大小。&/p&&p&&b&(2) &/b&
选定第t帧的最佳搜索区域后,在该区域输出的probability map上采取一系列策略确定最终的bounding-box中心位置和大小。&/p&&p&&b&(3)&/b&
在模型更新方面,为了解决使用不准确结果fine-tune导致的drift问题,使用了long-term 和short-term两个CNN,即CNNs和CNNl。CNNs更新频繁,使其对目标的表观变化及时响应。CNNl更新较少,使其对错误结果更加鲁棒。二者结合,取最confident的结果作为输出。从而在adaptation和drift之间达到一个均衡。&/p&&p&&b&小结:&/b&SO-DLT作为large-scale CNN网络在目标跟踪领域的一次成功应用,取得了非常优异的表现:在CVPR2013提出的OTB50数据集上OPE准确度绘图(precision plot)达到了0.819, OPE成功率绘图(success plot)达到了0.602。远超当时其它的state of the art。&/p&&p&SO-DLT有几点值得借鉴:&/p&&p&&b&(1)&/b&
针对tracking问题设计了有针对性的网络结构。&/p&&p&&b&(2)&/b&
应用CNNS和CNNL用ensemble的思路解决update 的敏感性,特定参数取多值做平滑,解决参数取值的敏感性。这些措施目前已成为跟踪算法提高评分的杀手锏。&/p&&p&但是SO-DLT离线预训练依然使用的是大量无关联图片,作者认为使用更贴合跟踪实质的时序关联数据是一个更好的选择。&/p&&p&&b&利用现有大规模分类数据集预训练的CNN分类网络提取特征&/b&&/p&&p&2015年以来,在目标跟踪领域应用深度学习兴起了一股新的潮流。即直接使用ImageNet这样的大规模分类数据库上训练出的CNN网络如VGG-Net获得目标的特征表示,之后再用观测模型(observation model)进行分类获得跟踪结果。这种做法既避开了跟踪时直接训练large-scale CNN样本不足的困境,也充分利用了深度特征强大的表征能力。这样的工作在ICML15,ICCV15,CVPR16均有出现。下面介绍两篇发表于ICCV15的工作。&/p&&p&&b&FCNT(ICCV15)&/b&&/p&&p&&b&Visual Tracking with Fully Convolutional Networks&/b&&/p&&p&作为应用CNN特征于物体跟踪的代表作品,FCNT的亮点之一在于对ImageNet上预训练得到的CNN特征在目标跟踪任务上的性能做了深入的分析,并根据分析结果设计了后续的网络结构。&/p&&p&FCNT主要对VGG-16的Conv4-3和Conv5-3层输出的特征图谱(feature map)做了分析,并得出以下结论:&/p&&p&&b&(1)
&/b& CNN 的feature map可以用来做跟踪目标的定位。&/p&&p&&b&(2)
&/b& CNN 的许多feature map存在噪声或者和物体跟踪区分目标和背景的任务关联较小。&/p&&p&&b&(3) &/b&
CNN不同层的特征特点不一。高层(Conv5-3)特征擅长区分不同类别的物体,对目标的形变和遮挡非常鲁棒,但是对类内物体的区分能力非常差。低层(Conv4-3)特征更关注目标的局部细节,可以用来区分背景中相似的distractor,但是对目标的剧烈形变非常不鲁棒。&/p&&figure&&img src=&https://pic1.zhimg.com/e9b30b24e85c54bd027d0c7290fe5cdc_b.jpg& data-rawwidth=&2366& data-rawheight=&690& class=&origin_image zh-lightbox-thumb& width=&2366& data-original=&https://pic1.zhimg.com/e9b30b24e85c54bd027d0c7290fe5cdc_r.jpg&&&/figure&&p&依据以上分析,FCNT最终形成了如上图所示的框架结构:&/p&&p&&b&(1)&/b&
对于Conv4-3和Conv5-3特征分别构建特征选择网络sel-CNN(1层dropout加1层卷积),选出和当前跟踪目标最相关的feature map channel。&/p&&p&&b&(2)
&/b& 对筛选出的Conv5-3和Conv4-3特征分别构建捕捉类别信息的GNet和区分distractor(背景相似物体)的SNet(都是两层卷积结构)。&/p&&p&&b&(3)
&/b& 在第一帧中使用给出的bounding-box生成热度图(heat map)回归训练sel-CNN, GNet和SNet。&/p&&p&&b&(4)
&/b& 对于每一帧,以上一帧预测结果为中心crop出一块区域,之后分别输入GNet和SNet,得到两个预测的heatmap,并根据是否有distractor决定使用哪个heatmap 生成最终的跟踪结果。&/p&&p&&b&小结:&/b&FCNT根据对CNN不同层特征的分析,构建特征筛选网络和两个互补的heat-map预测网络。达到有效抑制distractor防止跟踪器漂移,同时对目标本身的形变更加鲁棒的效果,也是ensemble思路的又一成功实现。在CVPR2013提出的OTB50数据集上OPE准确度绘图(precision plot)达到了0.856,OPE成功率绘图(success plot)达到了0.599,准确度绘图有较大提高。实际测试中FCNT的对遮挡的表现不是很鲁棒,现有的更新策略还有提高空间。&/p&&p&&b&Hierarchical Convolutional Features for Visual Tracking(ICCV15)&/b&&/p&&p&这篇是作者在2015年度看到的最简洁有效的利用深度特征做跟踪的论文。其主要思路是提取深度特征,之后利用相关滤波器确定最终的bounding-box。&/p&&p&这篇论文简要分析了VGG-19特征( Conv3_4, Conv4_4, Conv5_4 )在目标跟踪上的特性,得出的结论和FCNT有异曲同工之处,即:&/p&&p&&b&(1)
&/b& 高层特征主要反映目标的语义特性,对目标的表观变化比较鲁棒。&/p&&p&&b&(2)
&/b& 低层特征保存了更多细粒度的空间特性,对跟踪目标的精确定位更有效。&/p&&figure&&img src=&https://pic1.zhimg.com/bdf1bb043ba3c8b579fe4ccebac1d1ec_b.jpg& data-rawwidth=&1428& data-rawheight=&806& class=&origin_image zh-lightbox-thumb& width=&1428& data-original=&https://pic1.zhimg.com/bdf1bb043ba3c8b579fe4ccebac1d1ec_r.jpg&&&/figure&&p&基于以上结论,作者给出了一个粗粒度到细粒度(coarse-to-fine)的跟踪算法即:&/p&&p&&b&(1) &/b&
第一帧时,利用Conv3_4,Conv4_4,Conv5_4特征的插值分别训练得到3个相关滤波器。&/p&&p&&b&(2)&/b&
之后的每帧,以上一帧的预测结果为中心crop出一块区域,获取三个卷积层的特征,做插值,并通过每层的相关滤波器预测二维的confidence score。&/p&&p&&b&(3)
&/b& 从Conv5_4开始算出confidence score上最大的响应点,作为预测的bounding-box的中心位置,之后以这个位置约束下一层的搜索范围,逐层向下做更细粒度的位置预测,以最低层的预测结果作为最后输出。具体公式如下:&/p&&figure&&img src=&https://pic2.zhimg.com/d1b1c59cf3b8e80cdbcfd73c_b.jpg& data-rawwidth=&256& data-rawheight=&76& class=&content_image& width=&256&&&/figure&&p&&b&(4) &/b&
利用当前跟踪结果对每一层的相关滤波器做更新。&/p&&p&&b&小结:&/b&这篇文章针对VGG-19各层特征的特点,由粗粒度到细粒度最终准确定位目标的中心点。在CVPR2013提出的OTB50数据集上OPE准确度绘图达到了0.891,OPE成功率绘图达到了0.605,相较于FCNT和SO-DLT都有提高,实际测试时性能也相当稳定,显示出深度特征结合相关滤波器的巨大优势。但是这篇文章中的相关滤波器并没有对尺度进行处理,在整个跟踪序列中都假定目标尺度不变。在一些尺度变化非常剧烈的测试序列上如CarScale上最终预测出的bounding-box尺寸大小和目标本身大小相差较大。&/p&&p&以上两篇文章均是应用预训练的CNN网络提取特征提高跟踪性能的成功案例,说明利用这种思路解决训练数据缺失和提高性能具有很高的可行性。但是分类任务预训练的CNN网络本身更关注区分类间物体,忽略类内差别。目标跟踪时只关注一个物体,重点区分该物体和背景信息,明显抑制背景中的同类物体,但是还需要对目标本身的变化鲁棒。分类任务以相似的一众物体为一类,跟踪任务以同一个物体的不同表观为一类,使得这两个任务存在很大差别,这也是两篇文章融合多层特征来做跟踪以达到较理想效果的动机所在。&/p&&p&&b&利用跟踪序列预训练,在线跟踪时微调&/b&&/p&&p&1和2中介绍的解决训练数据不足的策略和目标跟踪的任务本身存在一定偏离。有没有更好的办法呢?VOT2015冠军MDNet给出了一个示范。该方法在OTB50上也取得了OPE准确度绘图0.942,OPE成功率绘图0.702的惊人得分。&/p&&p&&b&MDNet(CVPR2016)&/b&&/p&&p&&b&Learning Multi-Domain Convolutional Neural Networks for Visual Tracking&/b&&/p&&p&意识到图像分类任务和跟踪之间存在巨大差别,MDNet提出直接用跟踪视频预训练CNN获得general的目标表示能力的方法。但是序列训练也存在问题,即不同跟踪序列跟踪目标完全不一样,某类物体在一个序列中是跟踪目标,在另外一个序列中可能只是背景。不同序列中目标本身的表观和运动模式、环境中光照、遮挡等情形相差甚大。这种情况下,想要用同一个CNN完成所有训练序列中前景和背景区分的任务,困难重重。&/p&&figure&&img src=&https://pic1.zhimg.com/da9f8c9ab94a_b.jpg& data-rawwidth=&1406& data-rawheight=&564& class=&origin_image zh-lightbox-thumb& width=&1406& data-original=&https://pic3.zhimg.com/da9f8c9ab94a_r.jpg&&&/figure&&p&最终MDNet提出Multi-Domain的训练思路和如上图所示的Multi-Domain Network。该网络分为共享层和domain-specific层两部分。即:将每个训练序列当成一个单独的domain,每个domain都有一个针对它的二分类层(fc6),用于区分当前序列的前景和背景,而网络之前的所有层都是序列共享的。这样共享层达到了学习跟踪序列中目标general的特征表达的目的,而domain-specific层又解决了不同训练序列分类目标不一致的问题。&/p&&p&具体训练时,MDNet的每个mini-batch只由一个特定序列的训练数据构成,只更新共享层和针对当前序列的特定fc6层。这样共享层中获得了对序列共有特征的表达能力,如对光照、形变等的鲁棒性。MDNet的训练数据也非常有意思,即测试OTB100数据集时,利用VOT的不重合的58个序列来做预训练。测试VOT2014数据集时,利用OTB100上不重合的89个序列做预训练。这种交替利用的思路也是第一次在跟踪论文中出现。&/p&&p&在线跟踪阶段针对每个跟踪序列,MDNet主要有以下几步:&/p&&p&&b&(1)&/b&
随机初始化一个新的fc6层。&/p&&p&&b&(2) &/b&
使用第一帧的数据来训练该序列的bounding box回归模型。&/p&&p&&b&(3)&/b&
用第一帧提取正样本和负样本,更新fc4, fc5和fc6层的权重。&/p&&p&&b&(4) &/b&
之后产生256个候选样本,并从中选择置信度最高的,之后做bounding-box regression得到最终结果。&/p&&p&&b&(5)
&/b& 当前帧最终结果置信度较高时,采样更新样本库,否则根据情况对模型做短期或者长期更新。&/p&&p&MDNet有两点值得借鉴之处:&/p&&p&&b&(1)&/b&
MDNet应用了更为贴合跟踪实质的视频数据来做训练,并提出了创新的Multi-domain训练方法和训练数据交叉运用的思路。&/p&&p&&b&(2) &/b&
此外MDNet从检测任务中借鉴了不少行之有效的策略,如难例挖掘(hard negative mining),bounding box回归等。尤其是难例回归通过重点关注背景中的难点样本(如相似物体等)显著减轻了跟踪器漂移的问题。这些策略也帮助MDNet在TPAMI2015 OTB100数据集上OPE准确度绘图从一开始的0.825提升到0.908, OPE成功率绘图从一开始的0.589提升到0.673。&/p&&p&但是也可以发现MDNet的总体思路和RCNN比较类似,需要前向传递上百个proposal,虽然网络结构较小,速度仍较慢。且boundingbox回归也需要单独训练,因此MDNet还有进一步提升的空间。&/p&&p&&b&运用递归神经网络进行目标跟踪的新思路&/b&&/p&&p&近年来RNN尤其是带有门结构的LSTM,GRU等在时序任务上显示出了突出的性能。不少研究者开始探索如何应用RNN来做解决现有跟踪任务中存在的问题,以下简要介绍两篇在这方面比较有代表性的探索文章。&/p&&p&&b&RTT(CVPR16)&/b&&/p&&p&&b&Recurrently Target-Attending Tracking&/b&&/p&&p&这篇文章的出发点比较有意思,即利用多方向递归神经网络(multi-directional recurrent neural network)来建模和挖掘对整体跟踪有用的可靠目标部分(reliable part),实际上是二维平面上的RNN建模,最终解决预测误差累积和传播导致的跟踪漂移问题。其本身也是对part-based跟踪方法和相关滤波(correlation filter)方法的改进和探索。&/p&&figure&&img src=&https://pic2.zhimg.com/6df1c33eaa0b357abec13c711d9fcddd_b.jpg& data-rawwidth=&2222& data-rawheight=&790& class=&origin_image zh-lightbox-thu}

我要回帖

更多关于 springmvc找不到页面 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信