我正在玩matlab neural network toolbox,我遇到了一些我没想到的事情。我的问题尤其在于没有隐藏层的分类网络,只有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)上训练的。为什么数据集的翻译对偏差和权重没有太大影响?
答案 0 :(得分: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。希望有所帮助。