#python #tensorflow
#python #tensorflow
Вопрос:
Я пытаюсь увеличить (произвольно обрезать) изображения при их загрузке с использованием набора данных tensorflow. Я получаю эту ошибку при вызове метода tf.image.random_crop в отображаемой функции:
ValueError: Dimensions must be equal, but are 4 and 3 for '{{node random_crop/GreaterEqual}} = GreaterEqual[T=DT_INT32](random_crop/Shape, random_crop/size)' with input shapes: [4], [3].
Чтобы воспроизвести ошибку, просто поместите несколько изображений png в каталог:
./img/class0/
Затем запустите этот код:
import os
import tensorflow as tf
train_set_raw = tf.keras.preprocessing.image_dataset_from_directory('./img',label_mode=None,validation_split=None,batch_size=32)
def augment(tensor):
tensor = tf.cast(x=tensor, dtype=tf.float32)
tensor = tf.divide(x=tensor, y=tf.constant(255.))
tensor = tf.image.random_crop(value=tensor, size=(256, 256, 3))
return tensor
train_set_raw = train_set_raw.map(augment).batch(32)
Если я явно укажу размер пакета,
tensor = tf.image.random_crop(value=tensor, size=(32,256, 256, 3))
ошибка может быть отсортирована. Однако, если вы попытаетесь сопоставить модель с набором данных, созданным с фиксированным размером пакета, вы получите сообщение об ошибке:
tensorflow.python.framework.errors_impl.InvalidArgumentError: assertion failed: [Need value.shape >= size, got ] [1 256 256 3] [32 256 256 3]
[[{{node random_crop/Assert/Assert}}]]
Ответ №1:
Попробуйте использовать размер пакета 1:
tensor = tf.image.random_crop(value=tensor, size=(1,256, 256, 3))
Но я не думаю, что вам следует смешивать высокоуровневые загрузчики данных с более низким уровнем tf.data.Dataset
. Попробуйте использовать только последнее.
import tensorflow as tf
image_dir = r'C:UsersuserPictures'
files = tf.data.Dataset.list_files(image_dir '\*jpg')
def load(filepath):
image = tf.io.read_file(filepath)
image = tf.image.decode_image(image)
return image
ds = files.map(load)
def augment(tensor):
tensor = tf.cast(x=tensor, dtype=tf.float32)
tensor = tf.divide(x=tensor, y=tf.constant(255.))
tensor = tf.image.random_crop(value=tensor, size=(100, 100, 3))
random_target = tf.random.uniform((1,), dtype=tf.int32, maxval=2)
return tensor, random_target
train_set_raw = ds.map(augment).batch(32)
model = tf.keras.Sequential([
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(8, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
model.compile(loss='binary_crossentropy', optimizer='adam')
history = model.fit(train_set_raw)