我试图建立一个神经网络来估计y=x^ 2,所以我建立了一个拟合的神经网络,并给出了一些输入和输出的样本。我试图在C++中建立这个网络。但结果和我预期的不一样。
有以下投入:
0 1 2 3 4 5 6 6 8 9 10 11 12 13 14 15 16 17 17 18 19 -2 -2-2-2-2 -4 -5 -4-5 -14 -16 -17 -17 -18 -19 -20 -21 -23 -24 -15 -16-17-18-19- 20 -22 - 23 - 24 -24-25 -26 -27 -28 -29 -30 -31 -32 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -51 -52 -53 -54 -55 -56 -57 -58 -60 -61 -62 -64 -65 -66 -67 -68 -69 -70 -71
和下列产出:
01 4 9 16 25 36 64 64 100 121 169 196 225 256 289 324 400 400 484 484 484 529 676 625 676 724 784 841 900 961 1024 1089 1156 1225 1296 1369 1444 1521 1621 1681 1764 1849 1849 1936 202116 2209 2209 2304 2401 2500 2601 2704 2809 2916 3025 3136 3249 3249 3249 3364 3481 3600 3600 3821 3869 4096 4225 4356 89 4624 4761 5041 1 4 25 25 36 49 64 81 144 169 225 256 324 361 441 484 484 576 625 676 729 784 900 961 1021 1256 1225 1296 1346 1644 1544 1744 1746 17462401 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%。隐藏神经元的数目是两个。然后,在命令行中,我写了以下内容:
purelin(net.LW{2}*tansig(net.IW{1}*inputTest+net.b{1})+net.b{2})其他资料:
我的net.b1是:-1.16610230053776 1.16667147712026
我的net.b2是: 51.3266249426358
net.IW(1)为: 0.344272596370387 0.344111217766824。
net.LW(2)为: 31.7635369693519 -31.8082184881063
当我的inputTest是3时,这个命令的结果是16,而它应该是9。我在某个地方犯了错误吗?
我发现Stack溢出post https://stackoverflow.com/questions/2417716/neural-network-in-matlab包含像我的问题一样的问题,但是有一点不同,不同的是在这个问题上输入和输出的范围是相同的,但在我的问题中没有。这个解决方案说我需要扩大结果,但是我怎样才能扩大我的结果呢?
发布于 2012-08-07 20:01:11
你说的是对的。正如在链接答案中提到的,神经网络在默认情况下将输入和输出缩放到-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。
这意味着,经过训练的网络期望输入值在此范围内,并且输出值也在同一范围内。如果要手动将输入到网络,并自己计算输出,则必须在输入时缩放数据,并在输出时反转映射。
最后要记住的一点是,每次你训练安时,你都会得到不同的重量。如果您想要可重复的结果,您需要修复随机数生成器的状态(每次用相同的种子初始化它)。阅读有关像rng和RandStream这样的函数的文档。
您还必须注意,如果要将数据划分为培训/测试/验证集,则每次都必须使用相同的拆分(可能也会受到我提到的随机性方面的影响)。
这里有一个例子来说明这个想法(改编自我的另一个职位):
%%# 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;

https://stackoverflow.com/questions/11739684
复制相似问题