Tensorflow ValueError:“顺序”层的输入 0 与该层不兼容:预期形状=(无,180,180,3),发现形状=(无,180,3)

问题描述 投票:0回答:1

我想检查我构建的模型如何预测图像。数据集由很多256x256 RGB图片组成。问题本身出现在

model.predict()
函数中(模型创建没有问题)。

import matplotlib.pyplot as plt
import numpy as np
import os
import PIL
import tensorflow as tf
import cv2

from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.models import Sequential
import pathlib
img_height=180
img_width=180
image=cv2.imread("C:\\anImage\\c000b634560ef3c9211cbf9e08ebce74.jpg")
dimensions = (img_height, img_width)
image = cv2.resize(image, (180,180))
image = np.asarray(image).astype('float32')
print(image.ndim)
valid_dir=pathlib.Path("C:\\diseases\\valid")
data_dir="C:\\diseases\\train"
data_dir=pathlib.Path(data_dir)
image_count = len(list(data_dir.glob('*/*.jpg')))
#grapehealthy = list(data_dir.glob('Grape___healthy/*'))
#print(grapehealthy[0])
#PIL.Image.open(str(grapehealthy[0]))
#print(image_count)
#print(image_count)
# Training split
train_ds = tf.keras.utils.image_dataset_from_directory(
    data_dir,
    validation_split=0.2,
    subset="training",
    seed=123,
    image_size=(180, 180),
    batch_size=32)
print(train_ds)
#Validation split
val_ds = tf.keras.utils.image_dataset_from_directory(
    valid_dir,
    validation_split=0.2,
    subset="validation",
    seed=123,
    image_size=(180,180),
    batch_size=32)
class_names = train_ds.class_names
num_classes = len(class_names)

model = Sequential([
    layers.Rescaling(1./255 ),
    layers.Conv2D(16, 3, padding='same', activation='relu'),
    layers.MaxPooling2D(),
    layers.Conv2D(32, 3, padding='same', activation='relu'),
    layers.MaxPooling2D(),
    layers.Conv2D(64, 3, padding='same', activation='relu'),
    layers.MaxPooling2D(),
    layers.Flatten(),
    layers.Dense(128, activation='relu'),
    layers.Dense(num_classes)
])
model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(
                  from_logits=True),
              metrics=['accuracy'])
model.build((None,180,180,3))
model.summary()
epochs=1
history = model.fit(
  train_ds,
  validation_data=val_ds,
  epochs=epochs
)
model.predict(image)

输出:

Connected to pydev debugger (build 231.9225.15)
2023-11-26 16:01:45.723637: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.
To enable the following instructions: SSE SSE2 SSE3 SSE4.1 SSE4.2 AVX AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.
Backend QtAgg is interactive backend. Turning interactive mode on.
(180, 180, 3)
Traceback (most recent call last):
  File "C:\Users\Андрей\PycharmProjects\pythonProject1\venv\Lib\site-packages\keras\src\utils\traceback_utils.py", line 70, in error_handler
    raise e.with_traceback(filtered_tb) from None
  File "C:\Users\A4F7~1\AppData\Local\Temp\__autograph_generated_file7nlcn92p.py", line 15, in tf__predict_function
    retval_ = ag__.converted_call(ag__.ld(step_function), (ag__.ld(self), ag__.ld(iterator)), None, fscope)
    ^^^^^
ValueError: in user code:

    File "C:\Users\Андрей\PycharmProjects\pythonProject1\venv\Lib\site-packages\keras\src\engine\training.py", line 2416, in predict_function  *
        return step_function(self, iterator)
    File "C:\Users\Андрей\PycharmProjects\pythonProject1\venv\Lib\site-packages\keras\src\engine\training.py", line 2401, in step_function  **
        outputs = model.distribute_strategy.run(run_step, args=(data,))
    File "C:\Users\Андрей\PycharmProjects\pythonProject1\venv\Lib\site-packages\keras\src\engine\training.py", line 2389, in run_step  **
        outputs = model.predict_step(data)
    File "C:\Users\Андрей\PycharmProjects\pythonProject1\venv\Lib\site-packages\keras\src\engine\training.py", line 2357, in predict_step
        return self(x, training=False)
    File "C:\Users\Андрей\PycharmProjects\pythonProject1\venv\Lib\site-packages\keras\src\utils\traceback_utils.py", line 70, in error_handler
        raise e.with_traceback(filtered_tb) from None
    File "C:\Users\Андрей\PycharmProjects\pythonProject1\venv\Lib\site-packages\keras\src\engine\input_spec.py", line 298, in assert_input_compatibility
        raise ValueError(

    ValueError: Input 0 of layer "sequential" is incompatible with the layer: expected shape=(None, 180, 180, 3), found shape=(None, 180, 3)

python-BaseException

Process finished with exit code 1

我尝试过更改图层,我认为问题出在我选择的图片上,我尝试过更改它的格式但没有任何效果。我猜分层可能有问题。

python tensorflow deep-learning conv-neural-network
1个回答
0
投票

这似乎是与输入大小有关的问题。

我建议添加一个输入层,因为它使代码和模型更容易理解并且更安全:

...
img_height=180
img_width=180
channels=3
model = Sequential([
    layers.InputLayer(input_shape=(img_height, img_width, channels)),
    layers.Rescaling(1./255 ),
    layers.Conv2D(16, 3, padding='same', activation='relu'),
    layers.MaxPooling2D(),
    layers.Conv2D(32, 3, padding='same', activation='relu'),
    layers.MaxPooling2D(),
    layers.Conv2D(64, 3, padding='same', activation='relu'),
    layers.MaxPooling2D(),
    layers.Flatten(),
    layers.Dense(128, activation='relu'),
    layers.Dense(num_classes)
])
...
© www.soinside.com 2019 - 2024. All rights reserved.