TensorFlowの日本語まとめ

TensorFlowの公式サイトに書かれている英文を英語ど素人が翻訳(日本語訳/和訳)します。 間違いがありましたら、優しく教えていただけますと幸いです。 内容を理解したら、使ってみたい。

2.Reading from files

ファイルからレコードを読み取るための典型的なパイプラインは以下のステージがあります。

  1. ファイル名のリスト
  2. オプションのファイル名シャッフリング
  3. オプションのエポックの制限
  4. ファイル名のキュー
  5. ファイル形式のリーダー
  6. リーダで読み取るレコードのデコーダ
  7. オプションの前処理
  8. キュー

スポンサーリンク

 

ファイル名シャッフルおよびエポックの制限

ファイル名のリストについては、文字列定数テンソル (["file0", "file1"] or [("file%d" % i) for i in range(2)]のような) のいずれかを使用します。もしくは、tf.train.match_filenames_once function

 

 tf.train.string_input_producer functionへのファイル名のリストを渡しますstring_input_producerはリーダーがそれらを必要とするまで、ファイル名を保持するためのFIFOキューを作成します。

 

string_input_producerシャッフルエポックの最大数を設定するためのオプションがありますキューランナーは、shuffle=Trueの場合、エポック内のファイル名をシャッフルし、各エポックに対して一度キューにファイル名のリスト全体を追加します。この手順では例がアンダーまたはオーバーの互いに対してサンプリングされませんので、ファイルの均一なサンプリングを提供します。

 

キューランナーは、キューからファイル名引っ張るリーダーから別のスレッドなので、シャッフルで動作し、プロセスをエンキューすると、リーダーをブロックしません

 

ファイル形式

入力ファイル形式と一致するリーダーを選択して、リーダーがメソッドを読み取るためにファイル名のキューを渡します。readメソッドは、ファイルおよびレコード(あなたはいくつかの奇妙なレコードを持っている場合、デバッグに有用)、およびスカラー文字列値を識別するキーを出力します。例を構成するテンソルにこの文字列をデコードするデコーダと変換OPSの1つ(またはそれ以上)を使用します。

 

CSVファイル

comma-separated value (CSV) formatテキストファイルを読み取るには decode_csv操作でTextLineReaderを使用します

filename_queue = tf.train.string_input_producer(["file0.csv", "file1.csv"])

reader = tf.TextLineReader()
key, value = reader.read(filename_queue)

# Default values, in case of empty columns. Also specifies the type of the
# decoded result.
record_defaults = [[1], [1], [1], [1], [1]]
col1, col2, col3, col4, col5 = tf.decode_csv(
    value, record_defaults=record_defaults)
features = tf.concat(0, [col1, col2, col3, col4])

with tf.Session() as sess:
  # Start populating the filename queue.
  coord = tf.train.Coordinator()
  threads = tf.train.start_queue_runners(coord=coord)

  for i in range(1200):
    # Retrieve a single instance:
    example, label = sess.run([features, col5])

  coord.request_stop()
  coord.join(threads)

readを実行するたびに、ファイルから1行を読み込みますdecode_csvはテンソルのリストに結果を解析します。record_defaultsの引数は、結果のテンソルの種類を決定し、値が入力された文字列に欠落している場合に使用するデフォルト値を設定します。

 

あなたがrunしたり、読み取りを実行するためにevalを呼び出す前に、キューに移入する tf.train.start_queue_runners を呼び出す必要があります。それ以外の場合は、キューからファイル名を待つ間ブロックすることをreadしてください。

 

固定長レコード

各レコードはバイトの固定ある、バイナリファイルを読み込むには、 tf.decode_rawtf.FixedLengthRecordReaderを使用しますdecode_raw opはuint8テンソルに文字列変換します。

 

例えばthe CIFAR-10 datasetは、各レコード固定のバイト用いて表現されているファイル形式を使用しています。:ラベルの1バイトに、画像データの3072バイトが続きます。あなたはuint8 テンソルを持っていたら、標準的な操作は、各部分をスライスすることができ、必要に応じて再フォーマットします。CIFAR-10の場合、あなたはtensorflow/models/image/cifar10/cifar10_input.py で読み取りおよび復号を行うと、 this tutorialで説明する方法を見ることができます。

 

標準TensorFlowフォーマット

別のアプローチは、サポートされているフォーマットにあなたが持っているどのようなデータに変換することですこのアプローチは、それが容易になり、データセットを合わせること、およびネットワークアーキテクチャを混在させることができます。TensorFlowのための推奨される形式は、フィールドとしてFeatures が含まれているtf.train.Example protocol buffers含むTFRecords fileです。あなたのデータを取得するExampleプロトコルバッファにそれを詰め、文字列にプロトコルバッファをシリアル化し、その後、tf.python_io.TFRecordWriter classを使用して、TFRecordsの文字列をファイルに書き込む小さなプログラムを書きます。例えば、tensorflow/examples/how_tos/reading_data/convert_to_records.pyは、この形式にMNISTデータを変換します。

 

TFRecordsファイル読み込むには、 tf.parse_single_exampleデコーダで tf.TFRecordReaderを使用しています。parse_single_example opはテンソルに例のプロトコルバッファをデコードします。convert_to_recordsによって生成されたデータを使用してMNIST例は、あなたがfully_connected_feedのバージョンと比較することができtensorflow/examples/how_tos/reading_data/fully_connected_reader.pyで見つけることができます。

 

前処理

必要なこれらの例のいずれかの前処理を行うことができます。これは、トレーニング可能パラメータに依存しない任意の処理である可能性があります。例としては、ランダムなスライスをピッキングしたり、ノイズや歪みを追加して、データの正規化などが含まれます。例は、tensorflow/models/image/cifar10/cifar10.pyを見てください。

 

バッチ処理

パイプラインの終わりに、私たちは一緒にバッチにトレーニング評価または推論の例を別のキューを使用しますこのために我々はtf.train.shuffle_batch functionを使用して順序をランダム化キューを使用します

 

例:

def read_my_file_format(filename_queue):
  reader = tf.SomeReader()
  key, record_string = reader.read(filename_queue)
  example, label = tf.some_decoder(record_string)
  processed_example = some_processing(example)
  return processed_example, label

def input_pipeline(filenames, batch_size, num_epochs=None):
  filename_queue = tf.train.string_input_producer(
      filenames, num_epochs=num_epochs, shuffle=True)
  example, label = read_my_file_format(filename_queue)
  # min_after_dequeue defines how big a buffer we will randomly sample
  #   from -- bigger means better shuffling but slower start up and more
  #   memory used.
  # capacity must be larger than min_after_dequeue and the amount larger
  #   determines the maximum we will prefetch.  Recommendation:
  #   min_after_dequeue + (num_threads + a small safety margin) * batch_size
  min_after_dequeue = 10000
  capacity = min_after_dequeue + 3 * batch_size
  example_batch, label_batch = tf.train.shuffle_batch(
      [example, label], batch_size=batch_size, capacity=capacity,
      min_after_dequeue=min_after_dequeue)
  return example_batch, label_batch

 

あなたはファイル間の複数の平行度シャッフルが必要な場合はtf.train.shuffle_batch_join function使用して複数のリーダーインスタンス使用しています。例えば、:

def read_my_file_format(filename_queue):
  # Same as above

def input_pipeline(filenames, batch_size, read_threads, num_epochs=None):
  filename_queue = tf.train.string_input_producer(
      filenames, num_epochs=num_epochs, shuffle=True)
  example_list = [read_my_file_format(filename_queue)
                  for _ in range(read_threads)]
  min_after_dequeue = 10000
  capacity = min_after_dequeue + 3 * batch_size
  example_batch, label_batch = tf.train.shuffle_batch_join(
      example_list, batch_size=batch_size, capacity=capacity,
      min_after_dequeue=min_after_dequeue)
  return example_batch, label_batch


あなたはまだすべての読者によって共有される単一のファイル名のキューを使用するだけです。そうすれば、私たちはエポックからのすべてのファイルが起動されるまで、別の読者が同じエポックから別のファイルを使用するようにしてくださいまた、シングルスレッドのファイル名キューを埋めるのを持つことで十分です

 

代替案は、1よりも大きなnum_threads tf.train.shuffle_batch functionにより、単一のリーダーを使用することですこれは、N個のファイルの代わりに、(より速い1つのスレッドを持つよりますが)、それは同時に単一のファイルから読み込むようになります。これは重要なことができます。:

  • あなたが入力ファイルよりも読み取りのスレッドがある場合は、リスクを回避するために、あなたはお互いに近く、同じファイルと同じ例を読んで二つのスレッドを持つことになります。
  • もしくは、あまりにも多くの並列のディスクシーク起因でファイルをを読み取る場合

あなたはどのように多くのスレッドが必要なのでしょうか?tf.train.shuffle_batch*機能は、例えば、キューがどのようにフルを示すグラフ概要を追加します。十分な読み取りスレッドを持っている場合は、その要約はゼロより上に滞在します。あなたは、

TensorBoardを見る事ができます。

 

 

(原文サイト)

Reading data