如何解决使用 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()
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 举报,一经查实,本站将立刻删除。