1. ホーム

Tensorflowのデータ(next_batch)を読み込む方法は以下の3つです。

2022-02-11 01:36:18

Tensorflowのデータは、3つの方法で読み取ることができます。

  • プリロードされたデータ プリロードされたデータ
  • フィーディングを行う。Pythonがデータを生成し、それをバックエンドにフィードする。
  • ファイルからの読み込み ファイルから直接読み込む

この3つの読み込み方法の違いは何でしょうか?まずはTensorFlow(TF)の仕組みを知る必要があります。

TFのコアはC++で書かれており、高速に動作するというメリットと、柔軟性のない呼び出しというデメリットがあります。Pythonはその逆なので、両言語の長所を兼ね備えています。PythonはこれらのAPIを呼び出して学習モデル(Graph)を設計し、設計したGraphをバックエンドに渡して実行させる。つまり、PythonはDesign、C++はRunという役割分担です。

I. データのプリロード

  1. <スパン インポート  テンソルフローをtfとして  
  2. <スパン # デザイングラフ
  3. x1 = tf.constant([ 2 3 4 ])  
  4. x2 = tf.constant([ 4 0 1 ])  
  5. y = tf.add(x1, x2)  
  6. # セッションを開く --> 計算する y
  7. tf.Session()をsessとした場合。  
  8. プリント  sess.run(y)  

II. pythonでデータを生成し、バックエンドに送り込む

  1. <スパン インポート  テンソルフローをtfとして  
  2. <スパン # デザイングラフ
  3. x1 = tf.placeholder(tf.int16)  
  4. x2 = tf.placeholder(tf.int16)  
  5. y = tf.add(x1, x2)  
  6. # Pythonでデータを生成する
  7. li1 = [ 2 3 4 ]  
  8. li2 = [ 4 0 1 ]  
  9. <スパン # セッションを開く --> データをフィードする --> yを計算する
  10. tf.Session()をsessとした場合。  
  11. プリント  sess.run(y, feed_dict={x1: li1, x2: li2})  
注:ここでx1, x2は具体的な値を持たないただのプレースホルダーなので、実行時にどこで値を取得するのか?ここで sess.run() の中にある feed_dict パラメータで、Pythonで生成したデータをバックエンドに送り、yを計算します。
<スパン この2つの選択肢のデメリット

<スパン 1. プリロードです。 データを直接グラフにインライン化し、そのグラフをSessionに渡して実行する。データ量が比較的多い場合、Graphの転送は効率の問題が発生する .

2. データをプレースホルダーに置き換えて、実行時に入力されるようにします。

最初の2つの方法は便利です。 しかし、大きなデータになると圧倒されますし、Feedingでも中間リンクの追加はデータ型変換など、かなりのオーバーヘッドになります。 この場合、GUI(グラフィカル・ユーザー・インターフェース)を使用するのが最適です。最良の解決策は、Graphでファイル読み込みメソッドを定義し、TFにファイルからデータを読み込ませ、使用可能なサンプルセットにデコードさせることです。

3つ目は、ファイルからの読み込み、これは単純にデータ読み込みモジュールのグラフが構築されていることを意味します


<スパン 1. データを用意し、A.csv,B.csv,C.csvの3つのファイルを作成します。

<スパン

  1. $ echo -e  "Alpha1,A1nAlpha2,A2nAlpha3,A3"  > A.csv  
  2. $ echo -e  "Bee1,B1nBee2,B2nBee3,B3"  > B.csv  
  3. $ echo -e  "Sea1,C1nSea2,C2nSea3,C3"  > C.csv  

<スパン 2. シングルリーダー、シングルサンプル

  1. <スパン #-*- coding:utf-8 -*-.
  2. インポート  テンソルフローをtfとして  
  3. <スパン # 先入れ先出しのキューと、ファイル名キューを生成するQueueRunnerを生成する
  4. ファイル名 = [ 'A.csv' 'B.csv' 'C.csv'です。 ]  
  5. filename_queue = tf.train.string_input_producer(filenames, shuffle=) )  
  6. # リーダーの定義
  7. reader = tf.TextLineReader()  
  8. key, value = reader.read(filename_queue)  
  9. # デコーダーの定義
  10. 例:label = tf.decode_csv(value, record_defaults=[) 'ヌル' ], [ 'ヌル' ]])  
  11. <スパン #example_batch, label_batch = tf.train.shuffle_batch([example,label], batch_size=1, capacity=200, min_after_dequeue=100, num_threads=2)
  12. # 実行グラフ
  13. tf.Session()をsessとした場合。  
  14.     coord = tf.train.Coordinator()   # スレッドを管理するコーディネーターを作成する
  15.     threads = tf.train.start_queue_runners(coord=coord)   # ファイル名キューが入ったので、QueueRunnerを開始します。
  16. について  i   範囲( 10 ):  
  17. プリント  example.eval(),label.eval()を実行します。  
  18.     coord.request_stop()  
  19.     coord.join(threads)  
注意:ここではtf.train.shuffle_batchを使用していません。そうすると、生成されたサンプルとラベルが対応しなくなり、順番がめちゃくちゃになってしまいますので、ご注意ください。生成された結果は以下の通りです。

α1 A2
α3 B1
Bee2 B3
海1 C2
海3 A1
α2 A3
Bee1 B2
Bee3 C1
海2 C3
アルファ1 A2

<スパン 解決方法 tf.train.shuffle_batchを使用することで、生成された結果を対応させることができます。

  1. <スパン #-*- coding:utf-8 -*-.
  2. インポート  テンソルフローをtfとして  
  3. <スパン # 先入れ先出しのキューと、ファイル名キューを生成するQueueRunnerを生成する
  4. ファイル名 = [ 'A.csv' 'B.csv' 'C.csv'です。 ]  
  5. filename_queue = tf.train.string_input_producer(filenames, shuffle=) )  
  6. # リーダーの定義
  7. reader = tf.TextLineReader()  
  8. key, value = reader.read(filename_queue)  
  9. # デコーダーの定義
  10. 例:label = tf.decode_csv(value, record_defaults=[) 'ヌル' ], [ 'ヌル' ]])  
  11. example_batch, label_batch = tf.train.shuffle_batch([example,label], batch_size=) 1 容量 <スパン 200 min_after_dequeue= 100 , num_threads= <スパン 2 )  
  12. # 実行グラフ
  13. tf.Session()をsessとした場合。  
  14.     coord = tf.train.Coordinator()   # スレッドを管理するコーディネーターを作成する
  15.     threads = tf.train.start_queue_runners(coord=coord)   # ファイル名キューが入ったので、QueueRunnerを開始します。
  16. について  i   範囲( 10 ):  
  17.         e_val,l_val = sess.run([example_batch, label_batch])  
  18. プリント  e_val、l_val  
  19.     coord.request_stop()  
  20.     coord.join(threads)  

<スパン 3. シングルリーダー、マルチサンプル、も主に使われています。 tf.train.shuffle_batch で実現する。 <スパン

  1. <スパン #-*- coding:utf-8 -*-.
  2. インポート  テンソルフローをtfとして  
  3. ファイル名 = [ 'A.csv' 'B.csv' 'C.csv'です。 ]  
  4. filename_queue = tf.train.string_input_producer(filenames, shuffle=) )  
  5. reader = tf.TextLineReader()  
  6. key, value = reader.read(filename_queue)  
  7. 例, label = tf.decode_csv(value, record_defaults=[[]) 'ヌル' ], [