技术教程 Caffe学习笔记

Caffe学习笔记

AI君

小伙伴们大家好啊!

AI君,真的是你吗,消失了这么久!我还以为你被马斯克的计算机带到太空去了呢!

AI君

好久不见!因为AI君近期遇到很多事情,而且一直在忙着做项目,所以停更了一段时间,还请小伙伴们谅解。

好吧,原谅你啦,今天要给我们更新什么词条呀?

AI君

我们今天先不急着更新《技术词条》系列文章,因为它们侧重于算法的原理和数学逻辑。已经讲了这么多理论基础,我们今天就来说说如何上手训练我们的算法模型,该利用什么样的工具吧。

好啊好啊,看了太多理论啦,好想看看是怎么写代码实现这些算法的呢?

AI君

在实现算法的过程中,我们可以在每一个部分都使用自己编写的代码,比如说梯度下降中的梯度计算等。但是每次训练都需要自己编写有很多问题,一方面有重复的工作,另一方面容易出错。比如梯度计算就是一个很容易出错的环节,所以我们在不利用工具编写自己的神经网络时,经常需要做额外的debug,比如说梯度检查。

但是个人编写的代码质量参差不齐,效率不稳定,而且工作量大,所以在构建神经网络的过程中,使用一些大公司开发维护的框架可以节省很多时间精力。

深度学习领域有很多常用的框架,比如Caffe, Keras, Google的TensorFlow,以及Facebook的Pytorch等等。

今天AI君就从大名鼎鼎的Caffe开始,为小伙伴们介绍这一工具的基本结构和使用方法。

Caffe是什么?

AI君

Caffe是一款深度学习常用的第三方框架,它由现任Facebook人工智能专家贾扬清在UC Berkeley读博期间创立,主要针对计算机视觉领域的开发,目前也延伸至序列信号、语言文字和强化学习领域。

现在有很多流行的框架,Caffe的特点是什么?

AI君

Caffe的特点是使用命令行模式,拥有支持良好的Matlab和Python接口,此外,CPU和GPU运行的无缝切换也是Caffe一直宣传的亮点。

一个Caffe构建的深度学习模型有哪些构成呢?

AI君

一个Caffe的模型有3个核心的组成,分别是Blobs, Layers以及Nets。

先讲讲Blobs,外部的数据首先要转换成Blobs才可以在Caffe模型中进行存储、交换和其他运算。其次模型本身的参数/超参数也都是用Blobs的形式存储的。

Blobs的本质是多维数组,对于图片数据来说,Blobs的维度是"数量N * 通道数K * 高度H * 宽度 W"。在批处理数据情况下,数量N是数据的Batch size。Blobs存储着两大块内容,分别是数据(data)和梯度(diff)。

访问Blob里的数据由两种方法,一种不改变数据,叫做const;另一种会改变数据,叫做mutable。

在Caffe的模型运行中,首先在主机端(host)载入磁盘中的数据,转化成blob的形式,这一过程使用CPU代码完成。然后blob数据会转移到设备端(device),也就是GPU中进行运算,然后沿着神经网络不断将数据传递给下一层。如果所有层(layers)的运算都是GPU类型的,那么中间的数据(data)和梯度(diff)都会一直保留在GPU中。

Ok,这是Blobs,再讲一下Layers和Nets吧?

AI君

Caffe模型中Layers的主要任务就是承担神经网络的各种运算,比如说卷积(convolve),池化(pooling),激活函数(activation function)以及数据预处理等等。这些运算都是Caffe自己定义好的,使用起来非常方便。每个Layer从底部(bottom)输入blob数据,然后从顶部(top)输出blob数据。如图1所示就是一个负责卷积运算的Convolution layer,每个Convolution layer使用filter对输入图像进行卷积操作,输出相应的特征地图(feature map)。

图1 Convolution Layer

AI君

Caffe中有着各种类型的layer,可以完成各种神经网络的运算。除了上面看到的Convolution Layer, 还有比如说Pooling Layer, Im2Col, Dropout, Batch Normalization等等,文末参考文献中会附上官方公布的完整Layers列表和详细说明。

总地来说,每种Layer的结构都包括了3个部分,分别是初始化(Setup)、前向运算(Forward)和后向运算(Backward)。Setup部分初始化layer的结构和相应参数; Forward部分负责接收底部(bottom)的输入,然后将运算结果输出给顶层(top); Backward负责反向传播计算,得到针对输入数据的梯度,并通过bottom传递给较低的下一层。在实际运行中,CPU和GPU中都分别有一个Forward和Backward运算结构。

AI君

最后再来讲讲Caffe模型中的第三个部分Nets。顾名思义,将多个Layer组合在一起就可以构成一个Net了。通常一个Net最底层是一个Data Layer, 用来从硬盘中载入数据,最顶层是一个Loss Layer,用来计算损失函数或者目标函数值。

说了这么多,能不能直观地举个例子?

AI君

没问题呢,那就举一个逻辑回归分类器的例子吧,它的Caffe结构如图2所示。

图2 一个逻辑回归分类器的Caffe模型

AI君

如图2所示,Data Layer载入数据和对应的标签,Inner_product Layer构建了一个全连接的多层感知器(Multi Layer Perceptron, MLP),然后Loss Layer接受Inner_product层的输出和Data Layer的标签,从而计算出Loss值,用于反向传播的权值更新。定义Caffe模型是通过创建协议缓存定义文件(protocol buffer definition file),即prototxt文件来实现的。上面的这个逻辑回归分类器可以通过以下代码实现定义。

AI君

代码最上方的name是模型的名称,然后按照从bottom到top的顺序定义各个layer。每个layer中的参数都和layer的功能相关,根据需要设置即可。Caffe模型是在prototxt文件中定义,然后训练好的模型保留在binaryproto文件中。

好的好的,谢谢AI君,快点更新下一篇,别消失了哈!

AI君

没问题,请在文章末尾留言写出你的想法,告诉AI君你最想了解的人工智能算法和工具,我就会优先写出你想看的文章哦。

最后,请大家帮忙多多转发文章,感激不尽!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180529G222P100?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券