Matlab应用于BP神经网络与GUI,以及一点自己的看法

最近写毕业论文跟SRDP再次用到了Matlab,不得不说在科学计算方面Matlab编程确实很方便。
毕业论文是一个跟BP神经网络有关的题目,老师给的数据很多,为了得出能用的结果程序迭代了6个版本,程序不是很长总结一下用到的方法。可能因为网络的权值是系统随机设置的,每次输出的结果都不一样,所以有些参数修改就是凭感觉,但最终结果还是比较好的,经测试分类正确率能达到0.96。

%分别读取输入数据
p1 = textread('train_1.txt');
p2 = textread('train_2.txt');
p3 = textread('train_3.txt');
p4 = textread('train_4.txt');
p5 = textread('train_5.txt');
p = [p1;p2;p3;p4;p5];
%特征值归一化,可以归到一定范围,默认的是(-1,1),但是我发现不用归一
%化反而正确率更高,不知道为什么
%p = mapminmax(p);
p = p';
%因为分5类,所以每个类的输出值为1,2,3,4,5
t1 = ones(1,length(p1));
t2 = ones(1,length(p2))*2;
t3 = ones(1,length(p3))*3;
t4 = ones(1,length(p4))*4;
t5 = ones(1,length(p5))*5;
t = [t1 t2 t3 t4 t5];
%系统提示newff是已弃用的方法,但是实际上还是能用的
%net = newff(minmax(p),[17,1],{'logsig','purelin'},'trainlm');
%现在新建BP网络用feedforwardnet方法,输入值有9个参数,根据2n+1,隐%含层有19个神经元,
net = feedforwardnet(19);
%神经网络初始化
net = init(net);
%第一层激活函数为log函数
net.layers{1}.transferFcn = 'logsig';
%因为输出值范围较大,第二激活函数为线性函数
net.layers{2}.transferFcn = 'purelin';
%采用梯度下降法训练
net.trainFcn = 'trainlm'; 
%最大迭代次数为500
net.trainParam.epochs = 500;
net.trainParam.show = 20;
%训练目标精度0.001
net.trainParam.goal = 0.001;
%学习速率0.1
net.trainParam.lr = 0.1;
%对网络进行训练
[net,tr] = train(net , p , t);
%进行仿真,加上坐标轴比较容易对比
y = sim(net,p);
grid on;
plot(y);
%绘制网络训练记录
plotperf(tr)

SRDP的项目需要一个界面,组长在deadline前3天给我布置了任务,于是我从头学起用Matlab做GUI。
在命令行输入guide,就能进入GUI编辑界面,可以选择新建或打开已有的GUI,操作与C#类似,也是拖控件,通过回调函数触发时间。组长要求有三个界面,分别命名为sight_1,sight_2,sight_3用到的几个主要的函数方法如下。

%关闭sight_1,打开sight_2
delete(sight_1);
sight_2;
%点击按键读入图片origin.jpg,载入坐标轴img1
g = imread('origin.jpg');
image(g,'Parent',handles.img1);
axis off;
%通过下拉菜单选择方法,因为方法在后面其他函数中要用到,设置为global
global fangfa;
fangfa = get(hObject,'value');
...
...
%从输入框读取加噪量
str = get(hObject , 'string');
global jiazaoliang;
jiazaoliang = str2double(str);
%加噪量在0.01-0.2之间否则报错,重置输入框
if (jiazaoliang <= 0.01) || (jiazaoliang >= 0.2)
    errordlg('输入范围为0.01-0.2!','错误!','确定');
    set(handles.edit1,'string','');
end
...
...
global fangfa;
global jiazaoliang;
%根据不同方法选择不同的调用函数,因为修改仓促,函数接口没改的好,嫌麻烦
%就没有继续优化代码,下拉菜单第一行是“--方法选择--”,所以方法从2开始
switch fangfa
    case 2
        [jz,ff,t1,t2]=zhongzhilvbo(jiazaoliang);
        set(handles.jiazao,'string',jz);
        set(handles.lvbo,'string',ff);
    case 3
        [jz,ff,t1,t2]=junzhilvbo(jiazaoliang);
        set(handles.jiazao,'string',jz);
        set(handles.lvbo,'string',ff);
    case 4
        [jz,ff,t1,t2 ] = qidianlvbo(jiazaoliang);
        set(handles.jiazao,'string',jz);
        set(handles.lvbo,'string',ff);
    case 5
        [jz,ff,t1,t2 ] = wudianlvbo(jiazaoliang);
        set(handles.jiazao,'string',jz);
        set(handles.lvbo,'string',ff);
    case 6
        [jz,ff,t1,t2 ] = gaijin7(jiazaoliang);
        set(handles.jiazao,'string',jz);
        set(handles.lvbo,'string',ff);
    case 7
        [jz,ff,t1,t2 ] = gaijin5(jiazaoliang);
        set(handles.jiazao,'string',jz);
        set(handles.lvbo,'string',ff);
end

本专业是地球科学类专业,对编程训练不多,除了我这样跨考计算机的,其他同学对编程训练很少,跨考成功后很多人找我帮写代码,我觉得有必要传授一点搬砖的经验。除了需要自己设计算法的,编程主要工作就是复制+粘贴+仿写,需要的代码基本上都能在教材和网络上找到,复制粘贴所需要的一部分,没有现成的可以找类似的然后仿写。很多人问我的问题我也不会,都是当场上网搜索解决方法,但是遇到不会的不第一时间上网搜索或者翻书而是找人帮忙以求不劳而获,这样对自身的危害很大,如果我的同学能看到这篇博客,希望能变勤快点,利用好互联网的资源多学习学习,而不是事事求人,然后自己跑去打撸啊撸。

你可能感兴趣的:(Matlab应用于BP神经网络与GUI,以及一点自己的看法)