我的代码在预测时无法预测,报错位置是:yuceceshi = model.predict(img1)
下面是我的报错信息:
import tkinter as tk
import tensorflow as tf
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import numpy as np
from tkinter import *
import tkinter.filedialog # 注意次数要将文件对话框导入
from PIL import Image
from tensorflow.python.keras import models, layers
def ResNet_yuce():
global e1, pred, root, predict_class, k
name_dict = {"Uninfected": 0, "Parasitized": 1}
fig = plt.figure(figsize=(2, 2), dpi=100)
# 从本地选择一个文件,并返回文件的目录
# filenames = tkinter.filedialog.askopenfile()#形成一共io流 的文件名称
filename = tk.filedialog.askopenfilename(title=u'加载图片', initialdir=(())) # 只保留文件名和后缀
print(filename)
model_save_path = './ResNet50_test_tuxiangzengqiang_Skin_test.ckpt'
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(), # Flatten-变成一维数组
tf.keras.layers.Dense(128, activation='relu'), # relu函数可以解决 梯度消失问题 是线性的
tf.keras.layers.Dense(2, activation='softmax')]) # 2个类所以2个神经元 softmax只用在最后一层 可以让最后输出的概率在0-1之间
model.load_weights((model_save_path))#读取文件
# models = load_model("./ResNet50_test_tuxiangzengqiang_Skin_test.ckpt")
# 加载测试图片
img = Image.open(filename)
# 将图片resize到224x224大小
img = img.resize((128, 128), Image.ANTIALIAS)
# 将灰度图转化为RGB模式
img = img.convert("L")
plt.axis('off') # 去掉坐标轴
plt.imshow(img)
# 归一化
img1 = np.array(img) / 255.
# 将图片增加一个维度,目的是匹配网络模型
img1 = (np.expand_dims(img1, 0))
print(img1)
# 将预测结果转化为概率值
yuceceshi = model.predict(img1)
print(yuceceshi)
result = np.squeeze(yuceceshi)
print(result)
predict_class = np.argmax(result)
# pred = tf.argmax(result, axis=1)#求最大值得出最后识别出来的数
# print(inverse_dict[int(predict_class)],result[predict_class])
# 将预测的结果打印在图片上面
# plt.title([inverse_dict[int(predict_class)],result[predict_class]])
print(result)
result = np.argmax(result[0]) # 取出预测结果中概率最大的元素索引值
for k, v in name_dict.items(): # 将类别由数字转换为名称
if result == v: # 如果预测结果等于v, 打印出名称
print("预测结果:", k) # 打印出名称
pred = "预测结果:" + k
e1 = tk.Label(root, text=pred, font=('Arial', 16)) # 显示预测结果
e1.place(x=100, y=370)
canvas = FigureCanvasTkAgg(fig, master=root) # 渲染器 在画布上放置图片
canvas.draw()
canvas.get_tk_widget().place(x=100, y=150)
def picture():
global root
root = Tk()
root.wm_title("细胞图像疟疾检测")
root.geometry('1000x650')
bt = tk.Button(root, text="ResNet50", width=10, command=ResNet_yuce)
bt.place(x=210, y=90)
root.mainloop()
if __name__ == '__main__':
picture()
可能是由于模型输入的形状与输入的图像形状不匹配导致的
print(model.input_shape)
print(img1.shape)
如果两个形状不匹配,请确保将输入图像的形状调整为模型的输入形状。
根据您提供的代码,可能有以下问题导致无法预测:
模型没有编译。在您的代码中,您定义了一个包含输入层、两个全连接层和输出层的神经网络,但您没有编译该模型。您需要使用 model.compile()
函数来编译您的模型并指定损失函数、优化器和评估指标。例如,如果您的目标是二分类,您可以使用 binary_crossentropy
作为损失函数、Adam
作为优化器,并选择 accuracy
作为评估指标。
图像的尺寸不匹配。在您的代码中,您将输入图像的大小调整为 (128, 128)
,但您的模型中的输入层期望输入大小为 (None, 224, 224, 3)
。您需要将输入图像的大小调整为与模型期望的大小相同。
输入图像的通道数不匹配。在您的代码中,您将灰度图像转换为 RGB 模式,但您的模型中的输入层期望输入大小为 (None, 224, 224, 3)
,其中 3 表示 RGB 通道。因此,您需要将灰度图像转换为 RGB 图像并将其通道数设置为 3。
预测结果中的概率值不是您期望的形状。在您的代码中,您将预测结果压缩为一个一维数组,但您的模型的输出形状应该是 (None, num_classes)
,其中 num_classes
是您的模型可以预测的类别数。您需要检查您的模型的输出形状,并相应地调整您的预测结果的形状。
您可以检查并尝试解决这些问题,以便您的代码可以成功预测。