[英]MATLAB Neural Network pattern recognition
我已经为鼠标手势识别(输入是角度)制作了简单的神经网络,并且我使用了nprtool(用于创建的函数patternnet)。 我保存了网络的权重和偏见:
W1=net.IW{1,1};
W2=net.LW{2,1};
b1=net.b{1,1};
b2=net.b{2,1};
为了计算结果,我使用了tansig(W2*(tansig(W1*in+b1))+b2);
其中in
是输入。 但结果很糟糕(每个数字大约等于0.99)。 来自推荐net(in)
输出是好的。 我究竟做错了什么 ? 对我来说非常重要的是为什么第一种方法是坏的(和我在C ++程序中做的一样)。 我在寻求帮助:)
[编辑]下面是从nprtool GUI
生成的代码。 也许对某人来说这会有所帮助,但我没有从这段代码中看到我的问题的任何解决方案。 对于隐藏和输出层,神经元使用tansig激活函数(MATLAB网络中是否有任何参数?)。
% Solve a Pattern Recognition Problem with a Neural Network
% Script generated by NPRTOOL
% Created Tue May 22 22:05:57 CEST 2012
%
% This script assumes these variables are defined:
%
% input - input data.
% target - target data.
inputs = input;
targets = target;
% Create a Pattern Recognition Network
hiddenLayerSize = 10;
net = patternnet(hiddenLayerSize);
% Choose Input and Output Pre/Post-Processing Functions
% For a list of all processing functions type: help nnprocess
net.inputs{1}.processFcns = {'removeconstantrows','mapminmax'};
net.outputs{2}.processFcns = {'removeconstantrows','mapminmax'};
% Setup Division of Data for Training, Validation, Testing
% For a list of all data division functions type: help nndivide
net.divideFcn = 'dividerand'; % Divide data randomly
net.divideMode = 'sample'; % Divide up every sample
net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;
% For help on training function 'trainlm' type: help trainlm
% For a list of all training functions type: help nntrain
net.trainFcn = 'trainlm'; % Levenberg-Marquardt
% Choose a Performance Function
% For a list of all performance functions type: help nnperformance
net.performFcn = 'mse'; % Mean squared error
% Choose Plot Functions
% For a list of all plot functions type: help nnplot
net.plotFcns = {'plotperform','plottrainstate','ploterrhist', ...
'plotregression', 'plotfit'};
% Train the Network
[net,tr] = train(net,inputs,targets);
% Test the Network
outputs = net(inputs);
errors = gsubtract(targets,outputs);
performance = perform(net,targets,outputs)
% Recalculate Training, Validation and Test Performance
trainTargets = targets .* tr.trainMask{1};
valTargets = targets .* tr.valMask{1};
testTargets = targets .* tr.testMask{1};
trainPerformance = perform(net,trainTargets,outputs)
valPerformance = perform(net,valTargets,outputs)
testPerformance = perform(net,testTargets,outputs)
% View the Network
view(net)
% Plots
% Uncomment these lines to enable various plots.
%figure, plotperform(tr)
%figure, plottrainstate(tr)
%figure, plotconfusion(targets,outputs)
%figure, ploterrhist(errors)
从代码中可以看出,网络对目标的输入和后处理应用自动预处理 - 查找定义processFcns
的行。 这意味着训练的参数对于预处理的输入有效,并且网络的输出被后处理(具有与目标相同的参数)。 所以在你的行tansig(W2*(tansig(W1*in+b1))+b2);
你不能使用原始输入。 您必须预处理输入,将结果用作网络的输入,并使用用于后处理目标的相同参数对输出进行后处理。 只有这样你才能得到与调用net(in)
相同的结果。
您可以在这里阅读更多内容: http : //www.mathworks.com/help/toolbox/nnet/rn/f0-81221.html#f0-81692
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.