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