Mnist 数据集模式识别准确率
Mnist dataset pattern recognition accuracy
我是 matlab 的新手,这是我的第一个项目。 Mnist 有 60000 张 0 到 9 的图片用于训练,1000 张图片用于测试。我所做的是尝试通过使用 mean.then 来为所有这 10 class(0 到 9)制作一个模式,我使用欧氏距离进行识别。这很简单,但准确率真的很低。
我不知道我的问题到底在哪里,无法让我返回这个百分比的准确率。准确率:1.73%
这是我的代码
为我们所有 class:
找到 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
您的代码大部分是正确的,但效率很低。我不会花时间让它更有效率,因为有很多领域需要解决。相反,我会专注于错误的地方。代码有两处错误。首先是当你找到哪个数字的距离最短时:
[minmat(i,1) ,minmat(i,2)]= min(endmat(i,:));
请注意,min
的第二个输出生成最小值所在的位置 从索引 1 开始。 Y
中的 class 值应包含 0 到 9,但在您的情况下 min
的输出索引是从 1 到 10。输出最小索引和相应的 class 值彼此相差 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
第二个不正确的地方是 "inner product" 函数(实际上你正在计算欧几里德距离......但让我们把它放在一边作为这个答案)假设总是有 60000 个输入您的测试集没有这么多输入。这对您的训练数据会很好地工作,但它会报告您的测试数据的错误准确性。确保将函数中 60000 的所有实例更改为 n
。您已经在代码中创建的这个变量决定了输入的数量。
我是 matlab 的新手,这是我的第一个项目。 Mnist 有 60000 张 0 到 9 的图片用于训练,1000 张图片用于测试。我所做的是尝试通过使用 mean.then 来为所有这 10 class(0 到 9)制作一个模式,我使用欧氏距离进行识别。这很简单,但准确率真的很低。 我不知道我的问题到底在哪里,无法让我返回这个百分比的准确率。准确率:1.73%
这是我的代码 为我们所有 class:
找到 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
您的代码大部分是正确的,但效率很低。我不会花时间让它更有效率,因为有很多领域需要解决。相反,我会专注于错误的地方。代码有两处错误。首先是当你找到哪个数字的距离最短时:
[minmat(i,1) ,minmat(i,2)]= min(endmat(i,:));
请注意,min
的第二个输出生成最小值所在的位置 从索引 1 开始。 Y
中的 class 值应包含 0 到 9,但在您的情况下 min
的输出索引是从 1 到 10。输出最小索引和相应的 class 值彼此相差 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
第二个不正确的地方是 "inner product" 函数(实际上你正在计算欧几里德距离......但让我们把它放在一边作为这个答案)假设总是有 60000 个输入您的测试集没有这么多输入。这对您的训练数据会很好地工作,但它会报告您的测试数据的错误准确性。确保将函数中 60000 的所有实例更改为 n
。您已经在代码中创建的这个变量决定了输入的数量。