博客新址: http://blog.xuezhisd.top
邮箱:xuezhisd@126.com
如何在MXNet中使用Caffe操作符
Caffe 是一个有名的,广泛使用的深度学习框架。MXNet 支持在它的符号图中,直接调用大部分Caffe操作符(网络层)和损失函数。使用自定义的Caffe网络层也很容易。
MXNet 也嵌入了Torch模块和它的张量数学函数。
本节内容描述了如何:
-
安装支持Caffe的MXNet
-
将Caffe操作符嵌入到MXNet的符号图中
安装支持Caffe的MXNet
- 下载官方Caffe仓库 BVLC/Caffe。
- 用于MXNet接口的Caffe补丁。将该补丁放在你的Caffe根目录下,并通过
git apply patch_file_name
来使用该补丁。 - 使用官方指南安装Caffe。 详细安装教程。
编译支持Caffe的MXNet
- 如果你还没有编译MXNet,将
make/config.mk
(for Linux) ormake/osx.mk
(for Mac) 复制到MXNet根目录下,并命名为config.mk
。 - 在MXNet目录下,编辑文件
config.mk
。注释2行:CAFFE_PATH = $(HOME)/caffe
和MXNET_PLUGINS += plugin/caffe/caffe.mk
。将CAFFE_PATH
设置成Caffe的安装路径【注意:自己的Caffe安装路径】。 - 执行命令
make clean && make
,构建支持Caffe的MXNet。
使用Caffe操作符(网络层)
MXNet分别通过 mxnet.symbol.CaffeOp
和 mxnet.symbol.CaffeLoss
来支持Caffe的神经网络操作符和损失函数。例如,下面的代码描述了一个 多层感知机 (MLP) 神经网络,它将对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')
定义了一个符号变量,作为输入数据的占位符。然后,将它传递给Caffe操作符 fc1 = mx.symbol.CaffeOp(data_0=data, num_weight=2, name='fc1', prototxt="layer{type:\"InnerProduct\" inner_product_param{num_output: 128} }")
。
Caffe操作符的输入的命名方式是 data_i for i=0...num_data-1
。num_data
是输入的数目。如果 num_data
的值是1,那么你可以像上面例程一样忽略该参数。num_weight
是权重 blobs_
的数目,它的默认值是0,因为很多操作符没有权重。prototxt
是配置字符串。
如果想使用Caffe中的损失函数,将上面代码中的最后一行替换成下面的代码:
label = mx.symbol.Variable('softmax_label')
mlp = mx.symbol.CaffeLoss(data=fc3, label=label, grad_scale=1, name='softmax', prototxt="layer{type:\"SoftmaxWithLoss\"}")