Ich versuche , das zu tun tensorflow
Äquivalent torch.transforms.Resize(TRAIN_IMAGE_SIZE)
, das die die Größe kleinsten zu Bilddimension TRAIN_IMAGE_SIZE
. Etwas wie das
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)
Die einfache Antwort lautet hier: Tensorflow : Beschneidet den größten zentralen quadratischen Bereich des Bildes
Aber wenn ich die Methode mit benutze tf.data.Dataset.map(transforms)
, komme ich shape=(None,None,3)
von innen largest_sq_crop(image)
. Die Methode funktioniert gut, wenn ich sie normal aufrufe.
python
tensorflow2.0
Michael
quelle
quelle
EagerTensors
nicht verfügbar sind,Dataset.map()
sodass die Form unbekannt ist. Gibt es eine Problemumgehung?largest_sq_crop
?Antworten:
Ich habe die Antwort gefunden. Es hatte damit zu tun, dass meine Größenänderungsmethode bei eifriger Ausführung gut funktionierte, z. B.
tf.executing_eagerly()==True
fehlschlug, wenn sie innerhalb verwendet wurdedataset.map()
. Anscheinend in dieser Ausführungsumgebungtf.executing_eagerly()==False
.Mein Fehler lag in der Art und Weise, wie ich die Form des Bildes entpackte, um Abmessungen für die Skalierung zu erhalten. Die Ausführung von Tensorflow-Diagrammen scheint den Zugriff auf das
tensor.shape
Tupel nicht zu unterstützen .Ich habe in meiner
dataset.map()
Funktion nachgeschaltete Formabmessungen verwendet, und es wurde die folgende Ausnahme ausgelöst, daNone
anstelle eines Werts ein Wert angezeigt wurde.Als ich zum manuellen Auspacken der Form überging
tf.shape()
, funktionierte alles einwandfrei.quelle