使用TensorFlow从CSV文件高效构建数据集的方法
本文详细介绍如何利用TensorFlow的tf.data API从多个CSV文件构建高效的数据集。通过list_files、interleave并行读取、skip跳过表头以及map解析字段等步骤,实现从原始文件到可训练张量的转换。文章包含完整代码示例及batch_size、steps_per_epoch等关键参数的配置说明,适用于机器学习模型训练前的数据预处理环节。
从CSV文件构建TensorFlow数据集概述
从csv文件构建Tensorflow的数据集
当面对一系列CSV文件时,如何高效地构建TensorFlow数据集是一个常见且关键的问题。
构建数据集的基本步骤
基本步骤
- 首先需要获取所有CSV文件的路径列表。
- 接着,将这些文件名转换为对应的文件名数据集(file_dataset)。
- 然后,基于file_dataset中的每个文件名,读取文件内容并生成内容数据集(content_dataset)。
- 将多个content_dataset拼接起来,形成完整的数据集。
- 由于读取的每条记录均为string类型,因此还需要对每条记录进行解码处理。
实现代码与详细解析
假设存在一个名为train_filenames的变量,其中存储了文件路径。
pprint.pprint(train_filenames)
# ['generate_csv\\train_00.csv',
# 'generate_csv\\train_01.csv',
# 'generate_csv\\train_02.csv',
# 'generate_csv\\train_03.csv',
# 'generate_csv\\train_04.csv',
# 'generate_csv\\train_05.csv',
# 'generate_csv\\train_06.csv',
# 'generate_csv\\train_07.csv',
# 'generate_csv\\train_08.csv',
# 'generate_csv\\train_09.csv',
# 'generate_csv\\train_10.csv',
# 'generate_csv\\train_11.csv',
# 'generate_csv\\train_12.csv',
# 'generate_csv\\train_13.csv',
# 'generate_csv\\train_14.csv',
# 'generate_csv\\train_15.csv',
# 'generate_csv\\train_16.csv',
# 'generate_csv\\train_17.csv',
# 'generate_csv\\train_18.csv',
# 'generate_csv\\train_19.csv']
随后,利用预定义的API构建文件名数据集file_dataset。
filename_dataset = tf.data.Dataset.list_files(train_filenames)
for filename in filename_dataset:
print(filename)
#tf.Tensor(b'generate_csv\\train_09.csv', shape=(), dtype=string)
#tf.Tensor(b'generate_csv\\train_19.csv', shape=(), dtype=string)
#tf.Tensor(b'generate_csv\\train_03.csv', shape=(), dtype=string)
#tf.Tensor(b'generate_csv\\train_01.csv', shape=(), dtype=string)
#tf.Tensor(b'generate_csv\\train_14.csv', shape=(), dtype=string)
#tf.Tensor(b'generate_csv\\train_17.csv', shape=(), dtype=string)
#tf.Tensor(b'generate_csv\\train_15.csv', shape=(), dtype=string)
#tf.Tensor(b'generate_csv\\train_06.csv', shape=(), dtype=string)
#tf.Tensor(b'generate_csv\\train_05.csv', shape=(), dtype=string)
#tf.Tensor(b'generate_csv\\train_07.csv', shape=(), dtype=string)
#tf.Tensor(b'generate_csv\\train_11.csv', shape=(), dtype=string)
#tf.Tensor(b'generate_csv\\train_02.csv', shape=(), dtype=string)
#tf.Tensor(b'generate_csv\\train_12.csv', shape=(), dtype=string)
#tf.Tensor(b'generate_csv\\train_13.csv', shape=(), dtype=string)
#tf.Tensor(b'generate_csv\\train_10.csv', shape=(), dtype=string)
#tf.Tensor(b'generate_csv\\train_16.csv', shape=(), dtype=string)
#tf.Tensor(b'generate_csv\\train_18.csv', shape=(), dtype=string)
#tf.Tensor(b'generate_csv\\train_00.csv', shape=(), dtype=string)
#tf.Tensor(b'generate_csv\\train_04.csv', shape=(), dtype=string)
#tf.Tensor(b'generate_csv\\train_08.csv', shape=(), dtype=string)
第三步是根据每个文件名读取文件内部的内容。
dataset = filename_dataset.interleave(
lambda filename: tf.data.TextLineDataset(filename).skip(1),
cycle_length=5
)
for line in dataset.take(3):
print(line)
#tf.Tensor(b'0.46908349737250216,1.8718193706428006,0.13936365871212536,-0.011055733363841472,-0.6349261778219746,-0.036732316700563934,1.0259470089944995,-1.319095600336748,2.171', shape=(), dtype=string)
#tf.Tensor(b'-1.102093775650278,1.313248890578542,-0.7212003024178728,-0.14707856286537277,0.34720121604358517,0.0965085401826684,-0.74698820254838,0.6810563907247876,1.428', shape=(), dtype=string)
#tf.Tensor(b'-0.8901003715328659,0.9142699762469286,-0.1851678950250224,-0.12947457252940406,0.5958187430364827,-0.021255215877779534,0.7914317693724252,-0.45618713536506217,0.75', shape=(), dtype=string)
interleave函数的作用类似于map,它对每个元素应用操作,并将结果合并。因此,使用interleave可以一次性完成读取文件内容和生成内容数据集这两步操作。其中skip(1)用于跳过CSV的第一行表头,cycle_length参数指定了并行构建数据集的线程数。
接下来是第五步,即解析每条记录。
def parse_csv_line(line, n_fields=9):
defaults = [tf.constant(np.nan)] * n_fields
parsed_fields = tf.io.decode_csv(line, record_defaults=defaults)
x = tf.stack(parsed_fields[:-1])
y = tf.stack(parsed_fields[-1:])
return x, y
parse_csv_line('1.2286258796252256,-1.0806245954111382,0.4444161407754224,-0.0352172575329119,0.9740347681426992,-0.003516079473801425,-0.8126524696425611,0.865609068204283,2.803', 9)
#(<tf.Tensor: shape=(8,), dtype=float32, numpy= array([ 1.2286259 , -1.0806246 , 0.44441614, -0.03521726, 0.9740348 ,-0.00351608, -0.81265247, 0.86560905], dtype=float32)>,<tf.Tensor: shape=(1,), dtype=float32, numpy=array([2.803], dtype=float32)>)
最后,将解析方法应用于每条记录,即可完成数据集的构建。
dataset = dataset.map(parse_csv_line)
完整代码示例
完整代码
def csv_2_dataset(filenames, n_readers_thread = 5, batch_size = 32, n_parse_thread = 5, shuffle_buffer_size = 10000):
dataset = tf.data.Dataset.list_files(filenames)
dataset = dataset.repeat()
dataset = dataset.interleave(
lambda filename: tf.data.TextLineDataset(filename).skip(1),
cycle_length=n_readers_thread
)
dataset.shuffle(shuffle_buffer_size)
dataset = dataset.map(parse_csv_line, num_parallel_calls = n_parse_thread)
dataset = dataset.batch(batch_size)
return dataset
模型训练中的参数配置
如何使用
train_dataset = csv_2_dataset(train_filenames, batch_size=32)
valid_dataset = csv_2_dataset(valid_filenames, batch_size=32)
model = ...
model.fit(train_set, validation_data=valid_set,
steps_per_epoch = 11610 // 32,
validation_steps = 3870 // 32,
epochs=100, callbacks=callbacks)
这里的11610和3870代表什么?
这两个数值分别是train_dataset和valid_dataset中的数据总量,需要在训练过程中手动指定每个batch参与训练的数据数量。
model.evaluate(test_set, steps=5160//32)
同理,在测试阶段使用此类数据集时,也需要手动指定相关参数。其中5160是测试数据集的总量。
以上就是如何从csv文件构建Tensorflow的数据集的详细内容,更多关于csv文件构建Tensorflow的数据集的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









