1. 程式人生 > >Caffe Python 介面 API

Caffe Python 介面 API

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 實現視覺化,有助於直觀地分析網路結構,尤其是網路較深或結構複雜的情況。