TensorFlowで日向坂46の顔識別をしてみた -学習編-

ようやく本題です.

 

モデル構築

モデルの構築に関しては全く知識が無かったので同様のことをやっていた先駆者の方々のものを参考にすることにしました.

 

qiita.com

 

memo.sugyan.com

 

結果的にこんな感じのモデルになりました.(Convnet Drawerで書いてます)

f:id:tsu_tech:20190502212935p:plain



 

コード本体

 

長くなりすぎて 全部は説明できないので違う点についてのみ説明していきたいと思います.

 

1. Batch Normalization の追加

最初同じようにモデルを構築して学習を始めた際に,ステップが進んでいるのにaccuracyが10%前後から進まないことがありました.

似たような事例を探した結果Batch Normalizationを追加すると学習が進んだという記事を見つけたので追加した結果学習が進むようになりました.

qiita.com

 

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」の形で保存されます.

f:id:tsu_tech:20190430040646p:plain

 

テスト

学習結果のモデルを読み込んでテストデータで検証を行います.

注意したいのは

・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%まで上がりました.

 

次の記事

TensorFlowで日向坂46の顔識別をしてみた -検証編- - タイトル未定