我正在尝试设置tf.data.Dataset以流传输大于内存的CSV文件以进行训练。我创建了以下基准,使用〜100mb CSV估算处理吞吐量(以mb / sec为单位)。
我要分批处理32个。理想情况下,我希望有一个解决方案,让我可以调整最小批量大小以进行训练,而不会影响数据集性能。
这是我的基准代码:
import os
import tensorflow as tf
import pandas as pd
import numpy as np
import time
input_file = 'playstore.csv'
batch = 32
headers = ['App', 'Category', 'Rating', 'Reviews', 'Size', 'Installs', 'Type', 'Price', 'Genres', 'Last Updated']
def get_dataset():
def _parse_csv(text_in):
defaults = [[''] for _ in headers]
values = tf.decode_csv(text_in, defaults)
values = [tf.reshape(x, (-1, 1)) for x in values]
return dict(zip(headers, values))
dataset = tf.data.TextLineDataset(input_file).skip(1)
dataset = dataset.batch(batch)
dataset = dataset.prefetch(1)
dataset = dataset.map(_parse_csv, num_parallel_calls=8)
return dataset
def run_benchmark(dataset):
# Get the whole dataset in one tensor
dataset = dataset.take(1200000//batch)
dataset = dataset.batch(10000000)
next_element = dataset.make_one_shot_iterator().get_next()
# Time it
with tf.Session() as sess:
tstart = time.time()
sess.run(next_element['App'][0][0][0])
t = time.time() - tstart
mb = os.stat(input_file).st_size/1024/1024
rate = mb / t
print('time: {} seconds, speed: {} mb/sec'.format(t, rate))
run_benchmark(get_dataset())
这在我的Macbook上每秒产生约20mb / s。我可以增加批处理大小以获得更好的结果,但是,如果我将它与dataset.unbatch()。batch(x)链接起来以控制解析后的最终批处理大小,则总体速度会降低约50%。
有人可以告诉我:
更新