Есть ли какой-то простой способ применить препроцесс изображения к tf.data.Dataset? - PullRequest
0 голосов
/ 07 октября 2019

Интересно, эффективный способ применить предварительную обработку изображения (например, поворот, хризонтальное отражение, отступ, обрезка и т. Д.) К данным, созданным API tf.data

Мои данные создаются следующим образом:

import tensorflow as tf

// train_data -> numpy array, (50000, 32, 32, 3)
// test_data -> numpy array, (10000, 32, 32, 3)

train_generator = tf.data.Dataset.from_tensor_slices((train_data, train_labels)).shuffle(50000).batch(128)
test_generator = tf.data.Dataset.from_tensor_slices((test_data, test_labels)).batch(128)

Так есть ли хороший способ применить некоторый предварительный процесс к моему набору данных?

Я знаю, ImageDataGenerator в API Keras - это такой простой способ, но я хочу знать, как изображение может обрабатываться в tf.data API тоже.

1 Ответ

1 голос
/ 07 октября 2019

Вот пример того, как вы можете применить эти виды преобразований:

def parse_data_train(image, label):
    # Function that we will use to parse the training data
    image = tf.image.random_crop(image, [WIDTH, HEIGHT, NUM_CHANNELS])
    image = tf.image.random_flip_left_right(image)

    return image, label

def parse_data_val_test(image, label):
    # Function that we will use to parse the validation/test data
    image = tf.image.resize_with_crop_or_pad(image, WIDTH, HEIGHT)

    return image, label


WIDTH, HEIGHT, NUM_CHANNELS = 10, 10, 3
train_data = np.random.rand(100, 32, 32, 3)
train_labels = np.random.rand(100, 10)
test_data = np.random.rand(10, 32, 32, 3)
test_labels = np.random.rand(10, 10)

# Creating the training dataset
train_dataset = tf.data.Dataset.from_tensor_slices((train_data, train_labels))
# Shuffle of the dataset upon creation and shuffle it after each epoch
train_dataset = train_dataset.shuffle(buffer_size=train_data.shape[0], reshuffle_each_iteration=True)
# Apply the transformations on the dataset
train_dataset = train_dataset.map(parse_data_train)
# Create the batches
train_dataset = train_dataset.batch(10)

# Create the test dataset
test_dataset = tf.data.Dataset.from_tensor_slices((test_data, test_labels))
# No need to shuffle since we just validate/test on this dataset
# Apply the transformations for the validation/test dataset
test_dataset = test_dataset.map(parse_data_val_test)
# Create the batches
test_dataset = test_dataset.batch(10)

Подводя итог, я бы предложил опираться на tf.data.Dataset.map(), потому что вы можете легко создавать свои собственные методы, где вы можете сложитьпреобразования, которые вы хотите применить к каждому образцу набора данных.

...