resnet训练后,预测报错了,不知道是哪里的问题,怎么解决啊

我用resnet训练后,在预测时,就报错了。不知道是哪里出了问题,怎样解决啊。
下面是我的报错信息截图:

img

img

img

这是出什么问题了,应该怎么更改啊?
下面这是我的整体代码:

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))#读取文件
 
    # 加载测试图片
    img = Image.open(filename)
    # 将图片resize到224x224大小
    img = img.resize((128, 128), Image.ANTIALIAS)
    # 将灰度图转化为RGB模式
    img = img.convert("RGB")
 
    plt.axis('off')  # 去掉坐标轴
    plt.imshow(img)
    # 归一化
    img1 = np.array(img) / 255.
    # 将图片增加一个维度,目的是匹配网络模型
    img1 = (np.expand_dims(img1, 0))
    # 将预测结果转化为概率值
    result = np.squeeze(model.predict(img1))
    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()


  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7482245
  • 你也可以参考下这篇文章:数学原理解释resnet缓解梯度弥散问题
  • 除此之外, 这篇博客: ResNet详解:ResNet到底在解决什么问题?中的 2、网络退化的原因 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 由于反向传播算法中的链式法则,如果层层之间的梯度均在(0,1)之间,层层缩小,那么就会出现梯度消失。反之,如果层层传递的梯度大于1,那么经过层层扩大,就会出现梯度爆炸。所以,简单的堆叠层将不可避免的出现网络退化的现象。

    虽然梯度消失/爆炸是网络隐藏层太深所导致的,但是在论文中,已经说了这问题主要通过标准化初始化和中间规范化层来解决。所以网络退化并不是因为梯度消失/爆炸导致的,那网络退化问题到底是由什么导致的呢?另一篇论文给出了答案:The Shattered Gradients Problem: If resnets are the answer, then what is the question?

    大意是神经网络越来越深的时候,反传回来的梯度之间的相关性会越来越差,最后接近白噪声。因为我们知道图像是具备局部相关性的,那其实可以认为梯度也应该具备类似的相关性,这样更新的梯度才有意义,如果梯度接近白噪声,那梯度更新可能根本就是在做随机扰动。

  • 您还可以看一下 唐宇迪老师的面向医学领域的深度学习项目实战课程中的 Resnet网络架构原理分析小节, 巩固相关知识点