你是正确的缩放.正如在
linked answer中提到的,神经网络默认将输入和输出缩放到范围[-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等函数的文档.
您还必须注意,如果要将数据划分为训练/测试/验证集,则每次必须使用相同的拆分(可能还受到我提到的随机性方面的影响).
这是一个例子来说明这个想法(改编自我的另一个post):
%%# 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;