使用 numpy 迭代器验证数据

use numpy iterator for validation data

我是机器学习的新手,我正在尝试用我的代码解决问题。
我正在使用的训练数据集保存在 tf.record 文件中,由于它太大而无法存储在内存中,我正在为训练集使用迭代器。问题是即使是验证集也太大而无法放入内存(至少对于我的笔记本电脑只有 2GB 内存),所以它也作为 tf.record 保存在磁盘上,我只是不'认为我可以使用与迭代器相同的技巧。那我能用什么?

代码

#reading training and validation dataset
def read_tfrecord(example):
  tfrecord_format = (
      {
          "x": tf.io.FixedLenFeature([], tf.string),
          "y": tf.io.FixedLenFeature([], tf.string),
      }
  )
  example = tf.io.parse_single_example(example, tfrecord_format)
  x = tf.io.parse_tensor(example['x'], out_type=tf.float32)
  y = tf.io.parse_tensor(example['y'], out_type=tf.double)
    

  return x,y

filename = "train.tfrecord"
training_dataset = (tf.data.TFRecordDataset(filename).map(read_tfrecord))
iterator = training_dataset.repeat().prefetch(10).as_numpy_iterator()

filename = "validation.tfrecord"
validation_dataset = (tf.data.TFRecordDataset(filename).map(read_tfrecord))
val_iterator = validation_dataset.repeat().prefetch(10).as_numpy_iterator()

我是这样调用then fit方法的

model.fit(iterator,
          validation_data=(val_iterator),
          epochs=35,
          verbose=1)

但是程序未能完成第一个 epoch,它卡住了并且永远不会结束

我不确定您为什么要使用 2GB 视频卡而不是 colab 或 Kaggle 笔记本。但希望这会有所帮助

valid = tf.data.Dataset.from_tensor_slices((x_valid, y_valid))
valid = valid.batch(batch_size)

model.fit(iterator,
          validation_data=valid,
          epochs=35,
          verbose=1)

当您的数据集不适合您的内存时,您一定要将其分成批次,这样您一次只能将数据集的一个子集加载到内存中。另外,我不知道你的数据样本有多大,但预取也会影响你的内存使用,使用 .prefetch(tf.data.AUTOTUNE) 可能是有益的,因为缓冲区大小是动态调整的。

# tune this value experimentally
batch_size = 32

training_dataset = tf.data.TFRecordDataset(filename).map(read_tfrecord)
training_dataset = training_dataset.batch(batch_size).prefetch(tf.data.AUTOTUNE)

filename = "validation.tfrecord"
validation_dataset = tf.data.TFRecordDataset(filename).map(read_tfrecord)
validation_dataset = validation_dataset.batch(batch_size)
model.fit(training_dataset, validation_data=validation_dataset, ...)

找到了使用生成器的解决方案,我将post代码

#generator
def generator(self, dataset, batch_size):
      ds = dataset.repeat().prefetch(tf.data.AUTOTUNE)
      iterator = iter(ds)
      x, y = iterator.get_next()
      
      while True:
        yield x, y

#reading training and validation dataset
def read_tfrecord(example):
  tfrecord_format = (
      {
          "x": tf.io.FixedLenFeature([], tf.string),
          "y": tf.io.FixedLenFeature([], tf.string),
      }
  )
  example = tf.io.parse_single_example(example, tfrecord_format)
  x = tf.io.parse_tensor(example['x'], out_type=tf.float32)
  y = tf.io.parse_tensor(example['y'], out_type=tf.double)
    

  return x,y

filename = "train.tfrecord"
training_dataset = tf.data.TFRecordDataset(filename).map(read_tfrecord)
train_ds = generator(training_dataset, batch_size)

filename = "validation.tfrecord"
validation_dataset = (tf.data.TFRecordDataset(filename).map(read_tfrecord))
valid_ds = generator(validation_dataset, batch_size)

kwargs['validation_data'] = (valid_ds)

#get your training step with something like this
training_steps = x.shape[0]//batch_size
validation_steps = x_val.shape[0]//batch_size

model.fit(train_ds, steps_per_epoch = training_steps, validation_steps=validation_steps, **kwargs)