データ読み込み(make_csv_dataset)

tensorflow
この記事は約6分で読めます。
スポンサーリンク

データ読み込みは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_size1つの単位にする行数
column_namesNoneカラム名を指定できるが、CSVの1行目にカラム名を指定しておけば考慮しなくても大丈夫。
column_defaultsNoneカラムのデフォルト値を指定するけどきっちり値を入れておけば大丈夫。
label_nameNone指定したカラムをラベルにする。
select_columnsNone読み込み対象にするカラム名を指定
field_delim‘,’カラムの区切り文字
use_quote_delimTrue
na_value
headerTrue
num_epochsNoneデータセットの繰り返し回数。設定しないと無限ループに陥るので最低でも「1」を設定しておく。
shuffleTrueデータをシャッフルするかどうかの指定。デフォルトではシャッフルする。
shuffle_buffer_size10000
shuffle_seednone
prefetch_buffer_sizeNone
num_parallel_readsNone
sloppyFalse
num_rows_for_inference100
compression_typeNone
ignore_errorsFalse

引数の動作を確認してみる。

サンプルプログラムとかで使用されているオプションの動作を確認してみます。

「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']

コメント

タイトルとURLをコピーしました