Próbuję zrobić tensorflow
odpowiednik torch.transforms.Resize(TRAIN_IMAGE_SIZE)
, który zmienia rozmiar najmniejszego wymiaru obrazu TRAIN_IMAGE_SIZE
. Coś takiego
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)
Prosta odpowiedź jest tutaj: Tensorflow: Przytnij największy centralny kwadratowy obszar obrazu
Ale kiedy używam metody z tf.data.Dataset.map(transforms)
, dostaję się shape=(None,None,3)
od środka largest_sq_crop(image)
. Metoda działa dobrze, gdy nazywam ją normalnie.
python
tensorflow2.0
Michał
źródło
źródło
EagerTensors
nie są one dostępne,Dataset.map()
więc kształt jest nieznany. Czy jest w pobliżu praca?largest_sq_crop
?Odpowiedzi:
Znalazłem odpowiedź Miało to związek z faktem, że moja metoda zmiany rozmiaru działała dobrze przy szybkim wykonywaniu, np.
tf.executing_eagerly()==True
Nie powiodła się, gdy została użyta wewnątrzdataset.map()
. Najwyraźniej w tym środowisku wykonawczymtf.executing_eagerly()==False
.Mój błąd polegał na tym, że rozpakowywałem kształt obrazu, aby uzyskać wymiary do skalowania. Wydaje się, że wykonywanie wykresu Tensorflow nie zapewnia dostępu do
tensor.shape
krotki.Korzystałem z wymiarów kształtu w dalszej części mojej
dataset.map()
funkcji i zwrócił on następujący wyjątek, ponieważ otrzymywałNone
zamiast wartości.Kiedy przełączyłem się na ręczne rozpakowywanie kształtu
tf.shape()
, wszystko działało dobrze.źródło