TensorFlowでTFRecordsを使って学習させてみた

こんにちは。技術研究所のYKです。
最近TensorFlowを触り始めて、使ってみたら楽しかったので記事を書くことにしました。

今回はTensorFlowを使って、画像・正解データから単一ファイルのデータセットを作って学習させるところまでやってみました。

なんで単一ファイルにまとめたかったの?

  • こちらに記載があるように、TensorFlowでは画像ファイルを直接読み込んで利用することも可能です。
    しかし、学習用のファイルを単一のファイルにまとめることでデータセットを管理し易くなり、かつ人的ミスが減らせるので、単一ファイルにまとめて扱えるようにしたいと思いました。
    TensorFlowではTFRecordsという形式でデータセットをまとめられるとのことなので、試してみました。

TFRecords形式について

  • ここStandard TensorFlow format にある通り、TFRecordsはTensorFlow向けの推奨ファイルフォーマットです。
    TFRecordsファイルには、Protocol Buffersフォーマットでシリアライズされたデータを詰め込むことができます。
    つまり、画像データなどのバイナリデータでも、シリアライズしてしまえば詰め込むことが可能です。
  • TFRecords形式に変換しておくメリットとしては、以下の2点が挙げられます。
    1. TFRecords形式のファイルを扱う機能が提供されている
    2. 高速
      • 直接画像データを読み込むよりも、TFRecords形式に変換したものを利用した方が高速にデータを処理することができます。
      • 参考: Performance Guide

試した環境

  • OS: macOS Sierra 10.12.5
  • メモリ: 8GB
  • Python ver: Python 3.6.0 :: Anaconda 4.3.1 (x86_64)
  • TensorFlow
    • ver: 1.2rc0
      • 2017/06/14に試してみた時点では、上記のバージョンが提供されておりましたので、こちらのバージョンで試しました。
        しかし、06/22に改めてTensorFlowの公式サイトを確認したところ、バージョン1.2が正式版として提供開始されていました…
      • 念の為、今回実装したソースコードの動作確認をバージョン1.2にて行いましたが、幸いなことに何ら問題は発生しませんでした。
    • CPUモード

データセットの作成・読み込み

データセットの作成

  • TFRecordWriterオブジェクトを利用することで、TFRecords形式のデータセットを作成できます。
  • ソースコードの処理概要
    1. 画像ファイルが格納されているディレクトリと、それに対応する正解データを用意
      • ここでは事前にlistとして変数に格納しておく
    2. TFRecordWriterオブジェクトを生成
    3. 正解データを全件走査して下記の処理を実行
      1. 該当する画像ファイルを読み込み
      2. 画像データをリサイズ & バイナリ文字列に変換
        • CNNにて利用し易いように、すべての画像を一定のサイズにリサイズ
          TFRecordsに保存する上では、サイズは一定でなくとも問題ない
      3. TFRecordWriterオブジェクトを使って書き込み
  • ソースコード

データセットの読み込み

  • TensorFlowでは、queueを利用してファイルの読み込みを行います。
    また、TFRecordReaderオブジェクトを利用することでTFRecords形式のファイルを読み込むことができます。
  • ソースコードの処理概要
    1. TFRecordsファイルのパスをqueueに詰める
    2. queue内のTFRecordsファイルを読み込み、デシリアライズする
    3. デシリアライズしたデータを元の型に変換したり、元のshapeに戻したりする
  • ソースコード

データセットからのミニバッチ単位での取り出し

  • 「データセットの読み込み」のimg, labelからミニバッチ単位でデータを取り出します。
  • ソースコードの処理概要
    1. img, labelの値の調整と型変換
    2. ミニバッチ単位で取り出す為の変数を作成
    3. ミニバッチ分のデータの取り出し
  • ソースコード

TFRecordsを使ってみて

  • 先述した通りですが、TFRecordsには様々なデータを突っ込めるので非常に便利でした。
  • データセットを扱う機能以外にも、Data augmentationに必要な機能なども提供されているようなので、学習前の前処理がかなり軽減されそうな感じがしています。
  • まだローカル環境で使っている状態なので、せっかくならGoogle Cloud Platform上でも動かしてみたいところです。

SNSでもご購読できます。