Я пытаюсь сделать tensorflow
эквивалент torch.transforms.Resize(TRAIN_IMAGE_SIZE)
, который изменяет размер наименьшего размера изображения до TRAIN_IMAGE_SIZE
. Что-то вроде этого
def transforms(filename):
parts = tf.strings.split(filename, '/')
label = parts[-2]
image = tf.io.read_file(filename)
image = tf.image.decode_jpeg(image)
image = tf.image.convert_image_dtype(image, tf.float32)
# this doesn't work with Dataset.map() because image.shape=(None,None,3) from Dataset.map()
image = largest_sq_crop(image)
image = tf.image.resize(image, (256,256))
return image, label
list_ds = tf.data.Dataset.list_files('{}/*/*'.format(DATASET_PATH))
images_ds = list_ds.map(transforms).batch(4)
Простой ответ здесь: Tensorflow: Обрезать самую большую центральную квадратную область изображения
Но когда я использую метод с tf.data.Dataset.map(transforms)
, я получаю shape=(None,None,3)
изнутри largest_sq_crop(image)
. Метод работает нормально, когда я его называю нормально.
python
tensorflow2.0
Майкл
источник
источник
EagerTensors
они недоступны внутри,Dataset.map()
поэтому форма неизвестна. есть ли обходной путь?largest_sq_crop
?Ответы:
Я нашел ответ. Это было связано с тем, что мой метод изменения размера работал нормально с нетерпеливым выполнением, например,
tf.executing_eagerly()==True
но не работал при использовании внутриdataset.map()
. Видимо, в этой среде исполненияtf.executing_eagerly()==False
.Моя ошибка заключалась в том, что я распаковывал форму изображения, чтобы получить размеры для масштабирования. Кажется, что выполнение графика Tensorflow не поддерживает доступ к
tensor.shape
кортежу.Я использовал размеры формы вниз по течению в моей
dataset.map()
функции, и она вызвала следующее исключение, потому что она получалаNone
вместо значения.Когда я переключился на ручную распаковку формы
tf.shape()
, все работало нормально.источник