1

Я совершенно не знаком с Matlab, и это мой первый проект. Mnist имеет 60000 изображений между 0 и 9 для обучения и 1000 изображений для тестирования. я сделал попытку сделать шаблон для всего этого 10 класса (от 0 до 9), используя среднее значение. Тогда для распознавания я использую евклидово расстояние. это очень просто, но точность действительно низкая. Я не знаю, где именно моя проблема, чтобы вернуть мне этот процент точности. точность: 1,73%Точность распознавания образов Mnist

вот мой код найти 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 
+0

Вычисление среднего значения каждой цифры в качестве типичной цифры для использования и нахождения внутреннего продукта между цифрой запроса и каждой из этих репрезентативных цифр для классификации - очень плохая идея. Если вы посмотрите на каждую из отдельных цифр (т. Е. Все 1s, 2s и т. Д.), Все они очень сильно отличаются друг от друга. Поиск среднего значения всех этих цифр не является хорошим представлением о том, как каждая цифра будет выглядеть на практике. Кстати, ваш код не вычисляет внутренний продукт. Он вычисляет евклидово расстояние. – rayryeng

+0

@rayryeng да, ваше полное право, и я это знаю, но это наше упражнение и наш учитель таким образом набрали 82% точности. Я думаю, что эта низкая точность может исходить из моей функции. – mkafiyan

+0

Дорогой @rayryeng помните, что я прошу вас помочь мне с другой проблемой? – mkafiyan

ответ

2

Ваш код в основном правильно, хотя это довольно неэффективен. Я не буду тратить время, чтобы сделать его более эффективным, так как есть много областей, требующих адресации. Вместо этого я сосредоточусь на том, что не так. В коде есть две вещи. Во-первых, когда вы обнаружите, какая цифра имеет наименьшее расстояние:

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

Обратите внимание, что второй выход min производит местоположение, где минимум начиная с индекса 1. Значения классов в Y должны содержать от 0 до 9, но индекс вывода min в вашем случае составляет от 1 до 10. Минимальные индексы вывода и соответствующие значения классов равны 1 друг от друга, что, вероятно, является причиной того, что у вас есть такие плохая точность.

Таким образом, вы должны вычесть 1 из minmat(i, 2), прежде чем проверить, чтобы увидеть, если минимальная метка действительно земля правда ... или вы можете просто добавить 1 к Y(i) при проверке:

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

Второй неверная вещь заключается в том, что функция «внутреннего продукта» (на самом деле вы вычисляете евклидову расстояние ... но давайте отложим это для этого ответа) предполагает, что всегда есть 60000 входов, но ваш тестовый набор не имеет этого многие входы. Это будет отлично работать с вашими данными обучения, но оно сообщит о неправильной точности ваших тестовых данных. Убедитесь, что вы изменили все экземпляры 60000 в функции на n. Эта переменная, которую вы уже создали в своем коде, и определяет количество входов.

+0

есть. ваше право, я настолько запутался в матричном измерении, потому что они большие, поэтому я не обращал внимания на часть индекса. глупая ошибка. – mkafiyan

+0

Хе-хе. Нет проблем. Мне любопытно.Какова точность теперь, когда вы скорректировали сравнение? – rayryeng

+0

моя точность проверки все еще низкая; Я имею в виду, что точность поезда составляет 85%, а тест - 13,5%. Я могу что-то сделать, чтобы улучшить его? – mkafiyan

Смежные вопросы