Chainerでトレーニングしたimagenet modelを読み込んでテストデータで評価したいです.環境はOS X(10.9.5 CPU), Chainer1.6.0, Python2.7.10です.
類似記事があるかもしれませんが5秒くらい探して見つからなかったので書きます,ご容赦ください.
モデルのトレーニング
まずモデルをトレーニングしないとテストできません.トレーニング方法については,http://hi-king.hatenablog.com/entry/2015/06/11/021144 などを参考に行って下さい.
ただし,↑のリンク先に付属しているコードをCaltech101からとってきた自前の画像で試してみると,画像の大きさ変更自体は正しく行われたのですが,得られた画像が以下のようにいびつなものになってしまいました.上が変更前の画像,下が変更後の画像です(同じ物体が複製されています).
このままでも特に問題ないのかもしれませんが,なんとなく気になったので少し前処理しました.細かい調整が面倒ならばPIL.Imageの.resize((256,256))を使ってもいいような気がします.
テストの準備
トレーニングが終わったらテストの準備をします.テストのために必要なものは以下の4つです.トレーニング時の前処理とほぼ同じです.
- 256×256の大きさのテスト画像.test.txtに書かれたpathと一致するように置く.
- 平均画像ファイル(トレーニング時と同じものを使えばよいです).実行ディレクトリに置く.
- test.txtファイル(トレーニング時と同じフォーマットで用意します).実行ディレクトリに置く.
- トレーニング済みのimagenet model(トレーニングによってmodelという名前で保存しているはずです).実行ディレクトリに置く.
modelの評価
Chainerの公式ドキュメントとか他のexamplesのコードを見て書きました.chainer/examples/imagenet/train_imagenet.pyをテスト用に書き換えただけなので無駄な処理も多々あるように思いますが,手元の環境では一応動きました.
上の準備を行った後,↓のコードを置いて(※ 細かいところをサボったので,コマンドライン引数のtest_batchsizeは無視して下さい.これをdefault値(=1)以外にすると正しく評価できません)
https://github.com/fullflu/ML/blob/master/evaluate_chainer_imagenet.py
python evaluate_chainer_imagenet.py -g -1 test.txt
と打てば以下の感じでerror(平均でどれだけ予測を外したか)が表示されます.処理の中身は,modelをimportした後の serializers.load_npz(path_to_model,model)
でモデルを読み込んで,予測と評価で model(x,t)
を書くだけです.便利です.
Load model from model
{"iteration": 19, "loss": 0.7662104054501182, "type": "test", "error": 0.4736842105263158}
約半分は外しているので真面目に学習していないことがよくわかります.