matlab神经网络工具箱怎么输出得到函数代码段?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab神经网络工具箱怎么输出得到函数代码段?相关的知识,希望对你有一定的参考价值。

参考技术A

神经网络训练出来的是权值矩阵,我想你是想在matlab外用训练好的神经网络。首先你要在外部实现神经网络算法,之后你把神经网络训练出来的权值矩阵读取到你在外部实现的神经网络算法中,然后你就可以使用这个神经网络了。

MATLAB

MATLAB 是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。

MATLAB 中的神经网络

【中文标题】MATLAB 中的神经网络【英文标题】:Neural network in MATLAB 【发布时间】:2011-01-25 22:32:39 【问题描述】:

我在 MATLAB 中训练了异或神经网络并得到了这些权重:

iw: [-2.162 2.1706; 2.1565 -2.1688]

lw: [-3.9174 -3.9183]

b1 [2.001; 2.0033]

b2 [3.8093]

出于好奇,我尝试编写 MATLAB 代码来计算该网络的输出(隐藏层中的两个神经元,输出中的一个,TANSIG 激活函数)。

我得到的代码:

l1w = [-2.162 2.1706; 2.1565 -2.1688];
l2w = [-3.9174 -3.9183];
b1w = [2.001 2.0033];
b2w = [3.8093];

input = [1, 0];

out1 = tansig (input(1)*l1w(1,1) + input(2)*l1w(1,2) + b1w(1));
out2 = tansig (input(1)*l1w(2,1) + input(2)*l1w(2,2) + b1w(2));
out3 = tansig (out1*l2w(1) + out2*l2w(2) + b2w(1))

问题是当输入是 [1,1] 时,它输出 -0.9989,而当 [0,1] 0.4902。而用 MATLAB 生成的模拟网络输出充分是 0.000558750.99943

我做错了什么?

【问题讨论】:

为什么不发布用于构建和训练网络的实际代码? 【参考方案1】:

我写了一个 XOR 网络的简单示例。我使用了newpr,默认为tansig隐藏层和输出层的传递函数。

input = [0 0 1 1; 0 1 0 1];               %# each column is an input vector
ouputActual = [0 1 1 0];

net = newpr(input, ouputActual, 2);       %# 1 hidden layer with 2 neurons
net.divideFcn = '';                       %# use the entire input for training

net = init(net);                          %# initialize net
net = train(net, input, ouputActual);     %# train
outputPredicted = sim(net, input);        %# predict

然后我们通过自己计算输出来检查结果。要记住的重要一点是,默认情况下,输入/输出缩放到 [-1,1] 范围:

scaledIn = (2*input - 1);           %# from [0,1] to [-1,1]
for i=1:size(input,2)
    in = scaledIn(:,i);             %# i-th input vector
    hidden(1) = tansig( net.IW1(1,1)*in(1) + net.IW1(1,2)*in(2) + net.b1(1) );
    hidden(2) = tansig( net.IW1(2,1)*in(1) + net.IW1(2,2)*in(2) + net.b1(2) );
    out(i) = tansig( hidden(1)*net.LW2,1(1) + hidden(2)*net.LW2,1(2) + net.b2 );
end
scaledOut = (out+1)/2;              %# from [-1,1] to [0,1]

或更有效地表示为一行中的矩阵乘积:

scaledIn = (2*input - 1);           %# from [0,1] to [-1,1]
out = tansig( net.LW2,1 * tansig( net.IW1*scaledIn + repmat(net.b1,1,size(input,2)) ) + repmat(net.b2,1,size(input,2)) );
scaledOut = (1 + out)/2;            %# from [-1,1] to [0,1]

【讨论】:

优秀。对我帮助很大。【参考方案2】:

您通常不会在输出层上使用 sigmoid——您确定应该在 out3 上使用 tansig 吗?您确定您正在查看经过适当训练的网络的权重吗?看起来您的网络经过训练可以对 [1,1] [1,-1] [-1,1] 和 [-1,-1] 进行异或运算,其中 +1 表示“异或”和 -1意思是“相同”。

【讨论】:

那如果在输出层不使用Sigmoid,你如何规范化你的输出呢?此外,如果您的输出未标准化,您如何测量错误? 对于分类器,您选择具有最高值的输出(或在 50% 点切换)来做出决定。你不需要非线性。在这种情况下,这样做没问题,但它并没有真正增加太多。 当你想得到除了分类之外的每个类的后验概率时,在输出层使用线性函数的问题就变得很明显了.. @Amro:很公平。如果您希望它们被强制进入范围(0,1),那么是的,您应该使用1/(1+exp(-y));无论哪种方式,您都会得到近似概率,但如果您只是将其视为函数近似,您可能会超过 1(或低于 0)。这是否是一个问题取决于应用程序。

以上是关于matlab神经网络工具箱怎么输出得到函数代码段?的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB 中的神经网络

matlab曲线拟合后如何给出得到的各个参数的标准差

matlab中的BP神经网络

matlab同时输出两段音乐

用 Matlab 神经网络工具箱拟合复杂非线性函数

怎么用matlab隔段删去某几个数据?