【问题标题】:How to set output size in Matlab newff method如何在 Matlab newff 方法中设置输出大小
【发布时间】:2010-12-12 23:19:03
【问题描述】:

总结: 我正在尝试根据身体部位之间的角度对一些图像进行分类。

我假设人体由 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 个类。

谢谢

【问题讨论】:

    标签: matlab machine-learning neural-network


    【解决方案1】:
    %% 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参数来实现手动除法。

    我展示了对相同训练数据的测试,但您可以对测试数据执行相同的操作。

    【讨论】:

    • 谢谢.. 我仍在修改您的代码。每次我运行时,我得到不同的结果可能是因为随机的初始拾取值。有没有办法稳定输出?再次感谢
    • 由于我们使用梯度下降搜索,它总是会受到局部最小值的影响,并且结果很大程度上取决于初始值。为了更好地估计性能,您可能需要查看其他测试技术,例如 n 折交叉验证和引导(请记住,在我的示例中,所有值都是随机的)
    • 我用自己的测试和训练数据更改了随机值。连续运行差异很大,即:准确度为 %80 到 %30。但是在 SVM 上测试相同的数据在连续运行中没有太大差异。
    • 这在某种程度上是意料之中的,因为在 SVM 学习中涉及凸函数的优化(与 ANN 不同,没有假最小值)。在你的情况下,我想你可以尝试调整各种参数:网络结构、传递函数、权重更新算法等......通常我们所做的就是重复实验几次,选择预测误差最小的网络,然后报告这些运行的平均值作为乐观评估。再次查找我提到的其他测试技术是值得的。
    • 非常感谢.. 将层数设置为 10 可以更好地稳定输出。
    猜你喜欢
    • 2012-03-22
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    相关资源
    最近更新 更多