Caffe-python interface学習|ネットワーク定義の詳細


以前はcaffeのコマンドラインインタフェースを使っていたので、単独で訓練してもいいですが、中層のパラメータやデータを見るのは面倒です.特に今週の実験では大きな問題が発生しましたが、コマンドラインはどうしようもありません.pythonインタフェースをよく見てください.
pythonインタフェースコンパイル
これは一般的にcaffeのコンパイル時にシーケンシャルに完了し、ImportError: No module named caffeに遭遇した場合、コンパイルされていないか、パスに追加されていない可能性があります.コンパイルは、ルートディレクトリの下でmake pycaffeであり、ディレクトリは/caffe/pythonである.caffe/pythonのパスをユーザー環境変数~/.bashrcに追加します.
export PYTHONPATH=/home/xxx/caffe/python

次にsudo ldconfig確認を入力します.もちろん、私のサーバには管理者権限がありません.この場合、手動でディレクトリを追加するたびに、以下を参照してください.コンパイル時にMakefile.configで関連パスを変更する以外は、
WITH_PYTHON_LAYER := 1

これもf-rcnnで言及されている点に注意しなければならない.
pythonインタフェース呼び出し
import sys
sys.path.append('/home/xxx/caffe/python')#      
import caffe
import numpy as np
from skimage import io
import matplotlib.pyplot as plt

以上は直接コピーして、毎回追加することができます.
運転モード小設定
caffe.set_mode_cpu()#   cpu  
caffe.set_device(0)#gpu 
caffe.set_mode_gpu()#gpu  

ネットワークの定義
次に例を示します.
# -*- coding: utf-8 -*-
"""
Spyder Editor

"""

from caffe import layers as L,params as P,to_proto
path='/home/xxx/data/'                    #            
train_lmdb=path+'train_db'                #    LMDB     
val_lmdb=path+'val_db'                    #    LMDB     
mean_file=path+'mean.binaryproto'         #       
train_proto=path+'train.prototxt'         #              
val_proto=path+'val.prototxt'             #              
#      ,      
def create_net(lmdb,batch_size,include_acc=False):
    #     :   。        :          
    data, label = L.Data(source=lmdb, backend=P.Data.LMDB, batch_size=batch_size, ntop=2,
        transform_param=dict(crop_size=40,mean_file=mean_file,mirror=True))
    #     :   
    conv1=L.Convolution(data, kernel_size=5, stride=1,num_output=16, pad=2,weight_filler=dict(type='xavier'))
    #       
    relu1=L.ReLU(conv1, in_place=True)
    #     
    pool1=L.Pooling(relu1, pool=P.Pooling.MAX, kernel_size=3, stride=2)
    conv2=L.Convolution(pool1, kernel_size=3, stride=1,num_output=32, pad=1,weight_filler=dict(type='xavier'))
    relu2=L.ReLU(conv2, in_place=True)
    pool2=L.Pooling(relu2, pool=P.Pooling.MAX, kernel_size=3, stride=2)
    #        
    fc3=L.InnerProduct(pool2, num_output=1024,weight_filler=dict(type='xavier'))
    relu3=L.ReLU(fc3, in_place=True)
    #    dropout 
    drop3 = L.Dropout(relu3, in_place=True)
    fc4 = L.InnerProduct(drop3, num_output=10,weight_filler=dict(type='xavier'))
    #    softmax 
    loss = L.SoftmaxWithLoss(fc4, label)

    if include_acc:             #     ,   accuracy ,       ,    
        acc = L.Accuracy(fc4, label)
        return to_proto(loss, acc)
    else:
        return to_proto(loss)

def write_net():
    #         prototxt  
    with open(train_proto, 'w') as f:
        f.write(str(create_net(train_lmdb,batch_size=64)))

    #          
    with open(val_proto, 'w') as f:
        f.write(str(create_net(val_lmdb,batch_size=32, include_acc=True)))

if __name__ == '__main__':
    write_net()

上のコードは、最初からimportが2つのパッケージを持っていました.1つはlayersで、もう1つはparamsです.LayersにはCaffeのために内蔵されたレイヤ(ボリューム、ReLUなど)が含まれており、paramsには様々な列挙値が含まれています.ネット上では関数の詳細を見つけることはめったにありません.自分で理解してまとめましょう.
データ層
data,label=L.Data(
        source=lmdb,                             #   ,    LMDB     
        backend=P.Data.LMDB,                     #    ,   lmdb
        batch_size=batch_size,                   #batch  
        ntop=2,                                  #    ,   data label,   2
        transform_param=dict(crop_size=40,       #crop  
                            mean_file=mean_file, #    
                            mirror=True          #    
                            )
        )

コンボリューション層
conv1=L.Convolution(
        data,                             #    (        data)
        kernel_size=5,                    #     
        stride=1,                         #  
        num_output=16,                    #  
        pad=2,                            #  
        weight_filler=dict(type='xavier') #       'xavier'
        )

アクティブレイヤ、dropoutレイヤ
relu1=L.ReLU(
            conv1,         #    (        conv1)
            in_place=True  #in_place ,    ,      
            )
drop3=L.Dropout(
            relu3,         #    (        relu3)
            in_place=True  #in_place ,    ,      
            )

プール層
pool1=L.Pooling(
            relu1,               #    (        relu1)
            pool=P.Pooling.MAX,  #    :    
            kernel_size=3,       #     
            stride=2             #  
            )

ぜんせつぞくそう
fc3=L.InnerProduct(
            pool2,                            #    (        pool2)
            num_output=1024,                  #       
            weight_filler=dict(type='xavier') #       'xavier'
            )

SoftmaxWithLossレイヤ
loss = L.SoftmaxWithLoss(
            fc4,    #    (         fc4)
            label   #    (        label)
            )

Accuracy層
if include_acc:                  #     ,   accuracy ,       ,    
    acc = L.Accuracy(
                fc4,  
                label 
                ) 
    return to_proto(loss, acc)
else:
    return to_proto(loss)

まとめ
上の方は1階1階が上に積み重なって、最後に最後の階に戻りました.もちろんcaffeを直接建てたらNetSpec()は、全体的な把握があります.
def mynet(lmdb, batch_size):
    n = caffe.NetSpec()
    ###################
    n.data, n.label = L.Data(batch_size=batch_size, backend=P.Data.LMDB, source=lmdb, transform_param=dict(scale=1./255), ntop=2)
    ###################
    return n.to_proto()

メソッドのパラメータのlmdbとは、Caffeがサポートするデータベースの一種で、lmdbと呼ばれ、データベースに転送するパスです.n=caffe.NetSpec()はCaffeを取得するNetであり、このnを絶えず充填し、最後にnをファイルに出力するだけです.充填するときはn.を加えてください.各層の特定のパラメータは、caffe.protoを参照することができる.
caffeのpythonインタフェース学習(1):プロファイルを生成するDeep learning tutorial on Caffe technology:basic commands,Python and C++code.Caffe学習4-caffeを利用する.proto独自のネットワークをカスタマイズ