実際に実装してみるTFRecordを使用するまとめ参考TensorFlowが推奨しているTFRecordというデータセットのフォーマットがあります。TFRecordを使いこなせるようになると、大規模なデータを効率的に学習できるようになることがあります。本記事では、TFRecordの使い方をマスターできるように読み書きする方法を解説し、実際にQueueRunnerを使った実装をしてみます。Bufferというバイナリフォーマットです。一度TFRecordを作成することで、データの生成・加工コストを下げられる場合があります。Engine用の入力データ形式として使うこともできます。TensorFlowで機械学習するとき、学習データセットを読み込むには以下の方法があります。APIを使用する(1)はデータセットが小さい場合には効果的です。一度だけファイルをメモリ上に読み込めば、高速にグラフに入力することができます。データが大きくなったときにメモリが圧迫されると処理速度の低下やメモリアロケーションエラーが発生する場合があります。(2)もプロトタイプとして簡易的に実装したい場合には何度もTFRecordを作成する手間が省けるので良いアイデアです。シングルスレッドで動作させている場合にはデータ読み込みと学習を同期的にしてしまう場合があるため、全体の学習時間が長くなってしまう場合があります。機械学習モデルを変更したり、チューニングをする際には同じ処理を何度もすることになることがあります。毎回同じようなデータ加工処理を走らせている場合には、TFRecordを作成することを検討しましょう。TFRecordを使用する場合、(3)や(4)の方法でTensorFlowの計算グラフに入力していくことになります。計算グラフ上ではマルチスレッドのキューが使用されるために、学習とデータセットの読み込み・加工を非同期で行うことができます。TFRecordの作り方それでは早速TFRecordを作成していきましょう。例にTFRecordの作り方を学んでいきましょう。MNISTは、以下のような28×28の10種類の服画像を分類するデータセットです。MNISTのページにリンクが貼ってあるので、data/fashionディレクトリを作成して保存します。../..こうすることで、MNISTと同じようにTensorFlowからコードを読み込むことができるようになります。input_data.read_data_sets('data/fashion')ExampleレコードとSequenceExampleレコードTFRecordは、tf.train.Exampleとtf.train.SequenceExampleを1つのレコードの単位として書き込みます。tf.train.Exampleは数値や画像などの固定長のリストを扱います。各レコードの値はtf.train.Featureで指定します。tf.train.Featureの使用できるデータ型は以下のとおりです。tf.train.Int64Listtf.train.FloatListtf.train.BytesList以下のように[value]とリストの中に値を指定します。tf.train.Feature(bytes_list=tf.train.BytesList(value=[image]))}))tf.train.SequenceExampleは固定長のcontextと可変長のfeature_listsを持つデータ形式となります。テキストや時系列などのシーケンシャルデータを学習する場合にはtf.train.SequenceExampleを使用しましょう。MNISTをTFRecordの形式で保存してみます。以下のようにnumpy配列の場合はtobytes()メソッドを使用することでリストをBytes形式に変換することができます。main()このコードを実行すると、カレントディレクトリにfashion_mnist_train.tfrecordとfashion_mnist_test.tfrecordが保存されるはずです。過去に書き出したTFRecordの中の構造が知りたい場合には、tf.train.Example.FromStringが便利です。}}featuresの中にimageとlabelとheightとwidthのfeatureが入っているということが分かります。TFRecordの読み込み方TFRecordは、tf.parse_single_exampleを使用して読み込むことができます。BytesListで書き込んだものは、tf.stringで読み込むことに注意してください。label実際に実装してみるTFRecordにする前のデータとTFRecordにした場合で実際に実行してみます。MNISTの場合はそれほどデータ量が多くないので、全データメモリに入ってしまいますが、計算グラフへの入力部分が非同期になるはずです。main()まとめ今回の例では前処理やデータベースとのIOが発生することもなく、メモリ上にすべて展開できてしまうためにそれほどメリットはありません。巨大なデータセットでデータのIOがリアルタイムで発生してしまう場合や複数マシンで分散学習する場合などはTFRecordにすることを検討してください。APIを使用することで簡潔に書くこともできます。以前に紹介しているので、こちらも合わせて参考にしてください。MNISTTweetDeepAgeではAIに関する厳選した内容を記事にしてお届けします。APIは、TensorFlow1.2から新しく追加された機能です。APIの使い方を徹底解説しました。2017-Jul-18あらゆるデータを可視化するTensorBoard徹底入門TensorBoardは、TensorFlowのあらゆるデータを可視化するデバッグツールです。本記事では、TensorBoardの使い方を徹底的に解説しました。Learningの火付け役となったDropout。過学習を簡単な実装で防ぐことができるその実力と正則化について解説しました。