※前提条件:本情報はUbentu15.04を基づいて説明してる 処理の流れ
準備作業 †訓練するための写真データベースを用意する必要がある、以下の条件があります。
データベース作成 †create_imagenet.sh を実行する Shellファイル格納するディレクトリ: {CAFFE_MASTER_ROOT}/examples/imagenet 以下の2つフォルダが作成される。
mean(平均画像)の取得 †make_imagenet_mean.sh を実行する Shellファイル格納するディレクトリ: {CAFFE_MASTER_ROOT}/examples/imagenet 以下のmeanファイルが作成される。
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 予測と正解の一致が多くなると小さくなる値 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】 コメント: |