Python 为什么我训练的keras模型总是输出相同的类?

Python 为什么我训练的keras模型总是输出相同的类?,python,tensorflow,machine-learning,keras,Python,Tensorflow,Machine Learning,Keras,我使用Keras创建了一个模型,并使用EMNIST数据集进行了训练。我有以下代码: 导入模块 import tensorflow as tf from tensorflow import keras import numpy as np import matplotlib.pyplot as plt import tensorflow as tf from tensorflow import keras from keras.models import load_model import tk

我使用Keras创建了一个模型,并使用EMNIST数据集进行了训练。我有以下代码:

导入模块

import tensorflow as tf
from tensorflow import keras
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow import keras
from keras.models import load_model
import tkinter as tk
import pyscreenshot as ImageGrab
import numpy as np
安装数据集

!pip install extra-keras-datasets

from extra_keras_datasets import emnist
(train_images, train_labels), (test_images, test_labels) = emnist.load_data(type='letters')
过程数据

train_images = train_images / 255.0
test_images = test_images / 255.0
创建模型

model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dense(27, activation='softmax')
])

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(train_images, train_labels, epochs=5)
model = load_model('path/model1.h5')
然后,我下载了模型

然后,我有下面的代码,它显示了一个窗口来写一封信,并希望预测它属于什么类

导入模块

import tensorflow as tf
from tensorflow import keras
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow import keras
from keras.models import load_model
import tkinter as tk
import pyscreenshot as ImageGrab
import numpy as np
加载模型

model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dense(27, activation='softmax')
])

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(train_images, train_labels, epochs=5)
model = load_model('path/model1.h5')
函数进行预测

def predict_digit(img):
    img = img.resize((28,28))
    img = img.convert('L')
    img = np.array(img)
    img = img.reshape(1,28,28,1)
    img = img / 255.0
    
    res = model.predict([img])[0]
    return np.argmax(res), max(res)
用户界面代码

class App(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.x = self.y = 0
        
        self.canvas = tk.Canvas(self, width=300, height=300, bg = "white", cursor="cross")
        self.label = tk.Label(self, text="Thinking..", font=("Arial", 48))
        self.classify_btn = tk.Button(self, text = "Recognise", command = self.classify_handwriting) 
        self.button_clear = tk.Button(self, text = "Clear", command = self.clear_all)
        
        self.canvas.grid(row=0, column=0, pady=2, sticky=W, )
        self.label.grid(row=0, column=1,pady=2, padx=2)
        self.classify_btn.grid(row=1, column=1, pady=2, padx=2)
        self.button_clear.grid(row=1, column=0, pady=2)
        
        self.canvas.bind("<B1-Motion>", self.draw_lines)

    def getter(self):
        widget = self.canvas
        x = self.winfo_rootx() + widget.winfo_x()
        y = self.winfo_rooty() + widget.winfo_y()
        x1 = x + widget.winfo_width()
        y1 = y + widget.winfo_height()
        
        im = ImageGrab.grab(bbox=(x,y,x1,y1))
        return im
        
    def clear_all(self):
        self.canvas.delete("all")
        
    def classify_handwriting(self):
        img = self.getter()
        digit, acc = predict_digit(img)
        self.label.configure(text= str(digit)+', '+ str(int(acc*100))+'%')
        
    def draw_lines(self, event):
        self.x = event.x
        self.y = event.y
        r=8
        self.canvas.create_oval(self.x-r, self.y-r, self.x + r, self.y + r, fill='black')
        
app = App()
mainloop()
class应用程序(tk.tk):
定义初始化(自):
tk.tk.\uuuuu初始化(self)
self.x=self.y=0
self.canvas=tk.canvas(self,宽度=300,高度=300,bg=“白色”,cursor=“交叉”)
self.label=tk.label(self,text=“Thinking..”,font=(“Arial”,48))
self.classify\u btn=tk.按钮(self,text=“recognize”,command=self.classify\u手写)
self.button\u clear=tk.button(self,text=“clear”,command=self.clear\u all)
self.canvas.grid(行=0,列=0,pady=2,粘性=W,)
self.label.grid(行=0,列=1,pady=2,padx=2)
自分类网格(行=1,列=1,pady=2,padx=2)
self.button\u clear.grid(行=1,列=0,pady=2)
self.canvas.bind(“,self.draw_线)
def吸气剂(自身):
widget=self.canvas
x=self.winfo_rootx()+widget.winfo_x()
y=self.winfo_rooty()+widget.winfo_y()
x1=x+widget.winfo_width()
y1=y+widget.winfo_height()
im=ImageGrab.grab(bbox=(x,y,x1,y1))
返回即时消息
def清除所有(自身):
self.canvas.delete(“全部”)
def分类_手写(自):
img=self.getter()
数字,acc=预测数字(img)
self.label.configure(text=str(数字)+','+str(int(acc*100))+'%
def绘制线(自身、事件):
self.x=event.x
self.y=event.y
r=8
self.canvas.create_oval(self.x-r,self.y-r,self.x+r,self.y+r,fill='black')
app=app()
mainloop()
然而,每次我试着写一封被预测的信时,它总是显示班级编号17。我错过了什么

此外,我使用以下内容作为本计划的参考:


提前谢谢。

我看到的问题是,对于图像识别模型,您只使用了两个常规密集层。这不会产生足够的可训练参数,使此模型无法工作。因为你正在解决一个涉及图像识别的问题,所以你应该在密集和平坦层之前使用卷积层。二维卷积层的示例:
model.add(Conv2D(64,(3,3),activation='relu'))

这对于任何图像分类问题使用卷积层都不是强制性的。采用这种架构,仅5个历元,模型的准确率就超过90%。