APIは、バージョン1.2から追加された新しい機能です。APIを使うことで、TensorFlowの独自のキューによる入力パイプラインの煩わしさを減らし、データセットの加工や入れ替えがスムーズに出来るようになります。一般的に、データの読み込みではtf.train.string_input_producerやtf.train.shuffle_batchなどのTensorFlowの提供するAPIを通して大規模なデータを複数スレッドで処理できるように設計されています。気軽にキューの入出力を意識せずに使いたいと考えていた人は多いはずです。訓練データやテストデータの切り替えも処理パイプラインの組み換えに独自の実装を施さなければならず、簡単とは言い難いものでした。APIを使うことで、このような煩わしさから解放されます。独自のキューパイプラインから解放され、複雑な前処理も簡単に実装することができるようになります。APIを紹介し、使い方を解説します。APIは、tf.contrib.dataモジュールを経由して使用します。以下の3つのメリットをデベロッパーが得られるように設計されています。APIには2つの重要な概念があります。DatasetとIteratorです。DatasetDatasetは、テンソル要素の集合です。入力データセットを抽象化していて、Datasetの中には複数の入力データが含まれています。API、Swiftの配列のようにmapやflat_map、zipといったデータ変換APIを適用することができます。IteratorIteratorは、Datasetの要素を抽出して機械学習モデルにデータを流す繋ぎのインターフェースです。IteratorでDataset内での現在位置を管理して、次の要素を取得するための操作を提供します。3種類のIteratorの使い分け方Iteratorには、3種類のIteratorがあります。それぞれ特色が違うので、特徴と使い分け方を紹介します。one-shotone-shotは、入力データを一巡する標準的なイテレータです。後述する種類のイテレータと違い、パラメータ化をサポートしません。以下のコードのように、入力データを一巡します。iterator.get_next()関数で、次の要素を取得できるオペレータを使ってsess.runすると次の要素が手に入ります。print(sess.run(next_element))このコードをone_shot.pyと名前を付けて実行してみます。すると、0から9までの要素をone_shotイテレータで取得することができました。one_shot.py0123456789rangeで0~9までのDatasetを作成していますが、10を超えてnext_elementを取得しようとすると、どうなるのでしょうか。one-shotイテレータの場合は、tf.errors.OutOfRangeError例外をスローします。initializableinitializableイテレータは、データセットの作成と処理パイプラインをパラメータ化することができます。initializableイテレータを作成する場合は、make_one_shot_iteratorの代わりに、make_initializable_iteratorメソッドを使用します。初期化するパラメータは以下のように、iterator.initializerオペレータを使ってtf.Sessionのfeed_dictに値を指定します。print(sess.run(next_element))reinitializablereinitializableイテレータは、同じ型と形状を出力するデータセットを組み替えることができます。訓練データセットやテストデータセットなどのデータセットの切り替えのために使用します。仮にFizzBuzzの関数を学習させることを考えてみましょう。0~99までの数字を訓練データセットとして、100から200までのテストデータセットを作成して学習させることを考えてみます。この場合、以下のコードのような変換をすると、訓練データとテストデータをreinitializableイテレータを使用して分離することができます。accuracyの確認reinitializableイテレータは、型と形状を指定して、make_initializer関数で初期化オペレーションを生成します。DatasetのTransformerの種類と使い方Datasetは、関数合成のように処理パイプラインを組み合わせて使用します。そのため、複数の変換関数を覚える必要があります。基本的な使用方法を紹介します。基本変換mapmapは、各入力要素を関数適用するために使用します。上述の例だと、rangeで生成した数値をfizzbuzzの学習データに変換するために使用しています。Dataset.range(100).map(encode_fizz_buzz)以下のコードのように、lambda式を使用することもできます。tf.square(x))flat_mapflat_mapは、ネストしたDatasetの出力をネストを解消しながら各要素に関数適用することができます。4....zipzipはPythonのビルトイン関数のzipと同様に、複数のDatasetを1つにまとめることができます。3)...group_by_windowgroup_by_windowは、条件でグループ化して窓サイズで分割するために使用します。15]...データセット作成便利関数repeatrepeatは、データセットの要素を繰り返すことができます。データセットを作成する際には、one-shotイテレータを使う場合にはエポック数を指定することがあります。引数を指定しないと、永久にリピートします。Dataset.range(100).map(encode_fizz_buzz).repeat(num_epochs)shuffleshuffleは、データセットの要素の順番をシャッフルするために使用します。バッチ毎のデータ分布が偏ると上手く学習できなくなることがあるので、シャッフル化しておくと良いでしょう。引数にはシャッフルするバッファサイズを指定します。34...batchbatchはバッチサイズ毎に分割するために使用します。64]...unbatchunbatchはバッチを分解することができます。7,...padded_batchpadded_batchはゼロパディングしながら、分割します。0]]),...生成関数rangerangeはPythonのビルトイン関数と同様に、範囲内のイテレータを作成するために使用します。5,...,99enumerateenumerateもPythonのビルトイン関数と同様に、インデックスの番号を付けて返します。APIを使いこなすためには、各ファイルフォーマットからの読み込み方や加工方法を知る必要があります。CSVファイルやTFRecordの読み込み方やEstimatorとの併用を含めて使い方を紹介します。CSVファイルから前処理をする以下のCSVファイルから画像ファイルの名前とラベルを取得して、カテゴリ分類する例を考えてみましょう。最初の一行目に各カラムの説明が書いてあり、次の行からデータの中身が入力されています。filename,label001.jpg,rock002.jpg,river003.jpg,rock003.jpg,sky004.jpg,person005.jpg,sky006.jpg,animal007.jpg,river008.jpg,rock009.jpg,rock010.jpg,skyCSVファイルを読むには、CSVファイルが小さなデータセットであればメモリに入れてfrom_tensorsかfrom_tensor_slicesしても問題ないですが、大きい場合にも対応可能なようにdata.TextLineDatasetを使用します。iterator.get_next()print(sess.run(next_elem))tf.py_funcを使用することで、上記のようにPythonの関数を呼び出すことができるようになります。TFRecordを読み込む実用例TFRecordを作成すると、GPUとCPUを並列に動作させることができるので高速になります。TFRecordもtf.contrib.dataモジュールの関数で読み込むことができます。以下のようにパース関数を書いてmapで変換します。TFRecordについては、以下の記事を参考にしてください。APIはデータセットを簡単に読み込めるようにした新しいモジュールです。これまでの読み込み関数は廃止になる可能性もありますし、このモジュールの関数が大幅に変更になるかもしれません。個人的にはこれまでのAPIと比較すると、使いやすい印象があります。使いやすく、ハイパフォーマンスになると良いですね。PipelinesTweetDeepAgeではAIに関する厳選した内容を記事にしてお届けします。人工知能(AI)技術の事業活用に興味はございませんか?DeepAgeでは人工知能開発に関するあらゆるご相談を随時受け付けております会社概要はこちら事業概要・実績はこちらお問い合わせはこちらおすすめの投稿TensorFlowの基本的な算術演算の使い方を覚えようTensorFlowはデータフロープログラミングで計算グラフを構築して計算を実行するプログラミングパラダイムです。Pythonの算術演算とは種類が違うので、本記事を通して使い方をマスターしましょう。2018-Oct-4TensorFlowのデータフォーマットTFRecordの書き込みと読み込み方法TensorFlowが推奨するデータフォーマットはTFRecordです。本記事では、TFRecordを使う理由、メリット、使い方を徹底的に解説しました。2017-Oct-7TensorFlowの計算グラフ内の変数tf.Variableの使い方TensorFlowの変数tf.Variableは、一般的なプログラミング言語の変数の使い方とは全く異なるものです。