2009-11-04 12 views
3

Резюме: Я пытаюсь сделать классификацию некоторых изображений в зависимости от углов между частями тела.Как установить выходной размер в методе Matlab newff

Я предполагаю, что человеческое тело состоит из 10 частей (в виде прямоугольников) и находит центр каждой части и вычисляет угол каждой части по отношению к торсу. И у меня есть три категории действий: Handwave-Walking-Running. Моя цель - найти, какие тестовые изображения попадают в категорию действий.

Факты: TrainSet: 1057x10 набор функций, 1057 обозначает номер изображения. TestSet: 821x10

Я хочу, чтобы мой вывод был матрицей 3x1, каждая строка показывала процент классификации для категории действия. row1: Handwave row2: Прогулки row3: Бег

Код:

actionCat='H'; 
[train_data_hw train_label_hw] = tugrul_traindata(TrainData,actionCat); 
[test_data_hw test_label_hw] = tugrul_testdata(TestData,actionCat); 


actionCat='W'; 
[train_data_w train_label_w] = tugrul_traindata(TrainData,actionCat); 
[test_data_w test_label_w] = tugrul_testdata(TestData,actionCat); 

actionCat='R'; 
[train_data_r train_label_r] = tugrul_traindata(TrainData,actionCat); 
[test_data_r test_label_r] = tugrul_testdata(TestData,actionCat); 

Train=[train_data_hw;train_data_w;train_data_r]; 
Test=[test_data_hw;test_data_w;test_data_r]; 

Target=eye(3,1); 
net=newff(minmax(Train),[10 3],{'logsig' 'logsig'},'trainscg'); 
net.trainParam.perf='sse'; 
net.trainParam.epochs=50; 
net.trainParam.goal=1e-5; 
net=train(net,Train); 

trainSize=size(Train,1); 
testSize=size(Test,1); 

if(trainSize > testSize) 
pend=-1*ones(trainSize-testSize,size(Test,2)); 
Test=[Test;pend]; 
end 


x=sim(net,Test); 

Вопрос: Я использую Matlab newff method.But мой выход всегда Nx10 Matrice не 3x1 , Мой набор ввода должен быть сгруппирован как 3 класса, но они сгруппированы в 10 классов.

Благодаря

ответ

3
%% Load data : I generated some random data instead 
Train = rand(1057,10); 
Test = rand(821,10); 
TrainLabels = randi([1 3], [1057 1]); 
TestLabels = randi([1 3], [821 1]); 

trainSize = size(Train,1); 
testSize = size(Test,1); 

%% prepare the input/output vectors (1-of-N output encoding) 
input = Train';    %'matrix of size numFeatures-by-numImages 
output = zeros(3,trainSize); % matrix of size numCategories-by-numImages 
for i=1:trainSize 
    output(TrainLabels(i), i) = 1; 
end 

%% create net: one hidden layer with 10 nodes (output layer size is infered: 3) 
net = newff(input, output, 10, {'logsig' 'logsig'}, 'trainscg'); 
net.trainParam.perf = 'sse'; 
net.trainParam.epochs = 50; 
net.trainParam.goal = 1e-5; 
view(net) 

%% training 
net = init(net);       % initialize 
[net,tr] = train(net, input, output);  % train 

%% performance (on Training data) 
y = sim(net, input);      % predict 
%[err cm ind per] = confusion(output, y); 

[maxVals predicted] = max(y);    % predicted 
cm = confusionmat(predicted, TrainLabels); 
acc = sum(diag(cm))/sum(cm(:)); 
fprintf('Accuracy = %.2f%%\n', 100*acc); 
fprintf('Confusion Matrix:\n'); 
disp(cm) 

%% Testing (on Test data) 
y = sim(net, Test'); 

Обратите внимание, как я преобразовал из категории этикетки для каждого экземпляра (1/2/3) для кодирования вектора в 1-на-N ([100]: 1, [010]: 2, [001]: 3)

также отметить, что тестовый набор используется в настоящее время нет, поскольку по умолчанию входные данные делятся на поезда/испытания/проверки. Вы можете достичь своего ручного деления, установив net.divideFcn в функцию divideind и установив соответствующие параметры net.divideParam.

Я показал тестирование на одни и те же данные тренировки, но вы можете сделать то же самое для данных теста.

+0

спасибо .. Я по-прежнему пересматриваю ваш код. Каждый раз, когда я запускаю, я получаю разные результаты, вероятно, из-за случайных начальных значений пикапа. Есть ли способ стабилизировать выход? Еще раз спасибо – tguclu

+0

Поскольку мы используем поиск с градиентным спусками, он всегда будет страдать от локальных минимумов, и результат будет сильно зависеть от начальных значений. Чтобы получить более точную оценку производительности, вы можете посмотреть другие методы тестирования, такие как n-кратная перекрестная проверка и самонастройка (помните, что в моем примере все значения просто случайны) – Amro

+0

Я изменил случайные значения с помощью собственных тестирования и подготовки данных. Последовательные прогоны сильно различаются i.e:% от 80 до% 30 в точности. Но тестирование тех же данных по результатам SVM не приводит к большим различиям в последовательных прогонах. – tguclu