※前提条件:本情報はUbentu15.04を基づいて説明してる 概要 †CaffeはC++/CUDAで構築された
Caffe::set_mode(Caffe::GPU); パフォーマンスが良い Blob †N次元の配列みたいなもの、Caffeのデータ操作の基本単位 データ:Number*Channel*Height*Width :Output*Input*Height*Width :Output*1*1*1 ネット定義 †name: "dummy-net" layers {name: "data" …} layers {name: "conv" …} layers {name: "pool" …} layers {name: "loss" …} 一つのNETは複数のLayerで結合されている。 レイヤの定義 †DATA †入力データレイヤ layer { name: "data" type: "Data" top: "data" # 出力されるblobの名前(画像データ用) top: "label" # 出力されるblobの名前(ラベル用) data_param { source: "/home/user/drink/ilsvrc12_train_lmdb" # 学習用leveldbファイルを配置したフォルダパスを指定 mean_file: "mean.binaryproto" # 平均画像ファイルパスを指定 batch_size: 256 # バッチサイズを指定 backend: LMDB } }
CONVOLUATION †コンボリューションレイヤ layer { name: "conv1" type: "Convolution" bottom: "data" # 入力されるblobの名前(データレイヤから出力された画像データ) top: "conv1" # 出力されるblobの名前(畳み込み後の画像データ) blobs_lr: 1 # ソルバファイルで指定した学習率に乗算(重み更新用) blobs_lr: 2 # ソルバファイルで指定した学習率に乗算(バイアス更新用) convolution_param { num_output: 96 #出力する畳み込み画像の数 kernel_size: 11 #カーネルサイズ stride: 4 # ストライド数分スキップしてカーネルをスライド weight_filler { type: "gaussian" # カーネルの初期値を生成するタイプ std: 0.01 # 標準偏差 } bias_filler { type: "constant" value: 0 } } } コンボリューションレイヤに、3チャンネルの画像のインプットで、96個コンボリューションコア,各コアのサイズは11*11、だからこのBlobは96*3*11*11。
訓練後モデルファイルのサイズはnum_outputとstrideに関係がある。 POOLING †プーリングレイヤ layers { name: "pool1" type: POOLING # プーリングレイヤ bottom: "conv1" # コンボリューションレイヤから出力された畳み込み画像データ top: "pool1" # プーリング後の画像データ pooling_param { pool: MAX # プーリングのタイプ kernel_size: 3 stride: 2 } } RELU †活性化関数レイヤ(ReLU) layers { name: "relu1" type: RELU # 活性化関数レイヤ(ReLU) bottom: "pool1" # プーリングされた画像データを入力 top: "pool1" # ReLUで変換後のデータを”pool1”のblobに戻す } LRN †活性化関数レイヤ(ReLU) layers { name: "norm1" type: LRN # Local response normalizationレイヤ。特徴マップ間や空間上で正規化。 bottom: "pool1" top: "norm1" # 正規化後の画像データ lrn_param { norm_region: WITHIN_CHANNEL # 空間上で正規化 local_size: 3 # 正規化する局所領域サイズ alpha: 5e-05 beta: 0.75 } } INNER_PRODUCT †全結合レイヤ。コンボリューションレイヤの一種 layers { name: "ip1" type: INNER_PRODUCT # 全結合レイヤ bottom: "pool3" top: "ip1" # 全結合(入力ニューロンを内積)したblob出力 blobs_lr: 1 blobs_lr: 2 weight_decay: 250 # ソルバファイルで指定した正則化係数に乗算(重み更新用) weight_decay: 0 # ソルバファイルで指定した正則化係数に乗算(バイアス更新用) inner_product_param { num_output: 10 # 出力するニューロン数。識別クラス数を指定。 } } 1024チャンネルの画像のインプットで、1000データのアウトプットなら、Blobは1000*1024 最後のINNER_PRODUCTレイヤのnum_outputの値は分類の個数(識別クラス数)と同じに設定する必要がある。 SOFTMAX_LOSS †誤差評価レイヤ layers { name: "loss" type: SOFTMAX_LOSS # 誤差評価レイヤ。ソフトマックスをしてから誤差を評価。 bottom: "ip1" bottom: "label" # データレイヤから出力されたラベルデータのblob } Dropout †過近似を防止 layer { name: "drop7" type: "Dropout" bottom: "fc7-conv" top: "fc7-conv" dropout_param { dropout_ratio: 0.5 } } 超多機能のアクセス解析が永久無料! コメント: |