【问题标题】:Wrong predictions with own mnist-like images错误的预测与自己的类似 mnist 的图像
【发布时间】:2022-01-09 09:58:09
【问题描述】:

尝试使用简单的架构来识别手写数字。测试给出 0.9723 的准确度

import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow import keras
from tensorflow.keras.layers import Dense, Flatten
from sklearn.model_selection import train_test_split


# data split
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# normalizing
x_train = x_train / 255
x_test = x_test / 255

y_train_cat = keras.utils.to_categorical(y_train, 10)
y_test_cat = keras.utils.to_categorical(y_test, 10)

# creating model
model = keras.Sequential([
    Flatten(input_shape=(28, 28, 1)),
    Dense(128, activation='relu'),
    Dense(10, activation='softmax')
])

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

x_train_split, x_val_split, y_train_split, y_val_split = train_test_split(x_train, y_train_cat, test_size=0.2)

model.fit(
    x_train_split,
    y_train_split,
    batch_size=32,
    epochs=6,
    validation_data=(x_val_split, y_val_split))

# saving model
model.save('mnist_model.h5')

# test
model.evaluate(x_test, y_test_cat)

但是,当我尝试识别自己的数字(0 到 9)时,其中一些无法正确识别: numbers and prediction above

尝试使用此代码:

from keras.models import load_model
from tensorflow.keras.datasets import mnist
from tensorflow import keras
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image

model = load_model('mnist_model.h5')

(x_train, y_train), (x_test, y_test) = mnist.load_data()

x_test = x_test / 255
y_test_cat = keras.utils.to_categorical(y_test, 10)

model.evaluate(x_test, y_test_cat)

filenames = [
    'project_imgs/0.png', 'project_imgs/1.png', 'project_imgs/2.png', 'project_imgs/3.png',
    'project_imgs/4.png', 'project_imgs/5.png', 'project_imgs/6.png', 'project_imgs/7.png',
    'project_imgs/8.png', 'project_imgs/9.png'
             ]

data = []
data_eds = []

for file in filenames:
    picture = Image.open(file).convert('L')
    pic_r = picture.resize((28, 28))
    pic = np.array(pic_r)
    pic = 255 - pic
    pic = pic / 255
    pic_eds = np.expand_dims(pic, axis=0)

    data.append(pic)
    data_eds.append(pic_eds)

plt.figure(figsize=(10, 5))
for i in range(10):
    ax = plt.subplot(2, 5, i+1)
    ax.set_title(f'Looks like {np.argmax(model.predict(data_eds[i]))}')

    plt.xticks([])
    plt.yticks([])

    plt.imshow(data[i], cmap=plt.cm.binary)
plt.show()

我不明白为什么会这样。会不会是图片的原因?我已经看到 MNIST 生成的图像更黑,不像我的那样灰。还是因为与这个 28x28 正方形相关的数字的大小?

【问题讨论】:

    标签: python tensorflow keras mnist


    【解决方案1】:

    这可能是因为数据集的差异。 MNIST 数字通常比您自己的数字具有更多纯色和更粗体。这是我唯一想到的,因为您的代码看起来不错。

    解决方案是将您的数字更改为与 MNIST 数字更相似,或者使用您的数字创建足够大的数据集以使用它们训练模型。

    【讨论】:

    • 你是对的。我试图将我的图像近似为 mnist 图像并且它有效
    【解决方案2】:

    在加载图像后处理图像时,您正在使用以下代码行:

    pic = 255 - pic
    

    训练步骤中不存在此预处理步骤。也许这就是为什么大多数图像被错误分类的原因。

    【讨论】:

    • MNIST 数字在白色背景上是黑色的,当我加载我的数字时,它们在黑色背景上显示为白色。我反转正确识别。没有这个模型只能看到“3”
    • 如果是这种情况,您是否也可以尝试反转训练图像并用这些图像训练神经网络?
    【解决方案3】:

    好的,关键是处理图像。我编写的代码能够识别出 10 个图像中的 9 个,但仍然无法识别数字“9”。

    for file in filenames:
        img = Image.new('RGBA', size=(28, 28), color='white')
        number = Image.open(file).convert('RGBA')
        number_res = number.resize((20, 20), resample=Image.ANTIALIAS)\
            .rotate(6, expand=1, fillcolor='white')
        img.paste(number_res, (4, 4))
        img = img.convert('L')
        img = np.array(img)
        img = 255 - img
        img = img / 255
        img_eds = np.expand_dims(img, axis=0)
    
        data.append(img)
        data_eds.append(img_eds)
    

    然后我在 Photoshop 中使用它,它成功了。据我了解,“9”没有被识别出来,因为尾巴末端和环之间有相当大的水平距离。因此,不可能将数字放在中心。 最终结果:

    【讨论】:

      猜你喜欢
      • 2019-06-28
      • 2018-05-28
      • 1970-01-01
      • 2023-03-10
      • 2019-10-19
      • 2017-03-03
      • 2016-12-01
      • 1970-01-01
      • 2015-06-21
      相关资源
      最近更新 更多