データ読み込みはnumpyかpandasを使うことが多いと思いますが、配列の次元管理がちょっと面倒になってきたり・・・
tensorflowのサイトを見ていたら「make_csv_dataset」という関数を見つけたので使ってみます。
適当に使ってみる
テスト用として、以下のようなCSVを使って動作確認を行う。
1行目はカラム名として、2行目からデータが続くイメージです。
data1,data2,data3
10,a,aa
20,b,bb
30,c,cc
40,d,dd
50,e,ee
60,f,ff
70,g,gg
80,h,hh
90,I,ii
100,j,jj
make_csv_datasetの引数としては「ファイルパス」と「バッチサイズ」が必須の模様。
読み込んだデータセットをprintで表示すると、データは表示されないが読み込んだデータ形式がj表示されます。
カラム名とカラムのデータ形式が表示されています。
「data1」カラムは数値なので「tf.int32」となっており、「data2」「data3」は文字列なので「tf.string」となってます。
import tensorflow as tf
dataset = tf.data.experimental.make_csv_dataset("data.csv",batch_size=1)
print(dataset)
------------------------------------------------------
<PrefetchDataset shapes: OrderedDict([(data1, (1,)), (data2, (1,)), (data3, (1,))]), types: OrderedDict([(data1, tf.int32), (data2, tf.string), (data3, tf.string)])>
引数で設定している「ファイルパス」は読み込むファイルのパスを指定します。この関数の名前の通り、読み込むファイルはCSVファイルが対象となります。
「バッチサイズ」はデータを何行単位で1つのデータとするか?という指定のようです。
データの中身を見てみます。
なんで90のデータが出てくるのかよくわからないけれどデータが表示できました。
def show_batch(dataset):
for batch in dataset.take(1):
for key, value in batch.items():
print("{:20s}: {}".format(key,value.numpy()))
show_batch(dataset)
----------------------------------------
data1 : [90]
data2 : [b'I']
data3 : [b'ii']
バッチサイズを「2」にすると2ずつのデータセットができているようです。
data1 : [ 70 100]
data2 : [b'g' b'j']
data3 : [b'gg' b'jj']
引数を確認してみる
想像よりも結構あった。
ファイルパスとバッチサイズが必須となっているのはデフォルト値が無いからですね。
一度に全部覚える必要は無いと思います、。
引数名 | デフォルト値 | 内容 |
file_pattern | — | 読み込むファイルパス |
batch_size | — | 1つの単位にする行数 |
column_names | None | カラム名を指定できるが、CSVの1行目にカラム名を指定しておけば考慮しなくても大丈夫。 |
column_defaults | None | カラムのデフォルト値を指定するけどきっちり値を入れておけば大丈夫。 |
label_name | None | 指定したカラムをラベルにする。 |
select_columns | None | 読み込み対象にするカラム名を指定 |
field_delim | ‘,’ | カラムの区切り文字 |
use_quote_delim | True | |
na_value | ” | |
header | True | |
num_epochs | None | データセットの繰り返し回数。設定しないと無限ループに陥るので最低でも「1」を設定しておく。 |
shuffle | True | データをシャッフルするかどうかの指定。デフォルトではシャッフルする。 |
shuffle_buffer_size | 10000 | |
shuffle_seed | none | |
prefetch_buffer_size | None | |
num_parallel_reads | None | |
sloppy | False | |
num_rows_for_inference | 100 | |
compression_type | None | |
ignore_errors | False |
引数の動作を確認してみる。
サンプルプログラムとかで使用されているオプションの動作を確認してみます。
「shuffle=False」を指定するとデータがCSVの順番で読み込まれます。
import tensorflow as tf
dataset = tf.data.experimental.make_csv_dataset("data.csv",batch_size=2,shuffle=False)
def show_batch(dataset):
for batch in dataset.take(1):
for key, value in batch.items():
print("{:20s}: {}".format(key,value.numpy()))
show_batch(dataset)
------------------------------------------------------------
data1 : [10 20]
data2 : [b'a' b'b']
data3 : [b'aa' b'bb']
「label_name」を指定すると指定したカラムがkey/valueではなくラベルとして紐づけられる模様。
import tensorflow as tf
LABEL_COLUMN = 'data3'
dataset = tf.data.experimental.make_csv_dataset("data.csv",batch_size=2,shuffle=False,label_name=LABEL_COLUMN)
def show_batch(dataset):
for batch,label in dataset.take(1):
print(label)
for key, value in batch.items():
print("{:20s}: {}".format(key,value.numpy()))
show_batch(dataset)
------------------------------------------------------------------
tf.Tensor([b'aa' b'bb'], shape=(2,), dtype=string)
data1 : [10 20]
data2 : [b'a' b'b']
コメント