如何在MXNet中使用Caffe的操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/abrams90/article/details/53406959

最近在学mxnet,貌似功能很强大。看到官网上有一篇说明介绍使用mxnet的caffe接口,翻译一下作为学习笔记。

原文链接:https://github.com/dmlc/mxnet/tree/master/example/caffe

 

Caffe框架在业内已经广泛使用并且有着不错的口碑。如今,MXNet已经通过计算图(symbolic graph)支持绝大部分caffe中包含的层或者损失函数。在MXNet框架中使用自定义的caffe层也毫无难度。除了Caffe,MXNet已经内嵌了Torch模块跟它扩展的计算功能。

 

本博客演示了在MXNet中使用Caffe功能的两个步骤:
1、如何给MXNet安装Caffe组件。

2、如何将Caffe功能嵌入到MXNet的计算图中。

 

安装有MXNet接口的Caffe
1、下载官方版本的caffe BVLC/Caffe(https://github.com/BVLC/caffe)。
2、下载caffe patch for mxnet interface(https://github.com/BVLC/caffe/pull/4527.patch)。将补丁文件放到Caffe的根目录,运行git apply patch_file_name。
3、安装caffe的官方安装手册进行安装。
编译支持caffe接口的MXNet
1、在mxnet文件夹中,打开config.mk。如果不存在此文件,从make/config.mk中拷贝。取消 CAFFE_PATH=$(HOME)/caffe行与MXNET_PLUGINS +=  plugin/caffe/caffe.mk的注释。如果必要,将CAFFE_PATH改为你安装的路径。

2、运行make clean && make重新build一次。

 

Caffe层操作

MXNet通过mxnet.symbol.CaffeOp与mxnet.symbol.CaffeLoss两个接口来分别调用caffe的功能与损失函数。例如,下面的代码是处理MNIST数字分类的一个多层感知网络:

 

Python


 
data = mx.symbol.Variable('data')
fc1  = mx.symbol.CaffeOp(data_0=data, num_weight=2, name='fc1', prototxt="layer{type:\"InnerProduct\" inner_product_param


{num_output: 128} }")
act1 = mx.symbol.CaffeOp(data_0=fc1, prototxt="layer{type:\"TanH\"}")
fc2  = mx.symbol.CaffeOp(data_0=act1, num_weight=2, name='fc2', prototxt="layer{type:\"InnerProduct\" inner_product_param


{num_output: 64} }")
act2 = mx.symbol.CaffeOp(data_0=fc2, prototxt="layer{type:\"TanH\"}")
fc3 = mx.symbol.CaffeOp(data_0=act2, num_weight=2, name='fc3', prototxt="layer{type:\"InnerProduct\" inner_product_param


{num_output: 10}}")
mlp = mx.symbol.SoftmaxOutput(data=fc3, name='softmax')

 


     我们详细的分析下代码。首先,data=mx.symbol.Variable('data')定义了一个用来替代现有数据输入的input层。通过fc1 =  mx.symbol.CaffeOp(data_0=data, num_weight=2, name='fc1', prototxt="layer{type:\"InnerProduct\" inner_product_param{num_output:  128} }")将数据输入到网络结构中。如果有num_data个输入,分别表示为i=0...num_data-1,data_i为caffe op的输入。如例子所示如果 data_i=1,你可以跳过参数。num_weight是只blobs_(weights)的个数,默认值为0。因为很多层都不保存权重。prototxt是保存参数的字符串。
我们也可以将最后一行替换为:

 

 

label = mx.symbol.Variable('softmax_label')
mlp = mx.symbol.CaffeLoss(data=fc3, label=label, grad_scale=1, name='softmax', prototxt="layer{type:\"SoftmaxWithLoss\"}")


这样就可以用caffe中的损失函数了。

展开阅读全文

没有更多推荐了,返回首页