||
按照《神经网络与机器学习》一书的原理自己编写BP神经网络拟合正弦曲线的代码,可是拟合结果完全不是一条正弦曲线,自己找不出原因,希望科学网的老师不吝赐教,看看以下代码为什么没能做出正确的拟合?代码如下:
%功能:BP神经网络对正弦信号做1-35-1网络训练,训练样本25点,测试样本250点
%日期:6.26
%作者:陈颖频
clc;
clear all;
%测试样本为25点
t=-0.8:1.6/25:0.8-1.6/25;
y_t=sin(2*pi*125/256.0*t);
figure(1);
plot(y_t); %25点是训练样本
title('训练样本');
Hide_N=35; %隐层为35层
%w_in_1为输入层阈值,w_in_2为输入层到隐层的权重,w_hide_out为隐层到输出层权重
w_in_1=zeros(Hide_N,1)+0.1*rand(Hide_N,1);
w_in_2=zeros(Hide_N,1)+0.1*rand(Hide_N,1);
w_hide_out=zeros(Hide_N+1,1)+0.01*rand(Hide_N+1,1);
theta1=1; %输入层的阈值1
theta2=1; %隐层到输出层的阈值2
c=zeros(Hide_N+1,1);c(1)=theta2;
for i=1:200 %训练次
for j=1:25 %对每个训练样本做BP训练
hide=tanh( theta1*w_in_1+t(j)*w_in_2 ); %隐层输出
c(2:end)=hide; %隐层输出加隐层到输出的阈值1,所以c是20行一列,这样编程的好处是后面调整权w_hide_out的同时就调整了阈值
out=tanh( w_hide_out.'*c ); %输出层输出
e=y_t(j)-out; %误差
deta_o=e*(1+out)*(1-out); %反向回传梯度
dw_hide_out=0.02*deta_o*out; %0.02是学习率1
w_hide_out=w_hide_out+dw_hide_out;
end
for k=1:Hide_N %调整输入到隐层的权重和阈值
deta_in_hide(k)=(1+hide(k))*(1-hide(k))*deta_o*(w_hide_out(k)); %这里面的(1+hide(k))*(1-hide(k))表示对双曲正切函数的求导结果
w_in_2(k)= w_in_2(k)+0.01*deta_in_hide(k)*hide(k); %调整输入层权重
w_in_1(k)= w_in_1(k)+0.01*deta_in_hide(k)*hide(k); %调整输入层阈值
end
end
%测试用250点,上面的程序已经训练200次,以w_in_1为输入层阈值,w_in_2为输入层到隐层的权重,w_hide_out为隐层到输出层权重
d=zeros(Hide_N+1,1);d(1)=theta2;
t2=-0.8:1.6/250:0.8-1.6/250;
for j=1:250
d(2:end)=tanh( theta1*w_in_1+t2(j)*w_in_2 );
out2(j)=tanh( w_hide_out.'*d );
end
figure(2);
plot(out2);
title('拟合曲线');
仿真结果如下,实在不忍直视,但是代码我自己找不出问题所在。
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-5-15 15:53
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社