caffe prototxt详解.proto里面的数据是什么意思

5036人阅读
caffe框架(61)
solver算是caffe的核心的核心,它协调着整个模型的运作。caffe程序运行必带的一个参数就是solver配置文件。运行代码一般为
在Deep Learning中,往往loss function是非凸的,没有解析解,我们需要通过优化方法来求解。solver的主要作用就是交替调用前向(forward)算法和后向(backward)算法来更新参数,从而最小化loss,实际上就是一种迭代的优化算法。
&到目前的版本,caffe提供了六种优化算法来求解最优参数,在solver配置文件中,通过设置type类型来选择。
·&&&&&&&&Stochastic Gradient Descent (type:&SGD&),
·&&&&&&&&AdaDelta (type:&AdaDelta&),
·&&&&&&&&Adaptive Gradient (type:&AdaGrad&),
·&&&&&&&&Adam (type: &Adam&),
·&&&&&&&&Nesterov’s Accelerated Gradient (type: &Nesterov&) and
·&&&&&&&&RMSprop (type:&RMSProp&)
Solver的流程:
1.&&&&&设计好需要优化的对象,以及用于学习的训练网络和用于评估的测试网络。(通过调用另外一个配置文件prototxt来进行)
2.&&&&&通过forward和backward迭代的进行优化来跟新参数。
3.&&&&&定期的评价测试网络。 (可设定多少次训练后,进行一次测试)
4.&&&&&在优化过程中显示模型和solver的状态
在每一次的迭代过程中,solver做了这几步工作:
1、调用forward算法来计算最终的输出值,以及对应的loss
2、调用backward算法来计算每层的梯度
3、根据选用的slover方法,利用梯度进行参数更新
4、记录并保存每次迭代的学习率、快照,以及对应的状态。
接下来,我们先来看一个实例:
接下来,我们对每一行进行详细解译:
设置网络模型。每一个模型就是一个net,需要在一个专门的配置文件中对net进行配置,每个net由许多的layer所组成。注意的是:文件的路径要从caffe的根目录开始,其它的所有配置都是这样。
接下来第二行:
test_iter: 100
这个要与test layer中的batch_size结合起来理解。mnist数据中测试样本总数为10000,一次性执行全部数据效率很低,因此我们将测试数据分成几个批次来执行,每个批次的数量就是batch_size。假设我们设置batch_size为100,则需要迭代100次才能将10000个数据全部执行完。因此test_iter设置为100。执行完一次全部数据,称之为一个epoch。
测试间隔。也就是每训练500次,才进行一次测试。
这四行可以放在一起理解,用于学习率的设置。只要是梯度下降法来求解优化,都会有一个学习率,也叫步长。base_lr用于设置基础学习率,在迭代的过程中,可以对基础学习率进行调整。怎么样进行调整,就是调整的策略,由lr_policy来设置。
lr_policy可以设置为下面这些值,相应的学习率的计算为:
- fixed:  &保持base_lr不变.
- step:   &如果设置为step,则还需要设置一个stepsize, &返回 base_lr * gamma ^ (floor(iter / stepsize)),其中iter表示当前的迭代次数
- exp: &   返回base_lr * gamma ^ iter, iter为当前迭代次数
- inv:  & & 如果设置为inv,还需要设置一个power, 返回base_lr * (1 + gamma * iter) ^ (- power)
- multistep:&如果设置为multistep,则还需要设置一个stepvalue。这个参数和step很相似,step是均匀等间隔变化,而multistep则是根据 & & & & & & & & & & & & & & &
& stepvalue值变化
- poly:    &学习率进行多项式误差, 返回 base_lr (1 - iter/max_iter) ^ (power)
- sigmoid: 学习率进行sigmod衰减,返回 base_lr ( 1/(1 + exp(-gamma * (iter - stepsize))))
multistep示例:
接下来的参数:
上一次梯度更新的权重
优化算法选择。这一行可以省掉,因为默认值就是SGD。总共有六种方法可选择,在本文的开头已介绍。
权重衰减项,防止过拟合的一个参数。
每训练100次,在屏幕上显示一次。如果设置为0,则不显示。
最大迭代次数。这个数设置太小,会导致没有收敛,精确度很低。设置太大,会导致震荡,浪费时间。
快照。将训练出来的model和solver状态进行保存,snapshot用于设置训练多少次后进行保存,默认为0,不保存。snapshot_prefix设置保存路径。
还可以设置snapshot_diff,是否保存梯度值,默认为false,不保存。
也可以设置snapshot_format,保存的类型。有两种选择:HDF5 和BINARYPROTO ,默认为BINARYPROTO
设置运行模式。默认为GPU,如果你没有GPU,则需要改成CPU,否则会出错。
&注意:以上的所有参数都是可选参数,都有默认值。根据solver方法(type)的不同,还有一些其它的参数,在此不一一列举。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:361579次
积分:5160
积分:5160
排名:第5636名
原创:85篇
转载:302篇
译文:10篇
评论:171条
研二在读,关注:深度学习,计算机视觉,机器学习,图像处理。博文主要是自己的一些总结。转载文章供资料学习(转载一些最新文章),如有侵权望告知。注:有些评论没有回复,最近比较忙不好意思。
(8)(35)(7)(14)(43)(57)(22)(16)(46)(24)(43)(42)(40)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'caffe如何进行数据集测试?? - 知乎15被浏览4311分享邀请回答06 条评论分享收藏感谢收起caffe test -model=lenet_train_test.prototxt weights=lenet_iter_10000.caffemodel -iterations=100 -gpu 0
由于测试batch_size为100,所以迭代次数设置为100,这样就可以测试完所有的10000张图片,结果如下:以上以上51 条评论分享收藏感谢收起查看更多回答caffe框架(61)
利用caffe.proto自定义自己的网络
caffe.proto存放在src/caffe/proto/目录下,建议读者能够打开它,跟着这篇教程,学会如何把它用起来(很多人都说要看,反正才一千三百多行是吧…小编我看了两百行就想睡觉了,关键是看了还容易忘,所以小编的建议是在需要用它的时候再去看它)。&
先不急,让我们来看一下caffe.proto里面都是些什么
对于懒得在翻目录的读者,可以点击这个链接,不过还是建议读者都看本地的,毕竟以后会经常用到的&
下面列出文件里面的前十几行= =
&code class=&language-protobuf hljs vala has-numbering& style=&display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-radius: 0 word-wrap: background:&&message BlobShape {
repeated &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int64&/span& dim = &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&1&/span& [packed = &span class=&hljs-literal& style=&color: rgb(0, 102, 102); box-sizing: border-&&true&/span&];
message BlobProto {
optional BlobShape shape = &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&7&/span&;
repeated &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&float&/span& data = &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&5&/span& [packed = &span class=&hljs-literal& style=&color: rgb(0, 102, 102); box-sizing: border-&&true&/span&];
repeated &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&float&/span& diff = &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&6&/span& [packed = &span class=&hljs-literal& style=&color: rgb(0, 102, 102); box-sizing: border-&&true&/span&];
repeated &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&double&/span& double_data = &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&8&/span& [packed = &span class=&hljs-literal& style=&color: rgb(0, 102, 102); box-sizing: border-&&true&/span&];
repeated &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&double&/span& double_diff = &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&9&/span& [packed = &span class=&hljs-literal& style=&color: rgb(0, 102, 102); box-sizing: border-&&true&/span&];
&span class=&hljs-comment& style=&color: rgb(136, 0, 0); box-sizing: border-&&// 4D dimensions -- deprecated.
Use &shape& instead.&/span&
optional &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int32&/span& num = &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&1&/span& [&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&default&/span& = &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&0&/span&];
optional &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int32&/span& channels = &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&2&/span& [&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&default&/span& = &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&0&/span&];
optional &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int32&/span& height = &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&3&/span& [&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&default&/span& = &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&0&/span&];
optional &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int32&/span& width = &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&4&/span& [&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&default&/span& = &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&0&/span&];
&span class=&hljs-comment& style=&color: rgb(136, 0, 0); box-sizing: border-&&// The BlobProtoVector is simply a way to pass multiple blobproto instances&/span&
&span class=&hljs-comment& style=&color: rgb(136, 0, 0); box-sizing: border-&&// around.&/span&
message BlobProtoVector {
repeated BlobProto blobs = &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&1&/span&;
}&/code&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&li style=&box-sizing: border- padding: 0px 5&&2&/li&&li style=&box-sizing: border- padding: 0px 5&&3&/li&&li style=&box-sizing: border- padding: 0px 5&&4&/li&&li style=&box-sizing: border- padding: 0px 5&&5&/li&&li style=&box-sizing: border- padding: 0px 5&&6&/li&&li style=&box-sizing: border- padding: 0px 5&&7&/li&&li style=&box-sizing: border- padding: 0px 5&&8&/li&&li style=&box-sizing: border- padding: 0px 5&&9&/li&&li style=&box-sizing: border- padding: 0px 5&&10&/li&&li style=&box-sizing: border- padding: 0px 5&&11&/li&&li style=&box-sizing: border- padding: 0px 5&&12&/li&&li style=&box-sizing: border- padding: 0px 5&&13&/li&&li style=&box-sizing: border- padding: 0px 5&&14&/li&&li style=&box-sizing: border- padding: 0px 5&&15&/li&&li style=&box-sizing: border- padding: 0px 5&&16&/li&&li style=&box-sizing: border- padding: 0px 5&&17&/li&&li style=&box-sizing: border- padding: 0px 5&&18&/li&&li style=&box-sizing: border- padding: 0px 5&&19&/li&&li style=&box-sizing: border- padding: 0px 5&&20&/li&&li style=&box-sizing: border- padding: 0px 5&&21&/li&&li style=&box-sizing: border- padding: 0px 5&&22&/li&&li style=&box-sizing: border- padding: 0px 5&&23&/li&&/ul&
相信读者看到上面的内容会感到很熟眼,这不就是Blob吗?对,这就是Blob的细节,对于一直搞不懂Blob里面放的是什么东西的读者,现在可以深入到内部去理解Blob了。
读者在看.proto是会经常遇到deprecated这样的注释,建议读者跳过跟这个注释有关的代码,因为这些代码都是过时的,很有可能会在某一天就被删掉。
注意到这些定义有两种前缀,一个是optional,一个是repeated。repeated是数组,而optional就是一个数据。因此BlobShape里面包含了一个shape的数组。然后BlobProto里面就包含了5个数据(不考虑那些被标了deprecated的),分别是BlobShape,float和double类型的data和diff。因此,一个Blob里面的数据就是他自身的尺寸,以及用于前向的data和用于后向的diff,这样看够直接了吧?
然后我们再来看看Layer有关的,为了节约篇幅,下面只截取一部分
&code class=&language-protobuf hljs r has-numbering& style=&display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-radius: 0 word-wrap: background:&&message LayerParameter {
optional string name = &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&1&/span&; // the layer name
optional string type = &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&2&/span&; // the layer type
repeated string bottom = &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&3&/span&; // the name of each bottom blob
repeated string top = &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&4&/span&; // the name of each top blob
optional Phase phase = &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&10&/span&;
repeated float loss_weight = &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&5&/span&;
repeated ParamSpec param = &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&6&/span&;
repeated BlobProto blobs = &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&7&/span&;
repeated bool propagate_down = &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&11&/span&;
repeated NetStateRule include = &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&8&/span&;
repeated NetStateRule exclude = &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&9&/span&;
optional TransformationParameter transform_param = &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&100&/span&;
optional LossParameter loss_param = &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&101&/span&;
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&...&/span&
optional ConvolutionParameter convolution_param = &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&106&/span&;
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&...&/span&&/code&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&li style=&box-sizing: border- padding: 0px 5&&2&/li&&li style=&box-sizing: border- padding: 0px 5&&3&/li&&li style=&box-sizing: border- padding: 0px 5&&4&/li&&li style=&box-sizing: border- padding: 0px 5&&5&/li&&li style=&box-sizing: border- padding: 0px 5&&6&/li&&li style=&box-sizing: border- padding: 0px 5&&7&/li&&li style=&box-sizing: border- padding: 0px 5&&8&/li&&li style=&box-sizing: border- padding: 0px 5&&9&/li&&li style=&box-sizing: border- padding: 0px 5&&10&/li&&li style=&box-sizing: border- padding: 0px 5&&11&/li&&li style=&box-sizing: border- padding: 0px 5&&12&/li&&li style=&box-sizing: border- padding: 0px 5&&13&/li&&li style=&box-sizing: border- padding: 0px 5&&14&/li&&li style=&box-sizing: border- padding: 0px 5&&15&/li&&li style=&box-sizing: border- padding: 0px 5&&16&/li&&li style=&box-sizing: border- padding: 0px 5&&17&/li&&/ul&
可以看到LayerParameter包含很东西,比如什么name啊,type啊,blabla。记性好的读者应该发现在我们的Caffe学习2那部分的Nets的layer的protobuf代码有的,LayerParameter也都有。因此不难猜测,如果想要使用Caffe的Layer,那么,caffe.proto的内容将会提供很大的帮助。&
让我们把caffe.proto用起!
下面我们先给出一个caffe的net的定义的结构,方便我们往里面加东西。
&code class=&language-python hljs
has-numbering& style=&display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-radius: 0 word-wrap: background:&&&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&from&/span& caffe &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&import&/span& layers &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&as&/span& L, params &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&as&/span& P
&span class=&hljs-function& style=&box-sizing: border-&&&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&def&/span& &span class=&hljs-title& style=&box-sizing: border-&&mynet&/span&&span class=&hljs-params& style=&color: rgb(102, 0, 102); box-sizing: border-&&(lmdb, batch_size)&/span&:&/span&
n = caffe.NetSpec()
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&return&/span& n.to_proto()&/code&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&li style=&box-sizing: border- padding: 0px 5&&2&/li&&li style=&box-sizing: border- padding: 0px 5&&3&/li&&li style=&box-sizing: border- padding: 0px 5&&4&/li&&li style=&box-sizing: border- padding: 0px 5&&5&/li&&li style=&box-sizing: border- padding: 0px 5&&6&/li&&/ul&
上面的代码,我们一开始就import了两个包,一个是layers,另一个是params。layers里面包含了Caffe所以内置的层(比如卷积,ReLU等),而params则包含了各种枚举值。方法的参数中的lmdb是指Caffe支持的数据库的一种,叫lmdb,我们传入数据库的路径即可。而n=caffe.NetSpec()是获取Caffe的一个Net,我们只需不断的填充这个n,最后面把n输出到文件就会使我们在Caffe学习2里面看到的Net的protobuf的定义。&
接下来,我们想要通过lmdb读取数据。那代码该怎么写呢?谷歌一下,或者是偷看caffe的示例程序,我们可以知道应该如下
&code class=&language-python hljs
has-numbering& style=&display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-radius: 0 word-wrap: background:&&n.data, n.label = L.Data(batch_size=batch_size, backend=P.Data.LMDB, source=lmdb, transform_param=dict(scale=&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&1.&/span&/&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&255&/span&), ntop=&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&2&/span&)&/code&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&/ul&
由于lmdb里面存放了两个数据,一个是data,一个是label,因此这个层上面会有2个blobs,故ntop=2(小编试过把它删了,结果报错,看来这个还是少不了的)。&
好,然后我们想添加一层Convolution layer,我们这次不谷歌也不看示例,看看怎么用caffe.proto写代码
首先,我们看下LayerParameter里面有没Convolution的身影,然后发现有ConvolutionParameter,这个就说明Caffe内置有Convolution Layer。然后在LayerParameter里面找到我们需要设置的参数,这里我们可以不用设置任何参数,python的接口会帮我们自动生成。因此我们有了我们的第一步代码
&code class=&language-python hljs
has-numbering& style=&display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-radius: 0 word-wrap: background:&&n.conv1 = L.Convolution(n.data, ...)&/code&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&/ul&
然后我们搜ConvolutionParameter,找到改名下我们需要用到的一下参数,比如num_output(过滤器的数目),kernel_size(过滤器的展度),pad(填充数),stride(步长),其中必不可少的num_output和kernel_size,这两个没有default值,因此如果少了的话Caffe会出错。&
然后我们有了我们的完整代码
&code class=&language-python hljs
has-numbering& style=&display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-radius: 0 word-wrap: background:&&n.conv1 = L.Convolution(n.data, kernel_size=&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&3&/span&, num_output=&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&36&/span&, pad=&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&1&/span&)&/code&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&/ul&
最后我们还想给这一层的权重一个比较科学的初始化,比如xavier。找到ConvolutionParameter的weight_filler,发现是一个FillerParameter,同理,找到FillerParameter下。我们只要把type设置正确即可。最终我们可以有如下的代码
&code class=&language-python hljs
has-numbering& style=&display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-radius: 0 word-wrap: background:&&n.conv1 = L.Convolution(n.data, kernel_size=&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&3&/span&, num_output=&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&36&/span&, pad=&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&1&/span&, weight_filler=({type:&span class=&hljs-string& style=&color: rgb(0, 136, 0); box-sizing: border-&&&xavier&&/span&}))&/code&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&/ul&
同样地,我们还可以定义其他层(至于为什么就交给读者自己验证啦,有问题可以留言),比如
&code class=&language-python hljs
has-numbering& style=&display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-radius: 0 word-wrap: background:&&n.score = L.InnerProduct(n.conv1, num_output=&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&10&/span&, weight_filler=dict(type=&span class=&hljs-string& style=&color: rgb(0, 136, 0); box-sizing: border-&&'xavier'&/span&))
L.SoftmaxWithLoss(n.score, n.label)&/code&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&li style=&box-sizing: border- padding: 0px 5&&2&/li&&/ul&
-最终我们用python定义了一个完整的Net
&code class=&language-python hljs
has-numbering& style=&display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-radius: 0 word-wrap: background:&&&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&from&/span& caffe &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&import&/span& layers &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&as&/span& L, params &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&as&/span& P
&span class=&hljs-function& style=&box-sizing: border-&&&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&def&/span& &span class=&hljs-title& style=&box-sizing: border-&&mynet&/span&&span class=&hljs-params& style=&color: rgb(102, 0, 102); box-sizing: border-&&(lmdb, batch_size)&/span&:&/span&
n = caffe.NetSpec()
n.data, n.label = L.Data(batch_size=batch_size, backend=P.Data.LMDB, source=lmdb, transform_param=dict(scale=&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&1.&/span&/&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&255&/span&), ntop=&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&2&/span&)
n.conv1 = L.Convolution(n.data, kernel_size=&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&3&/span&, num_output=&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&36&/span&, pad=&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&1&/span&, weight_filler=({type:&span class=&hljs-string& style=&color: rgb(0, 136, 0); box-sizing: border-&&&xavier&&/span&}))
n.score = L.InnerProduct(n.conv1, num_output=&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&10&/span&, weight_filler=dict(type=&span class=&hljs-string& style=&color: rgb(0, 136, 0); box-sizing: border-&&'xavier'&/span&))
L.SoftmaxWithLoss(n.score, n.label)
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&return&/span& n.to_proto()&/code&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&li style=&box-sizing: border- padding: 0px 5&&2&/li&&li style=&box-sizing: border- padding: 0px 5&&3&/li&&li style=&box-sizing: border- padding: 0px 5&&4&/li&&li style=&box-sizing: border- padding: 0px 5&&5&/li&&li style=&box-sizing: border- padding: 0px 5&&6&/li&&li style=&box-sizing: border- padding: 0px 5&&7&/li&&li style=&box-sizing: border- padding: 0px 5&&8&/li&&li style=&box-sizing: border- padding: 0px 5&&9&/li&&li style=&box-sizing: border- padding: 0px 5&&10&/li&&li style=&box-sizing: border- padding: 0px 5&&11&/li&&/ul&
学会了怎么使用caffe.proto和Python定义Caffe的Net之后,下一节小编会介绍如何用定义Caffe的solver~。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:361581次
积分:5160
积分:5160
排名:第5636名
原创:85篇
转载:302篇
译文:10篇
评论:171条
研二在读,关注:深度学习,计算机视觉,机器学习,图像处理。博文主要是自己的一些总结。转载文章供资料学习(转载一些最新文章),如有侵权望告知。注:有些评论没有回复,最近比较忙不好意思。
(8)(35)(7)(14)(43)(57)(22)(16)(46)(24)(43)(42)(40)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'}

我要回帖

更多关于 caffe vgg16 prototxt 的文章

更多推荐

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

点击添加站长微信