Я использую 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)
Какие существуют другие стратегии для решения этой проблемы ? Размеры моих выборок обычно составляют несколько сотен тысяч