BP神经网络分类问题(含matlab仿真)
BP神經網絡進行模式識別
具體的BP神經網絡詳細說明請參考博客:https://www.jianshu.com/p/3d96dbf3f764
神經網絡的基礎編程可參考博客:https://www.cnblogs.com/heaad/archive/2011/03/07/1976443.html
例題詳解
利用BP網絡進行模式識別,訓練樣本如下:
最后測試的樣本為輸入:
1 0
0.5 0.5
0.1 1
那么我們這次使用的是matlab編程來訓練該神經網絡達到分類的效果
由于數據太簡單,對輸入數據沒必要進行預處理或者歸一化,若其他項目需要用到,請參考博客:
https://blog.csdn.net/qq_42517365/article/details/102924232
首先我們輸入訓練集
訓練集的text的文本格式如下:
input1和input2中為矩陣:
[ 1 [ 0
0 0
0 ] 1 ]
input1 input2
其中class即為輸出:
[ 1
0
-1 ]
由于博主實驗過后,若是輸出我們直接用一個3x1的矩陣進行輸出,也就是標簽用這三個數字來訓練的話,會陷入局部最優的情況,因為數據庫太少了,于是我使用另一種方式表達,分類總共為3類,則第一類為-1,第二類為0,第三類為1,我們用一個3x3的矩陣來表示,若輸出為:
1 0 0
則為第一類別,對應輸出為-1;
若輸出為:
0 1 0
則為第二類別,對應輸出為0;
若輸出為:
0 0 1
則為第三類別,對應輸出為1。
因此我們則需先建立3x3的輸出矩陣:
循環中的是將訓練集中的對應輸出放入這個矩陣中。
然后我們建立bp神經網絡:
net = newff(minmax(input),[6 3],{'logsig' 'logsig'},'traingdx');%此處為一個隱藏層為六個神經元的網絡,輸出為三個 net.trainparam.show = 1;%一步一顯示 net.trainParam.min_grad=1e-30;%最低梯度值設置 net.trainparam.epochs=5000;%步進數 net.trainparam.goal=0.00000000001;%誤差最小值 net.trainParam.lr=0.01;%學習率隨后我們開始訓練網絡:
net=train(net,input,output');%沒什么講的,自己看訓練結束后我們可以測試一下網絡是否真的訓練完了
最好的方法就是用訓練集中的數據進行測試,若是訓練完成,那么識別率應該是百分百的
隨后我們完成題目的要求,對測試集的樣本進行分類:
%計算數值 [c1,c2]=textread('test.txt','%n%n',3); cinput=[c1,c2]'; S=sim(net,cinput);得到s為:
可以看到第一個數據為第三類
第二個數據為第二類
第三個數據為第一類
因此輸入1 0的輸出為1
輸入0.5 0.5的輸出為0
輸入0.1 1的輸出為-1
到此bp神經網絡分類的任務完成,以下是完整的程序代碼。
clear all close all load data1.dat [input1,input2,class]=textread('data1.txt','%n%n%n',3); %[input,mini,maxl]=premnmx([input1,input2]');%歸一化處理 input=[input1,input2]'; s=length(class); Ouput=zeros(s,3); %設置輸出標志的矩陣 for i=1:snum_ji=class(i)+2output(i,num_ji)=1; end net = newff(minmax(input),[6 3],{'logsig' 'logsig'},'traingdx'); net.trainparam.show = 1; net.trainParam.min_grad=1e-30; net.trainparam.epochs=5000; net.trainparam.goal=0.00000000001; net.trainParam.lr=0.01; net=train(net,input,output'); %識別率檢測 testinput=[input1,input2]'; Y=sim(net,testinput); [s1,s2] = size(Y) ; hitNum = 0 ; for i = 1 : s2[m,Index]= max(Y(:,i));[m1,Index1]=max(output(:,i));if(Index ==Index1) hitNum =hitNum + 1 ;end end sprintf('識別率是 %3.3f%%',100 * hitNum / s2 ) %計算數值 [c1,c2]=textread('test.txt','%n%n',3); cinput=[c1,c2]'; S=sim(net,cinput);訓練圖像
補充:
博主也嘗試了直接將題干的輸出作為標簽進行訓練但是都無法收斂,以下是程序:
load data1.dat [input1,input2,class]=textread('data1.txt','%n%n%n',3); %[input,mini,maxl]=premnmx([input1,input2]'); [input,minl,maxl]=premnmx([input1,input2]'); net = newff(minmax(input),[10 1],{'logsig' 'logsig'},'traingdx'); net.trainparam.show = 50; net.trainParam.min_grad=1e-30; net.trainparam.epochs=10000; net.trainparam.goal=0.01; net.trainParam.lr=0.01; net=train(net,input,class'); %識別率檢測 testinput=[input1,input2]'; Y=sim(net,testinput); %Y=round(Y);%sprintf('識別率是 %3.3f%%',100 * hitNum / s2 ) %計算數值 [c1,c2]=textread('test.txt','%n%n',2); cinput=[c1,c2]'; S=sim(net,cinput);若有高手能看出問題,也歡迎評論指出。是無論迭代次數和調參誤差都無法下降。
訓練圖像如下:
總結
以上是生活随笔為你收集整理的BP神经网络分类问题(含matlab仿真)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: lstm模型_基于LSTM模型的学生反馈
- 下一篇: MARIADB数据库服务器