Caffe 有 Python 和 Matlab 接口,都可以用于直接调用底层的 Caffe 函数(C++ 实现)。而且 Python 接口可以用于编写脚本,生成自定义的 prototxt 文件,即网络结构定义文件。
一些大型网络比较深,而且结构复杂,比如 ResNet 和 DenseNet,一层一层的编辑 prototxt 文本文件太过繁琐,而且修改起来也很麻烦。如果使用代码能快速生成网络结构的话,可以节约大量的时间。实现这样的代码并不复杂,只是介绍关于这一类的函数的内容太少。此文就是介绍这一类的接口函数 API 。
首先创建一个 *.py 文件,在其中开始输入代码:
from __future__ import print_function import sys # your caffe path sys.path.append('.../caffe/python') from caffe import layers as L, params as P, to_proto import caffe导入 Caffe 的 Python 包完成之后,即可开始编写定义网络结构的代码。注:需要 Caffe 顺利编译成功,而且 pycaffe 接口也要编译通过,否则会报错。
首先定义一个网络变量(Python 的好处就是不需要指定数据类型,和 Caffe 的 blob 类似):
net = caffe.NetSpec()网络数据层的定义:
# for training net.data, net.label = L.HDF5Data(hdf5_data_param={'source': '/data/path/', 'batch_size': 32}, include={'phase': caffe.TRAIN}, ntop=2) # for validation net.data, net.label = L.HDF5Data(hdf5_data_param={'source': '/data/path/', 'batch_size': 32}, include={'phase': caffe.TEST}, ntop=2) # for testing the pretrained network, a dummy input data layer; # no label; dim = [num, channel, width, height] net.data = L.Input(shape=dict(dim=[1,3,24,24]), ntop=1)卷积层定义:
net.conv = L.Convolution(net.data, num_output=64, kernel_size=3, stride=1, pad=1, bias_term=False, weight_filler=dict(type='msra'), bias_filler=dict(type='constant'))反卷积层定义:
# deconvolution for 2x upsample net.deconv = L.Deconvolution(net.conv, convolution_param=dict( num_output=64, kernel_size=4, stride=2, pad=1, bias_term=False, weight_filler=dict(type='msra'), bias_filler=dict(type='constant')))ReLU 层定义:
net.relu = L.ReLU(net.conv, in_place=True)Dropout 层定义:
net.drop = L.Dropout(net.relu, dropout_ratio=0.1)连接(特征组合)操作:
net.concate = L.Concat(net.conv1, net.conv2, axis=1)求和、求积操作:
# elementwise summation net.sum = L.Eltwise(net.conv1, net.conv2) # elementwise product net.conv = L.Eltwise(net.conv, net.omega, eltwise_param={'operation': 0})损失函数层定义:
net.loss = L.EuclideanLoss(net.reconstruct, net.label)将定义好的 net 输出到 prototxt 文件中:
with open('/file/path/*.prototxt', 'w') as f: print(str(net.to_proto()), file=f)运行 *.py 文件之后,网络结构文件 prototxt 即生成,可用于训练和测试。其中的内容可以用 NetScope 实现可视化,有助于直观地分析网络结构,尤其是网络较深或结构复杂的情况。