【问题标题】:Tensorflow: data api for big datasetsTensorflow:用于大数据集的数据 API
【发布时间】: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


    【解决方案1】:

    如果需要从磁盘读取多个 CSV 文件,您可以使用 make_csv_dataset 函数。

    train_ds = tf.data.experimental.make_csv_dataset(
        tf.io.gfile.glob("data/multiple/*.csv"), 
        batch_size = 10, 
        column_names = None, 
        column_defaults= [0,0,0,0,0.,"a",0],
        label_name='target', 
        select_columns = ['age', 'sex', 'cp', 'trestbps','oldpeak','thal', 'target'],  
        shuffle=True, 
        shuffle_seed=101, 
        
    )
    

    欲了解更多信息,请参阅here

    【讨论】:

      猜你喜欢
      • 2019-02-08
      • 2018-08-22
      • 2018-06-05
      • 1970-01-01
      • 1970-01-01
      • 2018-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多