Tensorflow训练-使用repeat()时为空数据集?
我正在使用Tensorflow 1.1.4,并尝试使用验证/测试分离进行培训 我正在使用Tensorflow训练-使用repeat()时为空数据集?,tensorflow,machine-learning,keras,Tensorflow,Machine Learning,Keras,我正在使用Tensorflow 1.1.4,并尝试使用验证/测试分离进行培训 我正在使用tf.data.experimental.make\u csv\u数据集构建我的数据集 我的初始csv集: def get_dataset(file_path, BATCH_SIZE, NUM_EPOCHS, COLUMN_NAMES, **kwargs,): dataset = tf.data.experimental.make_csv_dataset( file_path,batch_siz
tf.data.experimental.make\u csv\u数据集构建我的数据集
我的初始csv集:
def get_dataset(file_path, BATCH_SIZE, NUM_EPOCHS, COLUMN_NAMES, **kwargs,):
dataset = tf.data.experimental.make_csv_dataset( file_path,batch_size=BATCH_SIZE,na_value="?",num_epochs=NUM_EPOCHS, column_names=COLUMN_NAMES, ignore_errors=True, shuffle=True,* *kwargs)
return dataset
然后,我将一些函数映射到我的数据集,以格式化模型所需的数据:
csv_dataset = get_dataset(label_file, BATCH_SIZE, NUM_EPOCHS, COLUMN_NAMES)
#make a new data set from our csv by mapping every value to the above function
split_dataset = csv_dataset.map(split_csv_to_path_and_labels)
# make a new datas set that loads our images from the first path
image_and_labels_ds = split_dataset.map(load_and_preprocess_image_batch, num_parallel_calls=AUTOTUNE)
# update our image floating point range to match -1, 1
ds = image_and_labels_ds.map(change_range)
我第一次尝试拆分测试/列车/val,如下所示:
BATCH_SIZE = 64
NUM_EPOCHS = 10
DATASET_SIZE = ( lenopenreadlines(label_file) - 1) # remove header
train_size = int(0.7 * DATASET_SIZE)
val_size = int(0.15 * DATASET_SIZE)
test_size = int(0.15 * DATASET_SIZE)
train_dataset = ds.take(train_size)
test_dataset = ds.skip(train_size)
val_dataset = test_dataset.skip(test_size)
test_dataset = test_dataset.take(test_size)
steps_per_epoch = int(train_size // BATCH_SIZE)
val_steps_per_epoch = int( (val_size // BATCH_SIZE) )
history = model.fit(train_dataset, epochs=NUM_EPOCHS, steps_per_epoch=steps_per_epoch, validation_data=val_dataset, validation_steps=val_steps_per_epoch, validation_freq=NUM_EPOCHS)
在我上一个训练阶段的最后一步,我收到以下错误:
70/71 [============================>.] - ETA: 0s - loss: 1.0760 - acc: 0.8250
WARNING:tensorflow:Your dataset iterator ran out of data; interrupting training. Make sure that your iterator can generate at least `validation_steps * epochs` batches (in this case, 1 batches). You may need touse the repeat() function when building your dataset. WARNING:tensorflow:Your dataset iterator ran out of data; interrupting training. Make sure that your iterator can generate at least `validation_steps * epochs` batches (in this case, 1 batches). You may need touse the repeat() function when building your dataset.
从这个角度来看,很明显,我的一个标签的样本量低于批次数量。然而,上面的错误提到我可以使用ds.repeat()
,谷歌搜索类似的问题表明,理论上我可以尝试tf.contrib.data.batch\u和\u drop\u resident()
然而,我不能让这两个工作
如果我加上
train_dataset = train_dataset.repeat(1)
test_dataset = test_dataset.repeat(1)
val_dataset = val_dataset.repeat(1)
我仍然收到空数据集和来自上面的相同警告
如果我使用
train_dataset = train_dataset.repeat()
test_dataset = test_dataset.repeat()
val_dataset = val_dataset.repeat()
我收到一条关于使用无限重复数据集的警告,它退出
如果我加上
train_dataset = train_dataset.apply(tf.contrib.data.batch_and_drop_remainder(BATCH_SIZE))
test_dataset = test_dataset.apply(tf.contrib.data.batch_and_drop_remainder(BATCH_SIZE))
val_dataset = val_dataset.apply(tf.contrib.data.batch_and_drop_remainder(BATCH_SIZE))
我还收到空数据集警告
此外,如果我不使用val/测试分割(使用相同的批量大小和历元步长数学,没有验证和分割,但显然没有人希望这样),我可以很好地进行训练
steps_per_epoch = int( DATASET_SIZE // BATCH_SIZE )
history = model.fit(ds, epochs=NUM_EPOCHS, steps_per_epoch=steps_per_epoch)
还有什么其他策略可以解决这个问题呢?我的样本量通常为几千到几千个。你在哪里定义你的迭代器?你对所有数据集都使用一个迭代器吗?啊,很好。让我在上面使用tf.data.experiative.make_csv\u dataset
添加ds迭代器代码。简言之,我创建一个迭代器,然后使用augm使用一些函数从路径中提取图像并获取标签。这些都可以在我训练SAN验证时使用。也许我对迭代器有问题?请稍等,我会将代码传递到那里。更新以添加一些上下文。如果以上内容有用或需要更多信息,请回答。非常感谢!我认为您的直觉帮助我解决了这个问题。我指定了tf.data.experiative.make_csv_dataset
的历元数,这意味着它不会无限重复。这导致其他重复函数失败,因为我不知道为什么。我终于能够进入验证阶段。上帝tf是一个密集的不友好API…很抱歉,战后我无法跟进ds,但你的问题解决了,这很好。