#メモなので、いきなり本題へ
TensorFlowでCSVファイルを読む方法は、公式チュートリアルに書いてあるのですが、ちょっとわかりづらい。
まず、話の前提として、TensorFlowは非同期処理をQueue(キュー)で管理してます。これは、複数のスレッドで処理を行う際に、決められた順番で処理を行うのに有用です。つまり、たくさんある書類を複数の事務員が処理する時、それらを床に散らかして事務員が適当に書類を拾って処理するのではなく、書類を一つの山に積んでおき、各事務員が下から書類を取ってどんどん処理するイメージです(詳しくは、公式を参照)
このキューによる処理が、ファイルの読み書きでも使われてます。たとえば、
csvTest.csv
0,1,2,3,4,5
10,20,30,40,50
というCSVファイルを読む、以下のコードを考えます。CSVファイルは、Docker containerにマウントしているフォルダのtensorflow_dev以下にあります。
>>> import tensorflow as tf
>>> filename_queue = tf.train.string_input_producer(["/tensorflow_dev/csvTest.csv"])
>>> reader = tf.TextLineReader()
>>> key, value = reader.read(filename_queue)
>>> sess = tf.Session()
>>> tf.train.start_queue_runners(sess)
>>> sess.run(value)
'0,1,2,3,4,5'
>>> sess.run(key)
'/tensorflow_dev/csvTest.csv:2'
>>> sess.run(value)
'0,1,2,3,4,5'
>>> sess.run(value)
'10,20,30,40,50,60'
ここでは、
- 2行目のtf.train.string_input_producerでキューにファイル名を登録します。
- 次の行のreader = tf.TextLineReader()でreaderノードにTextLineReader()の機能を割り当てます。
- 次の行のreader.readメソッドでfilename_queueに指定されたファイルから、1行分を読み出し、 その内容をvalueに、ファイル名と行数に関する情報をkeyに与えるようにします。
- 6行目のtf.train.start_queue_runnersでqueue runnerを開始し、グラフ内のキューが使えるようにします。
- 7行目のsess.run(value)で、最初の行の値を読み出します。その結果、'0,1,2,3,4,5'というアウトプットが得られます。
- 次のsess.run(key)で、2行目を読み出し、その情報が'/tensorflow_dev/csvTest.csv:2'として出力されます。
- 次のsess.run(value)では、最初の行に戻って'0,1,2,3,4,5'が出力されます。それをもう一度行うと、'10,20,30,40,50,60'が出力されます。
sess.runを実行するたびに、読み出す行が一つづつ移動するので、注意してください。
改行について
tf.TextLineReader()は、改行として¥n
しか受け付けないようです(参考)。特に、Windowsで作業している方は注意してください。