Как разделить набор данных на K-кратные, не загружая весь набор данных сразу?

#python #tensorflow #keras #deep-learning #k-fold

Вопрос:

Я не могу загрузить весь свой набор данных сразу, поэтому я использовал tf.keras.preprocessing.image_dataset_from_directory() его для загрузки пакетов изображений во время обучения. Это хорошо работает, если я хочу разделить свой набор данных на 2 подмножества (обучение и проверка), однако я хотел бы разделить свой набор данных на K складок, чтобы выполнить перекрестную проверку. (5 складок было бы неплохо)

Как я могу сделать K-складки, не загружая весь свой набор данных ? Должен ли я отказаться от использования tf.keras.preprocessing.image_dataset_from_directory() ?

Ответ №1:

Лично я рекомендую вам переключиться на tf.data.Dataset() .

Это не только более эффективно, но и дает вам больше гибкости в плане того, что вы можете реализовать.

Допустим, у вас есть изображения( image_paths ) и labels в качестве примера.

Таким образом, вы могли бы создать конвейер, подобный:

 training_data = []
validation_data = []
kf = KFold(n_splits=5,shuffle=True,random_state=42)
for train_index, val_index in kf.split(images,labels):
    X_train, X_val = images[train_index], images[val_index]
    y_train, y_val = labels[train_index], labels[val_index]
    training_data.append([X_train,y_train])
    validation_data.append([X_val,y_val])
 

Тогда вы могли бы создать что-то вроде:

 for index, _ in enumerate(training_data):
    x_train, y_train = training_data[index][0], training_data[index][1]
    x_valid, y_valid = validation_data[index][0], validation_data[index][1]
   
    train_dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train))
    train_dataset = train_dataset.map(mapping_function, num_parallel_calls=tf.data.experimental.AUTOTUNE)
    train_dataset = train_dataset.batch(batch_size)
    train_dataset = train_dataset.prefetch(buffer_size=tf.data.experimental.AUTOTUNE)
    
    
    validation_dataset = tf.data.Dataset.from_tensor_slices((x_valid, y_valid))
    validation_dataset = validation_dataset.map(mapping_function, num_parallel_calls=tf.data.experimental.AUTOTUNE)
    validation_dataset = validation_dataset.batch(batch_size)
    validation_dataset = validation_dataset.prefetch(buffer_size=tf.data.experimental.AUTOTUNE)



    model.fit(train_dataset,
             validation_data=validation_dataset,
             epochs=epochs,
             verbose=2)
 

Комментарии:

1. Спасибо вам за вашу помощь. Итак, я должен указать путь к изображениям в переменной «изображения», а затем загрузить их в функцию mapping_function ?

2. Точно. Функция отображения как логика должна иметь такие методы, как image = tf.io.decode_jpg(путь к изображению,каналы=3) и т. Д.

3. Или другую обработку, которую вы хотели бы реализовать 😀