TensorFlow推奨フォーマット「TFRecord」の作成と読み込み方法

Pocket

Googleが開発した機械学習のためのオープンソースソフトウェア、TensorFlow。

TensorFlowで学習するデータをインプットさせる場合、CSVやNumpyなどで用意したデータをそのまま利用することもできますが、TensorFlowが推奨フォーマットとして提供しているTFRecordもあります。

TFRecordは、「メモリに収まらないような大きなデータを処理できるようにしたもので、シンプルなレコード指向のバイナリのフォーマット」ということです。
(参考:TensorFlow Programmer’s Guide – Importing Data – Consuming TFRecord data

少量のデータで処理する場合は、事前にデータをメモリ上に乗せてしまえばいいですが、ディープラーニングのように大量のデータを扱う場合は、それが出来ないこともあるので、TFRecordを活用することになると思います。

今回は、TFRecordの基本として「作成」と「読み込み」をします。
(次回以降では、TFRecordを実際に学習に用いてみようと思っています。)

 

<今回の内容>

  1. 画像ファイルから、TFRecordファイルを作成する
  2. TFRecordファイルの中身を確認し、もう一度画像ファイルに戻してみる

 

それでは、始める前に、後述のコード実行に必要なライブラリをインポートしておきます。

1.画像ファイルから、TFRecordファイルを作成する

1-1.画像の準備 (MNISTから画像を生成する)

画像ファイルとして、TensorFlowが用意しているMNIST(シンプルなコンピュータ・ビジョンのデータセット。手書き数字画像で構成されています。)を利用します。

まずMNISTのデータを読み込みます。

フォルダ「mnistVisualize」に、ファイル「X-Y.png」(X:0からの連番、Y:0~9の正解ラベル)を作成します。

  • MNISTのデータは、単色なので、グレースケールとして処理しています。
  • MNISTのデータは、0~1の間におさまるように正規化されているので、255倍しています。

(結果)

以下は、フォルダ「mnistVisualize」に作成された画像をエクスプローラで表示したものです。画像を縮小表示していますが、画像中の数字とファイル名に付与したラベル(Y)が一致していることが分かります。

1-2.画像からTFRecordファイルを作成する

前述で作成した、「mnistVisualize」フォルダにあるファイルを1件ずつ読み込み、TFRecordファイルに書き込みます。

  • 数値データは「int64_list」、画像データは「bytes_list」で定義します。
  • ラベルはファイル名の一部から取得しています。

(結果)

以下は、処理後の「mnistVisualize」フォルダをエクスプローラで確認しているものです。10000件ある画像データを含んだTFRecordファイルが作成されていることが分かります。

 

2.TFRecordファイルの中身を確認し、もう一度画像ファイルに戻してみる

2-1.作成したTFRecordファイルの中身を確認する

2-1-1.データ件数を確認する

それでは、TFRecordが正しく作成されているか、中身を確認をします。まずはデータ件数です。

(結果)

下図Aは、Pythonでの処理結果です。別途、PythonでMNISTのデータ件数を求めた図Bの結果と一致しているのが分かります。元データのデータ全てが、TFRecordファイルに作成されています。

図A

[図A] 

図B[図B] 

 

2-1-2.データの中身を見てみる

次にデータの中身自体を確認します。

(結果)

以下は、上記PythonのコードをJupyter Notebookで実行した結果です。

定義したKey毎に、定義したデータ型と保存した値を保持しているのが分かります。

2-2.TFRecordファイルを画像に戻す

2-2-1.データを読み込み、もう一度画像にしてみる(1)

フォルダ「check_tfRecords」に、ファイル「tfrecords_X-Y.png」(X:0からの連番、Y:0~9の正解ラベル)を作成します。
画像データは、まずTFRecordファイル作成時に定義した通り、「bytes_list」として取得していますが、数値化にあたり、「dtype=np.uint8」で処理します。別のdtypeを指定すると、reshape後の形状が異なってきますので、注意して下さい。

(結果)

以下は、「check_tfRecords」フォルダに作成された画像をエクスプローラで表示したものです。画像を縮小表示していますが、画像中の数字とファイル名に付与したラベル(Y)が一致していることが分かります。

 

2-2-2.データを読み込み、もう一度画像にしてみる(2)

 上記「データを読み込み、もう一度画像にしてみる(1)」では、TFRecordファイルから1件ずつ読み込んで、画像ファイルに変換していました。

別の実装方法で、TFRecordファイルを読み込んで、キューに入れて、キューを1件ずつ処理して画像に変換する方法もありますので、下に掲載します。

 

 

今回は、TFRecordフォーマットのファイルを、単純に作成したり、読み込んだりしました。次回以降では、TFRecordを学習に用いる方法を取り扱いたいと思います。

執筆者プロフィール

Oose Takashi
Oose Takashitdi IT技術推進部
入社以来、C/S型の業務システム開発に従事してきました。ここ数年は、SalesforceやOutSystemsなどの製品や、スクラム開発手法に取り組み、現在のテーマは、DeepLearning/機械学習です。
Pocket

関連記事