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 实现可视化,有助于直观地分析网络结构,尤其是网络较深或结构复杂的情况。