3

概要: 体の部分の角度に応じて、いくつかの画像を分類しようとしています。

人体は(長方形として)10個のパーツで構成されていると仮定し、各パーツの中心を見つけ、胴体を参照して各パーツの角度を計算します。そして、私には3つのアクションカテゴリがあります:Handwave-Walking-Running。私の目標は、どのテスト画像がどのアクションカテゴリに分類されるかを見つけることです。

事実: TrainSet:1057x10機能セット、1057は画像の数を表します。TestSet:821x10

アクションカテゴリの分類のパーセンテージを示す各行の出力を3x1行列にします。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メソッドを使用していますが、出力は常に3x1ではなくNx10行列です。入力セットは3つのクラスとしてグループ化する必要がありますが、10のクラスにグループ化されています。

ありがとう

4

1 に答える 1

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パラメーターを設定することで実現できます。

同じトレーニングデータでテストを示しましたが、テストデータでも同じことができます。

于 2009-11-04T11:42:48.287 に答える