Как настроить tf.data.Dataset для изображений переменного размера? - PullRequest
1 голос
/ 30 марта 2020

Я настраиваю конвейер данных изображения на Tensorflow 2.1. Я использую набор данных с изображениями RGB переменных форм (h, w, 3) и не могу найти способ заставить его работать. Я получаю следующую ошибку при вызове tf.data.Dataset.batch():

tensorflow.python.framework.errors_impl.InvalidArgumentError: Cannot batch tensors with different shapes in component 0. First element had shape [256,384,3] and element 3 had shape [160,240,3]

Я нашел метод padded_batch, но я не хочу, чтобы мои изображения были дополнены до той же формы.

РЕДАКТИРОВАТЬ:

Я думаю, что я нашел небольшой обходной путь с помощью функции tf.data.experimental.dense_to_ragged_batch (которая преобразовывает представление плотного тензора в рваный).

В отличие от tf.data.Dataset.batch, входные элементы для пакетирования могут иметь разные формы, и каждая партия будет кодироваться как tf.RaggedTensor

Но тогда у меня есть другой проблема. Мой набор данных содержит изображения и соответствующие им ярлыки. Когда я использую функцию следующим образом:

ds = ds.map(
      lambda x: tf.data.experimental.dense_to_ragged_batch(batch_size)
  ) 

я получаю следующую ошибку, потому что она пытается сопоставить функцию со всем набором данных (таким образом, с изображениями и метками), что невозможно, потому что это может быть только применяется к одному единственному тензору (не к 2).

TypeError: <lambda>() takes 1 positional argument but 2 were given

Есть ли способ указать, к какому элементу из двух я хочу применить преобразование?

1 Ответ

0 голосов
/ 30 марта 2020

Если вы не хотите изменять размер своих изображений, вы можете использовать только размер пакета 1 и не больше этого размера. Таким образом, вы можете тренировать свою модель по одному изображению за раз. Ошибка, о которой вы сообщили, ясно говорит о том, что вы используете пакет размером больше 1 и пытаетесь поместить в пакет два изображения разной формы / размера. Вы можете изменить размер изображения до фиксированной формы (или дополнить изображения) или использовать размер пакета 1 следующим образом:

my_data = tf.data.Dataset(....) # with whatever arguments you use here
my_data = my_data.batch(1)
...