poster
2019-12-10, 16:49
摘要:我正在尝试根据身体部位之间的角度对某些图像进行分类。
我假设人体由10个部分(如矩形)组成,并找到每个部分的中心,并参考躯干计算每个部分的角度。我有三个动作类别:“手波行走”。我的目标是找到哪些测试图像属于哪个动作类别。
事实: TrainSet:1057x10功能集,1057代表图像数量。测试集:821x10
我希望我的输出是3x1矩阵,每行显示操作类别的分类百分比。第1行:手波第2行:正在步行第3行:正在运行
码:
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类。
谢谢
回答:
%% 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)
另请注意,当前未使用测试集,因为默认情况下,输入数据分为训练/测试/验证。您可以通过将net.divideFcn设置为Divindind函数,并设置相应的net.divideParam参数来实现手动划分。
我在相同的训练数据上显示了测试,但是您可以对测试数据进行相同的操作。
更多&回答... (https://stackoverflow.com/questions/1672850)
我假设人体由10个部分(如矩形)组成,并找到每个部分的中心,并参考躯干计算每个部分的角度。我有三个动作类别:“手波行走”。我的目标是找到哪些测试图像属于哪个动作类别。
事实: TrainSet:1057x10功能集,1057代表图像数量。测试集:821x10
我希望我的输出是3x1矩阵,每行显示操作类别的分类百分比。第1行:手波第2行:正在步行第3行:正在运行
码:
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类。
谢谢
回答:
%% 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)
另请注意,当前未使用测试集,因为默认情况下,输入数据分为训练/测试/验证。您可以通过将net.divideFcn设置为Divindind函数,并设置相应的net.divideParam参数来实现手动划分。
我在相同的训练数据上显示了测试,但是您可以对测试数据进行相同的操作。
更多&回答... (https://stackoverflow.com/questions/1672850)