J'essaie de faire l' tensorflow
équivalent de torch.transforms.Resize(TRAIN_IMAGE_SIZE)
, ce qui redimensionne la plus petite dimension d'image TRAIN_IMAGE_SIZE
. Quelque chose comme ça
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)
La réponse simple est ici: Tensorflow : Recadrer la plus grande région carrée centrale de l'image
Mais quand j'utilise la méthode avec tf.data.Dataset.map(transforms)
, je reçois shape=(None,None,3)
de l'intérieur largest_sq_crop(image)
. La méthode fonctionne bien quand je l'appelle normalement.
python
tensorflow2.0
Michael
la source
la source
EagerTensors
ne sont pas disponibles à l'intérieurDataset.map()
, la forme est donc inconnue. Y at-il un travail autour?largest_sq_crop
?Réponses:
J'ai trouvé la réponse. Cela avait à voir avec le fait que ma méthode de redimensionnement fonctionnait bien avec une exécution soignée, par exemple,
tf.executing_eagerly()==True
mais échouait lorsqu'elle était utilisée à l'intérieurdataset.map()
. Apparemment, dans cet environnement d'exécution,tf.executing_eagerly()==False
.Mon erreur était dans la façon dont je déballais la forme de l'image pour obtenir les dimensions pour la mise à l'échelle. L'exécution du graphique Tensorflow ne semble pas prendre en charge l'accès au
tensor.shape
tuple.J'utilisais des dimensions de forme en aval dans ma
dataset.map()
fonction et cela a levé l'exception suivante car elle obtenaitNone
au lieu d'une valeur.Lorsque je suis passé au déballage manuel de la forme
tf.shape()
, tout a bien fonctionné.la source