- 关于什么是BP网络和用来干什么的我就不再赘述了,网上有很多,这里只说明一下如何使用matlab神经网络工具箱中的feedforwardnet神经网络(原newff神经网络)。
- matlab版本R2017b
- 由于matlab的更新,官方不再推荐使用newff来训练了,所以对feedforwardnet的使用做下总结。
- 在使用feedforwardnet训练时,不需要对训练前的数据进行归一化处理,我没有单独去查看feedforwardnet归一化用的什么方法,但是通过后期的表达式提取过程来看,应该使用的是mapminmax函数进行的数据归一化和反归一化。
- 直接贴出matlab代码
function C_net_BP01
u_hebing=textread('u_hebing.txt');
f_hebing=textread('f_hebing.txt');
%数据验证===============================================================
data16test=textread('val_in_03_all_fifth.txt','%s');
data16to2test=hex2dec(data16test)';
Changdu16to2test=length(data16to2test);
lietest=Changdu16to2test/6;
grouptest=zeros(lietest,6);
for itest=1:lietest
grouptest(itest,:)=data16to2test(6*itest-5:6*itest);
end
data_read0test=textread('standard_reading_03_all_fifth.txt');
jiequ_n=96;jiequ_m=121;%截取行数96-121比较匹配
u_jiequ=grouptest(jiequ_n:jiequ_m,:);
f_jiequ=data_read0test(jiequ_n:jiequ_m,1:6);
for iitest=1:(jiequ_m-jiequ_n+1)/2
u_chazhitest(iitest,:)=u_jiequ(2*iitest,:)-u_jiequ(2*iitest-1,:);
f_chazhitest(iitest,:)=f_jiequ(2*iitest,:)-f_jiequ(2*iitest-1,:);
end
% 归一化处理==============================================
[u_guiyi,u_guiyi_ps]=mapminmax(u_hebing.');
[f_guiyi,f_guiyi_ps]=mapminmax(f_hebing.');
u_guiyi_test=mapminmax('apply',u_chazhitest.',u_guiyi_ps);
f_guiyi_test=mapminmax('apply',f_chazhitest.',f_guiyi_ps);
%训练BP神经网络=========================================================
net=feedforwardnet(3,'trainlm');
view(net)
net=train(net,u_hebing.',f_hebing.');
view(net)
f_wucha=net(u_hebing.');
perf=perform(net,f_wucha,f_hebing.')
save 'C_net_BP01' net
%带入BP神经网络
f_out=sim(net,u_chazhitest.').';
%网络权值阈值矩阵=======================================================
b1=net.b{1};
iw=net.iw{1,1};
b2=net.b{2};
lw=net.lw{2,1};
%离线神经网络表达式
f_offline_guiyi=(purelin(lw*tansig(iw*u_guiyi_test+b1)+b2));
f_offline=mapminmax('reverse',f_offline_guiyi,f_guiyi_ps).';
end
- 在归一化处理之前,都是对数据的读取与处理过程。
- 输入的训练数据是n行6列(n为样本个数),但是当训练神经网络时,列数被当作样本个数,所以需要转置处理。
- 输入的目标训练数据格式与输入训练数据相同
- 所以该网络是多(6)输入多(6)输出的神经网络
- BP神经网络可以通过训练得到权值阈值,由于可以将表达式提取出来,在后期离线使用时,可以脱离matlab环境,在任意语言(比如C语言)中实现离线仿真,所以对嵌入式系统是比较友好的。
- 为什么不使用性能比较优秀的RBF径向基神经网络,因为本人能力有限,训练完RBF后,没有找到相关RBF的显式表达式,所以训练结果无法在其他设备上直接使用。(如果有大神能够实现,希望讨论一下,谢谢!)
- 题外话,据说支持神经网络的嵌入式系统要来了?