微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 numpy 迭代器验证数据

如何解决使用 numpy 迭代器验证数据

我是机器学习的新手,我正在尝试解决我的代码问题。
我正在使用的训练数据集保存在 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([],}
  )
  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)
,

当您的数据集不适合您的内存时,您肯定应该将其拆分为多个批次,这样您一次只能将数据集的一个子集加载到内存中。此外,我不知道您的数据样本有多大,但预取也会影响您的内存使用,使用 import Chart from 'chart.js/auto' 可能会有所帮助,因为缓冲区大小是动态调整的。

.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)
,

使用生成器找到了一个解决方案,我会发布代码

#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([],}
  )
  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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。