TensorFlow で MLP と CNN - まんぼう日記 のつづきです.
tf.train.Saver
使って学習後のネットワークパラメータを save & restore できるようにしようと,以前のプログラムをいじってたんですが,どうもうまくいきません.どこを間違えてんのか,3回に1回だけ正しく動くという妙なことに….直す気力をなくして,Saver 使うのやめることにしました.ネットワークパラメータを NumPy の array として取り出して numpy.savez_compressed
するように方針変更です.ついでに,昨日 TensorFlow 使えるようにしたばかりのGPGPUマシン( cf. GPGPUマシンの更新(4) TensorFlow を使えるようにする - まんぼう日記 )で GPU 使ってみる実験もしました.
主なポイントはこんなん:
- これまでは全結合層に
tf.layers.dense
使ってたが,これだと重みやバイアスが隠蔽されてるので,それらを自分で変数として定義し,tf.matmul
やらtf.nn.relu
やら使って計算するようにした. - 同様に,
tf.layers.conv2d
やtf.layers.max_pooling2d
のかわりにtf.nn.conv2d
やtf.nn.max_pool
使うようにした. - 重みやバイアスを求める計算グラフを定義して,得られた値を返す関数 getWeight を定義した.
- 重みやバイアスの値の辞書を引数として渡すと
tf.assign
してくれる関数 setWeight を定義した. - コマンドライン引数で GPU デバイスを指定できるようにした.
というわけで,こんなんできました: https://gist.github.com/takatakamanbou/3ff46118fc4e798ca8c43dafd67efc68
GPGPUマシンで実行して時間測ってみました.まずは CPU で
In [3]: %time %run ex170817mlpL.py # ceL accL ceV accV 0 0 2.3555366156 6.496 2.35637270432 6.45 500 63808 0.092499746201 97.128 0.107396060586 96.74 : 9000 1150656 6.13513418444e-05 100.0 0.0866725751117 98.51 9500 1214608 5.54295608489e-05 100.0 0.0867583423773 98.49 CPU times: user 25min 33s, sys: 45 s, total: 26min 18s Wall time: 3min 2s
In [5]: %time %run ex170817cnnL.py # ceL accL ceV accV 0 0 2.30353644867 10.39 2.30287331848 10.94 500 63712 0.0529104816699 98.304 0.0640928661048 98.08 : 9000 1150368 0.000801627419269 99.974 0.0712650403303 98.89 9500 1214368 0.00163371050193 99.956 0.0699203371461 98.9 CPU times: user 27min 26s, sys: 5min 1s, total: 32min 28s Wall time: 4min 14s
つづいてGPUで.GeForce GTX 1080 使いました.
In [4]: %time %run ex170817mlpL.py /gpu:0 # GeForce GTX 1080 : 9500 1215040 5.42799999355e-05 100.0 0.0863653538564 98.43 CPU times: user 1min 10s, sys: 6.76 s, total: 1min 17s Wall time: 47.8 s
In [6]: %time %run ex170817cnnL.py /gpu:0 # GeForce GTX 1080 : 9500 1214944 0.00201407230972 99.932 0.0669418959407 98.97 CPU times: user 1min 42s, sys: 9.94 s, total: 1min 52s Wall time: 1min 8s
Theano や Caffe で同じ条件でやった実験結果がないのでなんとも言えませんが,計算速度はまあこんなもんでしょうか.