Как случайным образом обрезать немаркированный набор данных tensorflow? Ошибка значения: размеры должны быть равны, но равны 4 и 3

#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)