问题引出
如何存储和调用已经训练好的神经网络。
本人前几天在智能控制学习的过程中也遇到了这样的问题,翻阅书本只有对网络直接调用,而没有保存训练结果比较好的网络进行数据的预测,然后进行网上查阅在论坛中看了大家的回复,虽然都提到了关键的两个函数“save”和“load”,但或多或少都简洁了些,让人摸不着头脑(当然也可能是本人太菜)。通过不断调试,大致弄明白这两个函数对神经网络的存储。下面附上实例给大家做个说明,希望对跟我有一样问题的朋友有所帮助。
知识准备
如果只是需要在工作目录下保到当前训练好的网络,可以在命令窗口
输入:save name net %name为保存的文件名字,net为已训练好的网络
保存net。
然后在命令窗口
输入:load name net %name为加载的文件名字,net为已保存的网络
加载net。
但一般我们都会在加载完后对网络进行进一步的操作,建议都放在M文件中进行保存网络和调用网络的操作。
代码注解
下面展示 BP神经网络的保存网络net和保存归一化最值
。
%% 清空环境变量
clc
clear
%% 训练数据预测数据提取及归一化
%下载输入输出数据,这里你可以改成自己想要训练的数据
A= xlsread('B_data.xlsx','B2:E200');
B=xlsread('B_data.xlsx','F2:F200');
C= xlsread('B_data.xlsx','B201:E235');
D=xlsread('B_data.xlsx','F201:F235');
%找出训练数据和预测数据
input_train=A'; %对输入数据进行转置
output_train=B';
input_test=C';
output_test=D';
%选连样本输入输出数据归一化
[inputn,minp,maxp,outputn,mint,maxt]=premnmx(input_train,output_train);%归一化处理
%% BP网络训练
% %初始化网络结构
net=newff(minmax(input_train),[4,6,1],{'tansig','tansig','purelin'},'trainlm');%创建网络,表示有输入层4层,隐层6层,输出层1层
% 变学习率梯度下降算法
%net.trainFcn='traingda';
%net.trainFcn='traingda';
net.trainParam.epochs=2000;%设置最大收敛次数
net.trainParam.lr=0.0001;%设置学习速率
net.trainParam.goal=0.00000001;%设置收敛误差
%net.trainParam.min_grad=1e-6;%设置最小性能梯度,一般取1e-6
%net.trainParam.min_fail=10;%设置最大确认失败次数
%网络训练
net=train(net,inputn,outputn);
%% BP网络预测
%预测数据归一化
[input_n,minp,maxp]=premnmx(input_test);%归一化处理
%网络预测输出
an=sim(net,input_n);
%网络输出反归一化
BPoutput=postmnmx(an,mint,maxt);
%% 结果分析
figure(1)
plot(BPoutput,':o')
hold on
plot(output_test,'-*');
legend('预测输出','期望输出')
title('BP网络预测输出','fontsize',12)
ylabel('函数输出','fontsize',12)
xlabel('样本','fontsize',12)
%预测误差
error1=(abs(BPoutput)-output_test)./output_test;
%标准
figure(2)
plot(error1,'-*')
title('BP网络预测相对误差','fontsize',12)
ylabel('相对误差','fontsize',12)
xlabel('样本','fontsize',12)
figure(3)
plot((output_test-BPoutput)./BPoutput,'-*');
title('神经网络预测误差百分比')
error = BPoutput-output_test;
%errorsum=sqrt(sum(error.^2)/48);
mape=sum(abs(error./output_test))*(100/48);
%errorsum=sum((abs(error))*(abs(error))')
%errorsum2=errorsum/11
%errorsum3=sqrt(errorsum2)
%avg=mean(B)
save my_BP net;%保存训练好的BP神经网络net于my_BP中
save my_mint mint;%保存训练好的BP神经网络归一化后的最小值于my_mint中
save my_maxt maxt;%保存训练好的BP神经网络归一化后的最大值于my_maxt中
我们一定要保存好神经网络训练好的归一化最值,不然就会在调用网络的时候出现加载之后的神经网络用sim函数就出现了’model’ parameter must be a character vector的错误
下面展示 BP神经网络的加载网络net和加载归一化最值
。
clc
clear
load my_BP.mat net;%加载训练好的网络模型net
load my_maxt;%加载训练好的网络模型的归一化最大值
load my_mint;%加载训练好的网络模型的归一化最小值
P=xlsread('data_100.xlsx','B2:E101');
input=P';
input_1=premnmx(input);%对待预测数据进行归一化处理
an=sim(net,input_1);
BPoutput_new=postmnmx(an,mint,maxt); %对预测数据结果进行反归一化处理
O=BPoutput_new';
O %输出结果 %
总结
运用save和load函数进行保存和加载训练结果比较好的神经网络net,进行对数据的预测。我们要注意除了网络net的保存和加载的同时,我们也要对神经网络处理之前的归一化最值给保存下来,不然在使用sim函数调用网络net的时候就会出现报错情况。遇事不要慌,打开浏览器搜索,绝大部分都有解决办法,加上自己思考总结,这样就能学到东西,而不是白嫖了。