ds_train имеет форму (2, 224, 224, 3) вместо (None, 224, 224, 3)

#python #image #tensorflow #matplotlib #keras

#python #изображение #тензорный поток #matplotlib #keras

Вопрос:

Я создал свой собственный пользовательский набор данных (с 2 классами) со следующим кодом:

 import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.preprocessing.image import ImageDataGenerator

import matplotlib.pyplot as plt
ds_train = tf.keras.preprocessing.image_dataset_from_directory(
        'C:/Users/mydir/Source_Images/',
        labels = 'inferred', # from subfolders in alphabetical order
        label_mode = "int",
        class_names = ["CVS", "No_CVS"],
        color_mode = 'rgb',
        batch_size = 2,
        image_size = (224, 224),
        shuffle = True, # randomized order of images
        seed = 123, #set the seed if  train, valid images are the same when you run again   
        validation_split = 0.1,
        subset = "training"
        )
 

df_train приводит к:

 <BatchDataset shapes: ((None, 224, 224, 3), (None,)), types: (tf.float32, tf.int32)>
 

Теперь я хочу визуализировать свои данные, просмотрев 9 изображений:

 for i, (image, label) in enumerate(ds_train.take(9)):
    ax = plt.subplot(3, 3, i   1)
    plt.imshow(image.numpy().astype("uint8"))
    plt.axis("off")
 

Однако я получаю следующую ошибку:

строка 61, в

 plt.imshow(image.numpy().astype("uint8"))
TypeError: Invalid shape (2, 224, 224, 3) for image data
 

Я ищу способ решить эту проблему и иметь возможность отображать мои изображения с помощью matplotlib.

Редактировать:

Что еще более важно, кажется, что данные данных также не могут быть использованы при обучении модели, поскольку я получаю эту ошибку:

    ValueError: Input 0 is incompatible with layer EfficientNet: expected shape=(None, 224, 224, 3), found shape=(2, None, 224, 224, 3)
 

После запуска примера кода Keras, который я нашел здесь (где я создал ds_train с image_dataset_from_directory помощью функции вместо tdsf.load() функции).

Поэтому я думаю, что что-то идет не так в том, как я создал ds_train. Любые разрешения приветствуются.

Ответ №1:

Кажется, что вы покидаете batch_size in, когда вы делаете:

 plt.imshow(image.numpy().astype("uint8"))
 

С вашим исходным кодом вы все равно не сможете увидеть 9 изображений из-за вашего batch_size . Я думаю, все будет хорошо, если вы сделаете это так:

Никаких ошибок не должно быть, например TypeError: Invalid shape... :

 plt.imshow(image[i].numpy().astype("uint8"))
 

Кроме того, вы можете сделать следующее, чтобы увидеть batch_size:

 for img_batch_size, labels_batch_size in train_df:
  print(img_batch_size.shape)
  print(labels_batch_size.shape)
 

Для вашего случая img_batch_size.shape следует вывести (2,224,224,3), где этот кортеж соответствует тензору изображения.

Для input_shape проблемы вам нужно добавить свою модель, чтобы мы могли видеть, что не так input_shape .