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