【问题标题】:Batch preprocessing when working on Datasets in keras在 keras 中处理数据集时的批处理预处理
【发布时间】:2019-08-09 23:44:12
【问题描述】:

我有一些可变长度数据矩阵及其相关标签的示例,我想用它来训练 LSTM 网络。我知道我应该至少为每个批次填充数据样本(例如使用keras.preprocessing.sequence.pad_sequences),并且我成功地为网络提供了 numpy 数组,但我不知道如何使用 TFRecord 数据集。

我的 TFRecord 文件的典型读取代码如下:

featuresDict = {'data': tf.FixedLenSequenceFeature([], dtype=tf.string),
                'dataShape': tf.FixedLenSequenceFeature([], dtype=tf.int64),
                'label': tf.FixedLenSequenceFeature([], dtype=tf.int64)
               }

def parse_tfrecord(example):
    context, features = tf.parse_single_sequence_example(example, sequence_features=featuresDict)   
    label = features['label']
    data_shape = features['dataShape']
    data = tf.decode_raw(features['data'], tf.int64)
    data = tf.reshape(data, data_shape)
    return label, data

def DataGenerator(fileName, numEpochs=None, batchSize=None):    
  dataset = tf.data.TFRecordDataset(fileName, compression_type='GZIP')
  dataset = dataset.map(parse_tfrecord)
  dataset = dataset.batch(batchSize)
  dataset = dataset.repeat(numEpochs)
  return dataset

我可以解析每个示例并生成我的原始数据矩阵和标签。然后 DataGenerator 函数定义数据集并设置其批处理和重复功能。然后我创建一个 DataGenerator 对象并使用它来适应我的模型:

train_data = DataGenerator(fileName='train.gz', numEpochs=epochs, batchSize=batch_size)
model.fit(train_data, epochs=epochs, steps_per_epoch = train_steps, ...)

我可以将填充函数放在代码中的什么位置?一般来说,如果我想使用数据集 API 进行批处理级别的预处理,我该怎么做?

【问题讨论】:

  • 在您的 DataGenerator 中,dataset = dataset.batch(batchSize) 使它看起来像 dataset 可以被分解以获得批次的数据;是否有某些原因您无法执行那里和return 语句之间的操作?
  • 数据爆炸是什么意思?这只是为数据集添加批处理功能的标准代码。我可以在那里执行操作,但它们在 Dataset 本身上操作,而不是一批。

标签: keras padding


【解决方案1】:

一种方法是在写入 TFRecord 时在预处理期间填充序列。然后你可以使用与上面相同的代码。

但我建议 padded_batch,它的工作原理类似于 Keras 序列预处理。 如果维度已知(padded_shapes 是某个常数),则将序列填充到该常数。否则,它们被填充到最长的序列。

【讨论】:

  • 是的,这正是我所需要的。谢谢。
猜你喜欢
  • 2020-03-09
  • 1970-01-01
  • 2018-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多