我想检查我构建的模型如何预测图像。数据集由很多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
我尝试过更改图层,我认为问题出在我选择的图片上,我尝试过更改它的格式但没有任何效果。我猜分层可能有问题。
这似乎是与输入大小有关的问题。
我建议添加一个输入层,因为它使代码和模型更容易理解并且更安全:
...
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)
])
...