ie_test
2018年7月22日日曜日
TFRecordフォーマット
# 目的 tensorflow を並列に使う方法として google cloud dataproc, google cloud dataflow や google cloud machine learning があるが、そういったサービスを受ける際に、gcs にデータを TFRecode フォーマットで置いたほうが良いという話がある。 その方が転送速度などの点では有利だという話がある。 とりあえず試してみた。 # csv から TFRecord フォーマットのファイルを作り、読み込む。 以下はコード tf_record.py ``` #coding:utf-8 import tensorflow as tf import numpy as np # csv から tfrecord フォーマットファイルへの書き込み. def write_test( fpath, result_fpath): with tf.python_io.TFRecordWriter( result_fpath ) as writer: with open( fpath, "r" ) as f: f.readline() # 読み捨て. for line in f: tmp_list = line.strip().split(",") tmp_f = map( int, tmp_list ) # generator のままで ok. example = tf.train.Example() example.features.feature["my_data"].int64_list.value.extend(tmp_f) writer.write( example.SerializeToString() ) return # tfrecord からの読み込み def load_test( fpath ): for i,record in enumerate(tf.python_io.tf_record_iterator(fpath)): example = tf.train.Example() example.ParseFromString(record) # バイナリデータからの読み込み tmp = example.features.feature["my_data"] a = tmp.int64_list.value print(i,a) fpath = "sample.csv" result_fpath = "test.tfrecords" write_test( fpath, result_fpath) load_test( result_fpath ) ``` tf.train.Example クラスのインスタンスに対して、 csv ファイルから一行づつ取り出しsplit したものを "my_data" として登録している。この際、 lint64_list.value に extent として突っ込んでいる。 このようにデータの型を明確にする必要がある。(なので文字列は使えないかもしれない。) 読み込む方法は tf.python_io.tf_record_iterator でレコード毎に取り出し、 int64_list.value として読み込み側で型を指定して取り出している。 データは次のもの sample.csv ``` a,b,c,d 1,2,3,4 9,10,11,13 9,7,11,3 ``` # 実行結果 ``` 0 [1, 2, 3, 4] 1 [9, 10, 11, 13] 2 [9, 7, 11, 3] ``` # 課題 このエンコード方法がどの程度有効なのか今の所、よくわからない。現状は実際の機械学習に乗せる感覚が掴めてないのでそこを考える必要がある。
0 件のコメント:
コメントを投稿
次の投稿
前の投稿
ホーム
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿