Tensorflow Training - пустой набор данных при использовании repeat ()? - PullRequest
0 голосов
/ 04 марта 2020

Я использую Tensorflow 1.1.4 и пытаюсь тренироваться с разделением проверки / теста.

Я строю свой набор данных, используя tf.data.experimental.make_csv_dataset

Мой начальный набор 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)

Моя первая попытка разделения теста / train / 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(), а поиск в Google похожих проблем указывает на то, что я теоретически могу попробовать tf.contrib.data.batch_and_drop_remainder()

Однако я не могу заставить любой из них работать.

Если я добавлю

  train_dataset = train_dataset.repeat(1)
  test_dataset = test_dataset.repeat(1)
  val_dataset = val_dataset.repeat(1)

, я все равно получу Empty Data Set и то же предупреждение сверху.

Если я использую

  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 / test split (используйте тот же размер пакета и пошаговую математику эпохи без проверок s и без разбиений, но, очевидно, никто этого не хочет.

  steps_per_epoch =  int( DATASET_SIZE // BATCH_SIZE )
  history = model.fit(ds, epochs=NUM_EPOCHS, steps_per_epoch=steps_per_epoch)

Какие существуют другие стратегии для решения этой проблемы ? Размеры моих выборок обычно составляют несколько сотен тысяч

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...