尝试自己来模拟神经网络在Matlab(try to simulate neural network

2019-06-26 16:00发布

我试图创建估计神经网络Y = X ^ 2。所以我创建了一个配件的神经网络,并给它一些样品的输入和输出。 我试图在C建立这个网络++。 但结果是不同的,比我的预期。

用下面的输入:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71

和下面的输出:

0 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 729 784 841 900 961 1024 1089 1156 1225 1296 1369 1444 1521 1600 1681 1764 1849 1936 2025 2116 2209 2304 2401 2500 2601 2704 2809 2916 3025 3136 3249 3364 3481 3600 3721 3844 3969 4096 4225 4356 4489 4624 4761 4900 5041 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 729 784 841 900 961 1024 1089 1156 1225 1296 1369 1444 1521 1600 1681 1764 1849年1936年2025 2116 2209 2304 2401 2500 2601 2704 2809 2916 3025 3136 3249 3364 3481 3600 3721 3844 3969 4096 4225 4356 4489 4624 4761 4900 5041

我用安装工具的网络。 与矩阵的行。 训练是70%,验证是15%,测试是15%了。 隐含神经元的数量是2,然后在命令行i写这:

purelin(net.LW{2}*tansig(net.IW{1}*inputTest+net.b{1})+net.b{2})

其他信息:

我net.b [1]:-1.16610230053776 1.16667147712026

我的net.b [2]为:51.3266249426358

和net.IW(1)是:0.344272596370387 0.344111217766824

net.LW(2)是:31.7635369693519 -31.8082184881063

当我inputTest为3此命令的结果是16,而它应该是约9。
如果我做了一个错误的地方请让我知道。 谢谢

编辑:我发现链接在MATLAB中的神经网络 ,其中包含像我的问题的问题,但有一点差异,差异是在这个问题的输入和输出的范围是相同的,但在我的问题是没有。 该解决方案说我需要向外扩展的结果,但我不知道如何向外扩展我的结果。 任何的想法?

Answer 1:

你说得对有关缩放。 正如所提到联答复 ,默认情况下,神经网络缩放的输入和输出在范围[-1,1]。 此可以看出,在该网络处理功能配置:

>> net = fitnet(2);

>> net.inputs{1}.processFcns
ans = 
    'removeconstantrows'    'mapminmax'

>> net.outputs{2}.processFcns
ans = 
    'removeconstantrows'    'mapminmax'

施加到两个输入/输出的第二预处理功能是mapminmax使用以下参数:

>> net.inputs{1}.processParams{2}
ans = 
    ymin: -1
    ymax: 1

>> net.outputs{2}.processParams{2}
ans = 
    ymin: -1
    ymax: 1

这两个映射到范围[-1,1](在训练 )。

这意味着,训练的网络预计在该范围内的输入值,并且还输出在相同的范围内的值。 如果你想手动进输入到网络上,并计算输出,那么你会在输入规模的数据,并在输出反向映射。

要记得的最后一件事是,每次训练神经网络时,你会得到不同的权重。 如果你想重复的结果,你需要修复的随机数生成器的状态(每次用相同的种子初始化)。 阅读关于类似功能的文档rngRandStream

你还必须注意,如果你将数据分为训练/测试/验证集,你必须在每个时间(可能也受我所提到的随机性方面)使用相同的分裂。


这里是为了说明的想法(改编自另一示例交矿):

%%# data
x = linspace(-71,71,200);            %# 1D input
y_model = x.^2;                      %# model
y = y_model + 10*randn(size(x)).*x;  %# add some noise

%%# create ANN, train, simulate
net = fitnet(2);                     %# one hidden layer with 2 nodes
net.divideFcn = 'dividerand';
net.trainParam.epochs = 50;
net = train(net,x,y);
y_hat = net(x);

%%# plot
plot(x, y, 'b.'), hold on
plot(x, x.^2, 'Color','g', 'LineWidth',2)
plot(x, y_hat, 'Color','r', 'LineWidth',2)
legend({'data (noisy)','model (x^2)','fitted'})
hold off, grid on

%%# manually simulate network
%# map input to [-1,1] range
[~,inMap] = mapminmax(x, -1, 1);
in = mapminmax('apply', x, inMap);

%# propagate values to get output (scaled to [-1,1])
hid = tansig( bsxfun(@plus, net.IW{1}*in, net.b{1}) ); %# hidden layer
outLayerOut = purelin( net.LW{2}*hid + net.b{2} );     %# output layer

%# reverse mapping from [-1,1] to original data scale
[~,outMap] = mapminmax(y, -1, 1);
out = mapminmax('reverse', outLayerOut, outMap);

%# compare against MATLAB output
max( abs(out - y_hat) )        %# this should be zero (or in the order of `eps`)

我选择使用mapminmax功能,但你可以做的是手工配置。 式是一个相当简单的线性映射:

y = (ymax-ymin)*(x-xmin)/(xmax-xmin) + ymin;



文章来源: try to simulate neural network in Matlab by myself