Tensorflow训练-使用repeat()时为空数据集?

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

我正在使用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_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,但你的问题解决了,这很好。