我刚刚开始使用Matlab的工具箱进行简单的神经网络训练。 我的Matlab版本是2019a。 但是,有一件事使我感到困惑。考虑以下代码:
Nsamples=1000;
NoiseMag=0.2;
rx=linspace(-1,1,Nsamples);
ry = rx + NoiseMag*randn(size(rx));
net=feedforwardnet(50);
[net,tr]=train(net,rx,ry);
这部分代码使用噪声样本(rx,ry)
上的单个隐藏层训练前馈NN。我感到困惑的是,tr.perf
输出的网络训练错误与mse(net,rx(tr.trainInd),ry(tr.trainInd))
不一致:
tr.perf %output: [9.7205 0.0419 0.0370 0.0364 0.0361 0.0358 0.0356 0.0355 0.0355 0.0354]
mse(net,rx(tr.trainInd),ry(tr.trainInd)) . %Output 0.0401
说明:tr.perf
输出每次迭代(或时代)的训练错误。下一条命令mse(net,rx(tr.trainInd),ry(tr.trainInd))
输出当前(最佳)神经网络参数的训练错误。
由于tr.best_epoch
是3
,所以tr.perf
的第三个元素应该完全等于mse(net,rx(tr.trainInd),ry(tr.trainInd))
,但不是。
知道为什么吗? 比较验证和测试错误时,我还会观察到相同的不一致之处。 如果编译这些示例,由于样本中的随机性和NN的初始权重,您的输出将略有不同。
谢谢
答案 0 :(得分:0)
我没有仔细阅读mse
函数的文档。
mse(net,targets,outputs,errorWeights,...parameters...) calculates a
network performance given targets, outputs, error weights and parameters
as the mean of squared errors.
因此,第二个参数必须是目标,第三个参数是网络结果。修改代码后,输出将保持一致。我一直在寻找的函数-仅计算两个向量的均方误差-称为immse
mse(net,ry(tr.trainInd),net(rx(tr.trainInd))) % output 0.0334
tr.perf(tr.best_epoch+1) % output 0.0334
immse(net(rx(tr.trainInd)),ry(tr.trainInd)) % output 0.0334