无法使用神经网络近似正弦函数
machine-learning
neural-network
6
0

我正在尝试使用我自己编写的神经网络来近似sine()函数。我已经在一个简单的OCR问题上测试了我的神经网络,并且可以正常工作,但是在将其应用于近似sine()时遇到了麻烦。我的问题是,在训练期间,我的误差恰好收敛于50%,所以我猜想它是完全随机的。

我将一个输入神经元用作输入(0到PI),并将一个输出神经元用作结果。我有一个隐藏层,可以在其中更改神经元的数量,但是我目前正在尝试使用6到10个神经元。

我有一个问题,是因为我使用的是S型传递函数(这是我的应用程序中的要求),该函数仅输出0到1之间,而sine()的输出在-1和1之间。要尝试校正我尝试将输出乘以2,然后减1,但这不能解决问题。我想我必须在某处进行某种转换才能使此工作生效。

有任何想法吗?

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

使用线性输出单元

这是一个使用R的简单示例:

set.seed(1405)
x <- sort(10*runif(50))
y <- sin(x) + 0.2*rnorm(x)

library(nnet)
nn <- nnet(x, y, size=6, maxit=40, linout=TRUE)
plot(x, y)
plot(sin, 0, 10, add=TRUE)
x1 <- seq(0, 10, by=0.1)
lines(x1, predict(nn, data.frame(x=x1)), col="green")

神经网络预测

收藏
评论

训练网络时,应将目标(sin函数)标准化为[0,1]范围,然后可以保持S型传递函数。

sin(x) in [-1,1]  =>  0.5*(sin(x)+1) in [0,1]

Train data:
    input    target    target_normalized
    ------------------------------------
    0         0          0.5
    pi/4      0.70711    0.85355
    pi/2      1           1
    ...

请注意,我们训练之前已映射了目标。训练和模拟网络后,您可以映射回网络的输出。


以下是用于说明的MATLAB代码:

%% input and target
input = linspace(0,4*pi,200);
target = sin(input) + 0.2*randn(size(input));

% mapping
[targetMinMax,mapping] = mapminmax(target,0,1);

%% create network (one hidden layer with 6 nodes)
net = newfit(input, targetMinMax, [6], {'tansig' 'tansig'});
net.trainParam.epochs = 50;
view(net)

%% training
net = init(net);                            % init
[net,tr] = train(net, input, targetMinMax); % train
output = sim(net, input);                   % predict

%% view prediction
plot(input, mapminmax('reverse', output, mapping), 'r', 'linewidth',2), hold on
plot(input, target, 'o')
plot(input, sin(input), 'g')
hold off
legend({'predicted' 'target' 'sin()'})

网络输出

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号