Как получить доступ к тензорной форме внутри функции карты
Мне нужно получить доступ к фигурам изображения для выполнения конвейера увеличения, хотя при доступе через image.shape[0] and image.shape[1]
Я не могу выполнить аугментации, так как он выводит, что мои тензоры имеют форму None.
Связанные вопросы: Как получить доступ к тензорной форме в.map?
Цените, если кто-нибудь может помочь.
parsed_dataset = tf.data.TFRecordDataset(filenames=train_records_paths).map(parsing_fn) # Returns [image,label]
augmented_dataset = parsed_dataset.map(augment_pipeline)
augmented_dataset = augmented_dataset.unbatch()
Отображенная функция
"""
Returns:
5 Versions of the original image: 4 corner crops + a central crop and the respective labels.
"""
def augment_pipeline(original_image,label):
central_crop = lambda image: tf.image.central_crop(image,0.5)
corner_crops = lambda image: tf.image.extract_patches(images=tf.expand_dims(image,0), # Transform image in a batch of single sample
sizes=[1, int(0.5 * image.shape[0]), int(0.5 * image.shape[1]), 1], # 50% of the image's height and width
rates=[1, 1, 1, 1],
strides=[1, int(0.5 * image.shape[0]), int(0.5 * image.shape[1]), 1],
padding="SAME")
reshaped_patches = tf.reshape(corner_crops(original_image), [-1,int(0.5*original_image.shape[0]),int(0.5*original_image.shape[1]),3])
images = tf.concat([reshaped_patches,tf.expand_dims(central_crop(original_image),axis=0)],axis=0)
label = tf.reshape(label,[1,1])
labels = tf.tile(label,[5,1])
return images,labels
2 ответа
После дальнейших исследований я смог справиться с помощью py_func
как предлагается здесь иtf.shape(image)[0]
здесь.
Код:
"""
Returns:
5 Versions of the original image: 4 corner crops + a central crop and the respective labels.
"""
def augment_pipeline(original_image,label):
height = int(tf.shape(original_image)[0].numpy() * 0.5) # 50% of the image's height and width
width = int(tf.shape(original_image)[1].numpy() * 0.5)
central_crop = lambda image: tf.image.central_crop(image,0.5)
corner_crops = lambda image: tf.image.extract_patches(images=tf.expand_dims(image,0), # Transform image in a batch of single sample
sizes=[1, height, width, 1],
rates=[1, 1, 1, 1],
strides=[1, height, width, 1],
padding="SAME")
.
.
.
Затем мы используем py_func
чтобы разрешить доступ к значениям numpy внутри функции карты:
parsed_dataset = tf.data.TFRecordDataset(filenames=train_records_paths).map(parsing_fn) # Returns [image,label]
augmented_dataset = parsed_dataset.map(lambda image,label: tf.py_function(func=augment_pipeline,
inp=[image,label],
Tout=[tf.float32,tf.int64]))
augmented_dataset = augmented_dataset.unbatch()
Каждый объект набора данных повторяется. Теперь объект Dataset может быть либо в пакетной форме, либо в неупакованной форме. Я расскажу, как получить форму их элементов в обоих случаях.
Случай 1. Объект набора данных находится в несвязанной форме.
Метод 1. Потребление его элементов с помощью iter
it = iter(dataset)
element = next(it)
image,label = element
## element is a tuple
Способ 2. с помощью take
element = dataset.take(1)
image,label = element
# element is a tuple
Случай 2. Когда набор данных группируется. Теперь я предполагаю, что набор данных содержит кортежи (изображение, метка)
Метод 1. Использование iter
it = iter(dataset)
batch = next(it)
images,labels = batch
## batch is a tuple check it using type(batch)
Метод 2. Использование дубля
batch = dataset.take(1)
## Note here each element of the dataset is a batch and each batch contains some number of
## (image,label) tuples
batch = next(iter(batch))
images,labels = batch
## batch is again a tuple