【发布时间】:2022-01-04 03:58:32
【问题描述】:
我正在阅读“使用 scikit learn keras tensorflow 进行机器学习动手”一书学习神经网络,作者在第 410 页显示了以下函数,说它是一个小辅助函数:它将创建并返回一个数据集将有效地从多个 CSV 文件加载数据,然后对其进行洗牌、预处理和批处理。对于不适合内存(ram)的 learge 数据集,它是一个很好的输入管道。
我尝试使用 3 个小文件来运行该函数,假装它们是训练集,而事情是整个“训练集”(所有三个文件一起)都加载到内存中。更确切地说,函数 tf.data.TextLineDataset() 正在读取整个文件。我虽然它会分批加载,可以说,当时从硬盘驱动器到 ram 有 32 个实例,但并没有发生什么变化。
所以我不明白这里发生了什么。为什么要读取整个数据集?
X_mean,X_std = [...] # mean and scale of each feature in the training set n_inputs = 8
def preprocess(line):
defs = [0.] * n_inputs + [tf.constant([], dtype=tf.float32)]
fields = tf.io.decode_csv(line, record_defaults=defs)
x = tf.stack(fields[:-1])
y = tf.stack(fields[-1:])
return (x - X_mean) / X_std, y
def csv_reader_dataset(filepaths, n_readers=5, shuffle_buffer_size=10000, n_parse_threads=5, batch_size=32):
dataset = tf.data.Dataset.list_files(filepaths).repeat(repeat)
dataset = dataset.interleave(lambda filepath: tf.data.TextLineDataset(filepath).skip(1), cycle_length=n_readers)
dataset = dataset.shuffle(shuffle_buffer_size)
dataset = dataset.map(preprocess, num_parallel_calls=n_parse_threads)
dataset = dataset.batch(batch_size)
return dataset.prefetch(1)
train_set = csv_reader_dataset(train_filepaths)
valid_set = csv_reader_dataset(valid_filepaths)
test_set = csv_reader_dataset(test_filepaths)
model = keras.models.Sequential([...])
model.compile([...])
model.fit(train_set, steps_per_epoch=len(X_train) // batch_size,
epochs=10, validation_data=valid_set, validation_steps=len(X_valid) // batch_size)
【问题讨论】:
标签: python tensorflow dataset