【问题标题】:MNIST classifier fails on non-MNIST digitsMNIST 分类器在非 MNIST 数字上失败
【发布时间】:2020-10-02 02:21:38
【问题描述】:

我刚刚意识到我的 MNIST 数字分类器(一个卷积神经网络)在我自己的手绘数字上非常失败,准确率只有 55% 左右(黑白图像为 50%,白色图像为 60%-黑色图像)。

考虑到工业字符识别软件对全新字符非常准确,结果让我感到相当惊讶。

我能在网上找到的唯一解释是过度拟合,这似乎不太可能,因为我的模型有 98.4% 的测试准确度。另一种解释是 MNIST 数据集并不像人们希望的那样普遍/具有更低的维度,这似乎不太可能。转换为灰度也不是问题(请参阅 Roshin 回答下的 cmets)。

有人愿意看看我的模型并告诉我有什么问题吗?对我自己的角色的测试是在最后一个填充的单元格中。

【问题讨论】:

  • 这是我之前看到的问题。在 MNIST 数据集中,所有数字都位于图像的中心。正因为如此,当我快速训练一个基本模型时,如果数字不在测试数据的中心,模型就会错误地对其进行分类。后来,我尝试了两件事,他们都解决了这个问题。我将测试图像中的数字居中。另一种解决方案:我执行数据增强(翻译方法)以从训练数据中删除过度中心化的数字。
  • 尝试数据增强,如移位、旋转、随机裁剪等。

标签: tensorflow machine-learning neural-network conv-neural-network mnist


【解决方案1】:

问题出在线条上:

# my own hand-drawn characters
with url.urlopen(img) as file:
  x2 = im.imread(file.read())
# average color channels, put in 1-size batch, normalize
x2 = np.array([[[[np.mean(entry)] for entry in row] for row in x2]]) / 255.0

您应该将图像转换为灰度。

# my own hand-drawn characters
with url.urlopen(img) as file:
  pil_im = Image.open(file.read()).convert('L')
  img = np.array(pil_im) / 255.0
# average color channels, put in 1-size batch, normalize

您应该事先从PIL 导入Image 模块,

from PIL import Image

【讨论】:

  • 您的代码给了我一个错误(“嵌入的空字节”),但这不是问题——我已经用np.mean(entry) 转换为灰度。我错了吗?
  • 这可能会出现错误:stackoverflow.com/questions/38979075/…
  • 我尝试了您的建议,但它对相同的分类错误(请参阅更新的笔记本)。就像我说的,我已经在转换为灰度,所以这不是问题。
猜你喜欢
  • 2017-12-02
  • 1970-01-01
  • 2013-09-24
  • 1970-01-01
  • 2016-08-10
  • 2020-12-16
  • 2018-07-04
  • 2018-07-28
  • 2018-02-01
相关资源
最近更新 更多