日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > 循环神经网络 >内容正文

循环神经网络

BP神经网络分类问题(含matlab仿真)

發布時間:2023/12/20 循环神经网络 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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
首先我們輸入訓練集

[input1,input2,class]=textread('data1.txt','%n%n%n',3);

訓練集的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的輸出矩陣:
循環中的是將訓練集中的對應輸出放入這個矩陣中。

s=length(class); Ouput=zeros(s,3); %設置輸出標志的矩陣 for i=1:snum_ji=class(i)+2output(i,num_ji)=1; end

然后我們建立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');%沒什么講的,自己看

訓練結束后我們可以測試一下網絡是否真的訓練完了
最好的方法就是用訓練集中的數據進行測試,若是訓練完成,那么識別率應該是百分百的

testinput=[input1,input2]';%測試集就選擇原有的訓練集 Y=sim(net,testinput);%進行測試 [s1,s2] = size(Y) ;%存放Y的行和列的值 hitNum = 0 ;%識別正確個數 for i = 1 : s2[m,Index]= max(Y(:,i));%存放Y每列最大值和最大值所在列的位置[m1,Index1]=max(output(:,i));%存放output最大值和最大值做所在列的位置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);

得到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仿真)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。