Deep Learning

※前提条件:本情報はUbentu15.04を基づいて説明してる

処理の流れ

  1. 準備作業
  2. データベース作成
  3. mean(平均画像)の取得
  4. deploy, train_test, solverのprototxtを用意する
  5. trainingを行う
  6. PyCaffeでトレニングしたcaffemodelをテスト

準備作業

訓練するための写真データベースを用意する必要がある、以下の条件があります。

  • カラー写真
  • サイズ統一
  • 写真の特徴を記述するデータセットファイルを用意する(手作業!よりいい方法があるはず)

データベース作成

create_imagenet.sh を実行する

Shellファイル格納するディレクトリ:

{CAFFE_MASTER_ROOT}/examples/imagenet

以下の2つフォルダが作成される。

  • ilsvrc12_train_lmdb
  • ilsvrc12_val_lmdb

mean(平均画像)の取得

make_imagenet_mean.sh を実行する

Shellファイル格納するディレクトリ:

{CAFFE_MASTER_ROOT}/examples/imagenet

以下のmeanファイルが作成される。

  • imagenet_mean.binaryproto

training準備

train_caffenet.shスクリプトを作成する、中身を以下にする:

#!/usr/bin/env sh

/home/user1/caffe-master/build/tools/caffe train \
    --solver=/home/user1/images/solver.prototxt

Shellファイル格納するディレクトリ:

{CAFFE_MASTER_ROOT}/examples/imagenet

solver.prototxt

# レイヤ定義ファイル(~.prototxt)を指定、1つかそれ以上のテスト用ネットと一緒でも良い 。
net: "/home/user1/images/train_val.prototxt"

#train_net 学習用ネットのprotoファイル名
#test_net テスト用ネットのprotoファイル名(0回以上繰り返し)
#train_net_param 学習用ネットの記述パラメタのインライン記述
#test_net_param  テスト用ネットの記述パラメタのインライン記述(0回以上繰り返し)

# テスト時にバッチを順伝播するイテレーション回数
#テストレイヤのbatch_sizeと関係ある。
#テストデータ数は10000とする、一回で全データをテストするのは効率が低下のため、データをbatch_size分分けてテストする。
#例えば、batch_size:100,100回イテレーションで10000個データを実施完了のため、test_iterを100に設定。一回全データを実施したのはone epochと呼ばれる。
test_iter: 100


# テストする間隔(学習イテレーションを何回やったらテストするか)
test_interval: 1000

# ベース学習率(データ量が少ない場合、0.01で落ちるのは早いため、0.001に修正したほうがよい)
base_lr: 0.01

# 学習率のタイプ(減衰・固定する等)
lr_policy: "step/fixed"
# 「step」を設定する場合、「stepsize」パラメータを設定する必要がある。

lrいつ減衰はstepsizeと関連している、どのぐらい減衰はgammaと関連している
例えば、stepsize=500、base_lr=0.01、gamma=0.1とする。
500回イテレーションの時、lrは1回減衰、減衰したlr=lr*gamma=0.01*0.1=0.001。後もこのパターンを繰り返す。
なので、stepsizeはlrの減衰量,gammaはlrの減衰係数。 

#何回イテレーションで学習率を避けるか
stepsize:10000

# 学習率変化の比率
gamma: 0.1

# train prototxtのbatchsize*itersizeサイズ毎にgradient decentする。
# 複数のiterationで大きなbatchを生成する(一回だけのbatchに制限があっても)ため、GPUの不足によるbatchsizeの制限を回避できる。
iter_size

# イテレーション毎に訓練する画像の枚数
batchsize:20

# 1個のepochはすべての訓練画像1回ネット訓練を通すことを指す。
# 例えば、1280000枚訓練画像、batchsize=256とする。1個epochは1280000/256=5000回イテレーション
# max-iteration=450000としたら、全部450000/5000=90個epoch 
epoch:1

# 指定イテレーション回数おきに精度を表示
display: 20

# 最大イテレーション数
# この設定値が小さすぎなら、訓練結果が収束しなく、精度が低下。大きすぎなら、訓練時間が無駄
max_iter: 450000

# 平滑化係数
momentum: 0.9

# 学習のパラメータ
weight_decay: 0.0005

# 一時的なモデル(スナップショット)を保存するイテレーション間隔
snapshot: 10000

# スナップショットファイル名の先頭文字列。snapshot_prefix + イテレーション回数がモデルのファイル名
snapshot_prefix: "/home/user1/images/caffenet_train"

# GPUかCPUを指定
solver_mode: CPU

# GPU使用時のdevice_id (default = 0)
device_id : 0

solver.prototxt

訓練のconvergence(収斂)

base_lr: 0.01 
lr_policy: "step"
gamma: 0.1   
stepsize: 1000  
max_iter: 3500 
momentum: 0.9

lr_policyをstepに設定,学習率の変換規則は

base_lr * gamma ^ (floor(iter / stepsize))

最初の1000イテレーション学習率は0.01、1001-2000イテレーション学習率は0.001、2001-3000イテレーション学習率は0.00001 ...

訓練の最初からLossの値はNANまたはINFの出力なら、base_lrの値を下げて訓練し直し、この操作を繰り返して、最適なbase_lrを見つける

training途中

train_caffenet.sh をターミナルで実行させる

ログ抜粋:

…省略…
I0510 10:25:11.674726  3784 solver.cpp:337] Iteration 0, Testing net (#0)
I0510 10:29:38.397855  3784 solver.cpp:404]     Test net output #0: accuracy = 0
I0510 10:29:38.397964  3784 solver.cpp:404]     Test net output #1: loss = 7.71083 (* 1 = 7.71083 loss)
I0510 10:30:51.207840  3784 solver.cpp:228] Iteration 0, loss = 8.14445
I0510 10:30:51.208088  3784 solver.cpp:244]     Train net output #0: loss = 8.14445 (* 1 = 8.14445 loss)
I0510 10:30:51.208127  3784 sgd_solver.cpp:106] Iteration 0, lr = 0.001
I0510 10:56:07.661973  3784 solver.cpp:228] Iteration 20, loss = 0.957799
I0510 10:56:07.668917  3784 solver.cpp:244]     Train net output #0: loss = 0.957799 (* 1 = 0.957799 loss)
I0510 10:56:07.669030  3784 sgd_solver.cpp:106] Iteration 20, lr = 0.001
I0511 09:18:30.367529  3784 solver.cpp:454] Snapshotting to binary proto file caffenet_train_iter_1000.caffemodel
I0511 09:18:35.978585  3784 sgd_solver.cpp:273] Snapshotting solver state to binary proto file caffenet_train_iter_1000.solverstate
I0511 09:18:38.115459  3784 solver.cpp:337] Iteration 1000, Testing net (#0)
I0511 09:23:52.193806  3784 solver.cpp:404]     Test net output #0: accuracy = 0.8332
I0511 09:23:52.220417  3784 solver.cpp:404]     Test net output #1: loss = 1.77523 (* 1 = 1.77523 loss)
I0511 09:25:20.973413  3784 solver.cpp:228] Iteration 1000, loss = 3.06643e-05
I0511 09:25:20.973651  3784 solver.cpp:244]     Train net output #0: loss = 3.0545e-05 (* 1 = 3.0545e-05 loss)
I0511 09:25:20.973675  3784 sgd_solver.cpp:106] Iteration 1000, lr = 0.001

loss 予測と正解の一致が多くなると小さくなる値
accuracy 正解率

trainingできたcaffemodelの利用

以下のパスにOpenCVにおけるDNN(Deep Neural Network)を利用するサンプルがある。

opencv_contrib-master/modules/dnn/samples

サンプルを内の下記のソースファイルを修正すれば、訓練できたモデルファイルの利用ができる。

caffe_googlenet.cpp

修正ポイント:

deploy.prototxtファイルの修正
変更前

layer {
  name: "data"
  type: "Input"
  top: "data"
  input_param { shape: { dim: 10 dim: 3 dim: 227 dim: 227 } }
}

変更後

input: "data"
input_dim: 10
input_dim: 3
input_dim: 227
input_dim: 227


フレッツ光が月額556円~【GMOとくとくBB】

コメント:



(画像の文字列を入力して下さい)

トップ   編集 凍結 差分 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019/12/02 (月) 12:33:30 (1627d)

yVoC[UNLIMITȂ1~] ECirŃ|C Yahoo yV LINEf[^[Ōz500~`I


z[y[W ̃NWbgJ[h COiq 萔O~ył񂫁z COsیI COze