【问题标题】:Mnist dataset pattern recognition accuracyMnist 数据集模式识别精度
【发布时间】:2017-02-14 19:11:11
【问题描述】:

我对 matlab 完全陌生,这是我的第一个项目。 Mnist 有 60000 张介于 0 和 9 之间的图片用于训练,1000 张图片用于测试。我所做的是尝试通过使用 mean.then 为所有这 10 个类(0 到 9)制作一个模式,然后我使用欧几里得距离进行识别。这很简单,但准确度真的很低。 我不知道我的问题到底出在哪里,要回馈这个百分比的准确率。准确率:1.73%

这是我的代码 为我们全班找到 10 种模式:

root = 'F:\matlab\ex1\exercise-EquivaliencOfL2DistanceAndDotProduct\dataset';

fn = strcat (root, '\MnistTrainX.mat');
load (fn);

fn = strcat (root, '\MnistTrainY.mat');
load (fn);

weights = zeros (10, 784);
b = zeros (10, 1);

im=reshape(MnistTrainX(5,:),[28 ,28]);
imshow(im,[]);
imshow(im',[]);

for c=1 : 10
    idx=find(MnistTrainY == c-1);
   weights (c,:)=mean( MnistTrainX(idx,:));
end

trainAccuray = ComputeInnerProductAccuracy(weights,b, MnistTrainX,MnistTrainY);
display(trainAccuray);

fn = strcat (root, '\MnistTestX.mat');
load (fn);

fn = strcat (root, '\MnistTestY.mat');
load (fn);


testAccuray  = ComputeInnerProductAccuracy(weights, b, MnistTestX, MnistTestY);
display(testAccuray);

这是准确度函数

function [acc]=ComputeInnerProductAccuracy(weights, b, X, Y)

n = size(X, 1);
minmat = zeros (60000, 2);
endmat = zeros (60000, 10);
m = size(X);
a=0;
for i=1 : n
    for j=1 : 10
        endmat(i,j)=sum((X(i,:)-(weights(j,:))).^2,2);
    end

    [minmat(i,1) ,minmat(i,2)]= min(endmat(i,:));
    if minmat(i,2)== Y(i)
        a=a+1;
    end

end
acc=(a*100)/60000;
end

【问题讨论】:

  • 计算每个数字的平均值作为要使用的代表数字并找到查询数字和这些代表数字中的每一个之间的内积以进行分类是一个非常糟糕的主意。如果您查看每个单独的数字(即所有 1、2 等),它们看起来都非常不同。找到所有这些数字的平均值并不能很好地表示每个数字在实践中的样子。顺便说一句,您的代码没有计算内积。它正在计算欧几里得距离。
  • @rayryeng 是的,你完全正确,我知道,但这是我们的练习,我们的老师通过这种方式获得了 82% 的准确率。我认为这种低准确度可能来自我的功能。
  • ِِ亲爱的@rayryeng 提醒我请你帮我解决另一个问题?
  • 当然。我能提供什么帮助?
  • @rayryeng 谢谢你重播我。我在 30 分钟前解决了它:D,我不认为我可以自己让它工作,但它工作得很好,虽然 8 小时后,我使用 kmean 来提高我的准确性。我希望这个提及不会打扰您。

标签: matlab machine-learning classification pattern-recognition mnist


【解决方案1】:

您的代码大部分是正确的,尽管效率很低。我不会花时间让它更有效率,因为有很多领域需要解决。相反,我会专注于哪里出了问题。代码有两个问题。首先是当你找到哪个数字的距离最短时:

[minmat(i,1) ,minmat(i,2)]= min(endmat(i,:));

请注意,min 的第二个输出会生成最小值从索引 1 开始的位置。 Y 中的类值应包含 0 到 9,但在您的情况下 min 的输出索引是从 1 到 10。输出最小索引和相应的类值彼此相差 1,这可能是原因为什么你有这么差的准确性。

因此,您必须先从 minmat(i, 2) 中减去 1,然后再检查最小标签是否确实是基本事实……或者您可以在检查时简单地将 Y(i) 加 1:

[minmat(i,1) ,minmat(i,2)]= min(endmat(i,:));
if minmat(i,2)== Y(i)+1 % Change
    a=a+1;
end

不正确的第二件事是“内积”函数(实际上您正在计算欧几里得距离......但让我们把它放在一边作为这个答案)假设始终有 60000 个输入但您的测试集没有这么多输入。这将在您的训练数据上正常工作,但它会报告您的测试数据的错误准确性。确保将函数中的所有 60000 实例更改为 n。您已经在代码中创建了这个变量,并确定有多少输入。

【讨论】:

  • 是的。你的权利我对矩阵维度感到很困惑,因为它们很大,所以我没有注意索引部分。愚蠢的错误。谢谢。
  • 嘿嘿。没问题。不过我很好奇。现在您已经更正了比较,准确度是多少?
  • 我的测试准确率仍然很低;我的意思是训练准确率为 85%,测试为 13.5% 我可以做些什么来改进它吗?
  • 是的。您的内积函数假设输入有 60000 个样本,而您的测试集只有 1000 个。因此,报告的准确性不正确,因为您使用了错误的总输入数。这是函数中硬编码变量的问题,因为它不允许动态行为。更改函数,使其适应输入的总数,而不是 60000。您已经有一个 n 变量来捕获它。只需在代码中使用 60000 的所有区域中将 60000 更改为 n。
  • 哇!!!!你的权利我真的不知道这些小东西可以提高准确性。你今天教给我有用的东西。谢谢你
猜你喜欢
  • 1970-01-01
  • 2019-04-11
  • 2019-03-21
  • 2014-08-02
  • 2021-10-05
  • 2021-08-16
  • 2020-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多