如何在Matlab newff方法中设置输出大小 [英] How to set output size in Matlab newff method
问题描述
摘要: 我正在尝试根据身体部位之间的角度对某些图像进行分类.
Summary: I'm trying to do classification of some images depending on the angles between body parts.
我假设人体由10个部分(如矩形)组成,并找到每个部分的中心,并参考躯干计算每个部分的角度. 我有三个动作类别:手波行走". 我的目标是找到哪些测试图像属于哪个动作类别.
I assume that human body consists of 10 parts(as rectangles) and find the center of each part and calculate the angle of each part by reference to torso. And I have three action categories:Handwave-Walking-Running. My goal is to find which test images fall into which action category.
事实: TrainSet:1057x10功能集,1057代表图像数. 测试集:821x10
Facts: TrainSet:1057x10 feature set,1057 stands for number of image. TestSet:821x10
我希望我的输出为3x1矩阵,每行显示动作类别的分类百分比. 第1行:手波 第2列:行走 row3:正在运行
I want my output to be 3x1 matrice each row showing the percentage of classification for action category. row1:Handwave row2:Walking row3:Running
代码:
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方法,但是我的输出始终是Nx10矩阵而不是3x1. 我的输入集应分为3个类别,但它们分为10个类别.
Question: I'm using Matlab newff method.But my output is always an Nx10 matrice not 3x1. My input set should be grouped as 3 classes but they are grouped to 10 classes.
谢谢
推荐答案
%% 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-to-N编码向量([100]: 1, [010]: 2, [001]: 3)
Note how I converted from category label for each instance (1/2/3)
to a 1-to-N encoding vector ([100]: 1, [010]: 2, [001]: 3)
还请注意,当前未使用测试集,因为默认情况下,输入数据分为训练/测试/验证.您可以通过将 net.divideFcn
设置为 divideind 功能,并设置相应的net.divideParam
参数来实现手动划分.
Also note that the test set is currently not being used, since by default the input data is divided into train/test/validation. You could achieve your manual division by setting net.divideFcn
to the divideind function, and setting the corresponding net.divideParam
parameters.
我在相同的训练数据上显示了测试,但是您可以对测试数据进行相同的操作.
I showed the testing on the same training data, but you could do the same for the Test data.
这篇关于如何在Matlab newff方法中设置输出大小的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!