TensorFlowで日向坂46の顔識別をしてみた -学習編-
ようやく本題です.
モデル構築
モデルの構築に関しては全く知識が無かったので同様のことをやっていた先駆者の方々のものを参考にすることにしました.
結果的にこんな感じのモデルになりました.(Convnet Drawerで書いてます)
コード本体
長くなりすぎて 全部は説明できないので違う点についてのみ説明していきたいと思います.
1. Batch Normalization の追加
最初同じようにモデルを構築して学習を始めた際に,ステップが進んでいるのにaccuracyが10%前後から進まないことがありました.
似たような事例を探した結果Batch Normalizationを追加すると学習が進んだという記事を見つけたので追加した結果学習が進むようになりました.
2. 入力画像サイズ
96x96,112x112も試してみたのですが128x128の方がテストデータに対する結果がよかったので128x128にしてます.さらに画像サイズを大きくもしてみたのですが大差なかったので128x128で落ち着いています.大きくすれば良いというわけでもなさそう?
学習
構築したモデルを用いて学習を行っていきます.入力のところの説明は(面倒なので...)割愛しますが学習を回している部分では以下の処理を行っています.
・学習の実行
_, lossResult, accuracyResult = session.run([trainOp, model.loss, model.accuracy], feed_dict={model.keepProb: 0.75, model.isTraining: True})
・10stepごとに学習精度と損失関数の結果を出力
if step % 10 == 0:
numExamplesPerStep = FLAGS.batchSize examplesPerSec = numExamplesPerStep / duration secPerBatch = float(duration) formatStr = ('%s: step %d, loss = %.5f (%.1f examples/sec; %.3f sec/batch)') print(formatStr % (datetime.now(), step, lossResult, examplesPerSec, secPerBatch)) print('accuracy result', accuracyResult)
・25stepごとにsummaryを書き込み
if step % 25 == 0 or step == 1: summaryStr = session.run(summaryOp, feed_dict={model.keepProb: 1.0, model.isTraining: True}) summaryWriter.add_summary(summaryStr, step)
・1000stepごとに損失関数の結果が最小だったstepの学習結果を保存
if step % 1000 == 0 or step == FLAGS.maxSteps or lossResult < threshold: # 1000回ごとの最良を保存 if bestSession is not None: checkpointPath = os.path.join(FLAGS.trainDir, 'model.ckpt') saver.save(bestSession, checkpointPath, global_step = bestStep) bestResult.append(bestLossResult) bestSteps.append(bestStep) bestLossResult = 0.01 bestStep = None bestSession = None else: checkpointPath = os.path.join(FLAGS.trainDir, 'model.ckpt') saver.save(session, checkpointPath, global_step = step)
学習結果のモデルはlog/data_YYYY-MM-DD_hhmm/以下に「model.ckpt-(step).data-00000-of-00001, index, meta」の形で保存されます.
テスト
学習結果のモデルを読み込んでテストデータで検証を行います.
注意したいのは
・model.ckpt-XXXXX.data-00000-of-00001
・model.ckpt-XXXXX.index
・model.ckpt-XXXXX.meta
の3つのファイルがありますがRestoreするときに指定するファイル名は
model.ckpt-XXXXX
であるということです.
初期段階のtrain:約5400枚で70000stepほど回して学習し,test:約540枚で検証した結果81%の精度になりました.
この8割くらいの精度で顔画像をある程度識別してもう1度学習データを集め直し,train:約14000枚で学習,test:約3600枚で検証した結果91%まで上がりました.
次の記事