1

我在玩matlab神经网络工具箱时遇到了一些我没想到的事情。我的问题尤其是没有隐藏层、只有 1 个输入和 tansig 传递函数的分类网络。所以我希望这个分类器在某个点划分一维数据集,该点由学习的输入权重和偏差定义。

首先,我认为计算给定输入 x 的输出 y 的公式是:y = f(x*w + b) 其中 w 是输入权重,b 是偏差。计算网络输出的正确公式是什么?

我还预计将整个数据集翻译某个值(+77)会对偏差和/或权重产生很大影响。但情况似乎并非如此。为什么数据集的翻译对偏差和权重没有太大影响?

这是我的代码:

% Generate data
p1 = randn(1, 1000);
t1(1:1000) = 1;
p2 = 3 + randn(1, 1000);
t2(1:1000) = -1;
% view data
figure, hist([p1', p2'], 100)

P = [p1 p2];
T = [t1 t2];

% train network without hidden layer
net1 = newff(P, T, [], {'tansig'}, 'trainlm');
[net1,tr] = train(net1, P, T);

% display weight and bias
w = net1.IW{1,1};
b = net1.b{1,1};
disp(w) % -6.8971
disp(b) % -0.2280

% make label decision
class_correct = 0;
outputs = net1(P);
for i = 1:length(outputs)
    % choose between -1 and 1
    if outputs(i) > 0
       outputs(i) = 1;
    else
       outputs(i) = -1;
    end
    % compare
    if T(i) == outputs(i)
        class_correct = class_correct + 1;
    end
end
% Calculate the correct classification rate (CCR)
CCR = (class_correct * 100) / length(outputs);
fprintf('CCR: %f \n', CCR);
% plot the errors
errors = gsubtract(T, outputs);
figure, plot(errors)

% I expect these to be equal and near 1
net1(0)              % 0.9521
tansig(0*w + b)     % -0.4680

% I expect these to be equal and near -1
net1(4)              % -0.9991
tansig(4*w + b)     % -1




% translate the dataset by +77
P2 = P + 77;

% train network without hidden layer
net2 = newff(P2, T, [], {'tansig'}, 'trainlm');
[net2,tr] = train(net2, P2, T);

% display weight and bias
w2 = net2.IW{1,1};
b2 = net2.b{1,1};
disp(w2) % -5.1132
disp(b2) % -0.1556

我生成了一个人工数据集,该数据集由具有不同均值的正态分布的 2 个总体组成。我在直方图中绘制了这些人口,并用它训练了网络。我计算了正确分类率,它是整个数据集正确分类实例的百分比。这大约是 92%,所以我知道分类器有效。

但是,我希望 net1(x) 和 tansig(x*w + b) 给出相同的输出,但事实并非如此。计算训练有素的网络输出的正确公式是什么?

我预计 net1 和 net2 具有不同的权重和/或偏差,因为 net2 是在 net1 训练的数据集的翻译版本 (+77) 上训练的。为什么数据集的翻译对偏差和权重没有太大影响?

4

1 回答 1

2

首先,您的代码保持默认的 MATLAB 输入预处理不变。您可以通过以下方式检查:

net2.inputs{1}

当我把你的代码放进去时,我得到了这个:

    Neural Network Input
              name: 'Input'
    feedbackOutput: []
       processFcns: {'fixunknowns', removeconstantrows,
                    mapminmax}
     processParams: {1x3 cell array of 2 params}
   processSettings: {1x3 cell array of 3 settings}
    processedRange: [1x2 double]
     processedSize: 1
             range: [1x2 double]
              size: 1
          userdata: (your custom info)

重要部分processFncs设置为mapminmax. 根据文档,mapminmax将“通过将行最小值和最大值映射到 [-1 1] 来处理矩阵”。这就是为什么您的输入任意“移动”(重新采样)没有效果。

我假设“计算输出”是指检查网络的性能。您可以通过首先在数据集上模拟您的网络(请参阅 参考资料doc nnet/sim)然后使用该perform函数检查“正确性”来做到这一点。它将使用与训练时相同的成本函数:

% get predictions
[Y] = sim(net2,T);
% see how well we did
perf = perform(net2,T,Y);

Boomshuckalucka。希望有帮助。

于 2013-06-08T08:26:11.613 回答