Caffe Python 介面 API
阿新 • • 發佈:2018-12-14
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 實現視覺化,有助於直觀地分析網路結構,尤其是網路較深或結構複雜的情況。