實(shí)驗(yàn)9 BP神經(jīng)網(wǎng)絡(luò)
一、實(shí)驗(yàn)?zāi)康?/strong>
1:掌握BP神經(jīng)網(wǎng)絡(luò)的原理。
2:了解BP神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu),以及前向傳播和反向傳播的過(guò)程。
3:學(xué)會(huì)利用BP神經(jīng)網(wǎng)絡(luò)建立訓(xùn)練模型,并對(duì)模型進(jìn)行評(píng)估。即學(xué)習(xí)如何調(diào)用Sklearn中的BP神經(jīng)網(wǎng)絡(luò)。
4:學(xué)會(huì)使用BP神經(jīng)網(wǎng)絡(luò)做預(yù)測(cè)。
5:通過(guò)截圖和模型評(píng)估等方法對(duì)結(jié)果進(jìn)行分析,分析不同數(shù)據(jù)中學(xué)習(xí)率和隱層神經(jīng)元對(duì)與輸出結(jié)果的影響。
二、實(shí)驗(yàn)內(nèi)容
1:第一部分:
利用BP神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)對(duì)鳶尾花的分類和預(yù)測(cè),對(duì)數(shù)據(jù)進(jìn)行可視化,分析數(shù)據(jù)的特點(diǎn),建立模型,并對(duì)模型進(jìn)行評(píng)估。數(shù)據(jù)可通過(guò)下述代碼獲取。
pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data',?header=None) |
2:第二部分:
用BP神經(jīng)網(wǎng)絡(luò)做一個(gè)手寫數(shù)字的識(shí)別和預(yù)測(cè),實(shí)驗(yàn)可以先從小樣本嘗試訓(xùn)練和測(cè)試,然后再用大樣本進(jìn)行訓(xùn)練和測(cè)試,觀察兩者結(jié)果的差異性。本次實(shí)驗(yàn)給出的數(shù)據(jù)集是:mnist_train_100.csv(大樣本),mnist_test_10.csv(小樣本);mnist_train.csv, mnist_test.csv。數(shù)據(jù)椎間中每行是一個(gè)樣本,第一個(gè)元素是標(biāo)簽,后面784個(gè)元素是由28*28的圖片數(shù)據(jù)reshape為一行組成的。
三、實(shí)驗(yàn)結(jié)果與分析
1:第一部分(BP神經(jīng)網(wǎng)絡(luò)對(duì)鳶尾花進(jìn)行分類和預(yù)測(cè))
【1:加載和預(yù)處理數(shù)據(jù)】
在任務(wù)1中,通過(guò)pandas庫(kù)讀取鳶尾數(shù)據(jù)集的信息,并將各列屬性存入df.columns中,并提取特征和標(biāo)簽。通過(guò)train_test_split功能,以7:3的比例劃分訓(xùn)練集和測(cè)試集,并對(duì)其進(jìn)行標(biāo)準(zhǔn)化操作。整體代碼如下圖所示。
【2:數(shù)據(jù)可視化和分析】
在任務(wù)2中,通過(guò)調(diào)用seaborn庫(kù)對(duì)特征進(jìn)行對(duì)比,并畫出每?jī)蓚€(gè)特征之間的二維分布關(guān)系圖和各類鳶尾在當(dāng)前特征下的分布情況。整體代碼和數(shù)據(jù)集可視化結(jié)果如下圖所示,其中圖1為整體代碼,圖2為數(shù)據(jù)集可視化結(jié)果。
(圖1)
(圖2)
同時(shí),在任務(wù)2中創(chuàng)建了各個(gè)特征的直方圖,以驗(yàn)證上圖中的數(shù)據(jù)分布是否正確。整體代碼和直方圖可視化結(jié)果如下圖所示,其中圖1為整體代碼,圖2為花萼長(zhǎng)度直方圖,圖3為花萼寬度直方圖,圖4為花瓣長(zhǎng)度直方圖,圖5為花瓣寬度直方圖。
(圖1)
(圖2)
(圖3)
(圖4)
(圖5)
【3:構(gòu)建神經(jīng)網(wǎng)絡(luò)模型】
??? 在任務(wù)3中,調(diào)用sklearn庫(kù)中的多層感知器分類器(Multilayer Perceptron Classifier),創(chuàng)建BP神經(jīng)網(wǎng)絡(luò)模型。在神經(jīng)網(wǎng)絡(luò)中,設(shè)置初始學(xué)習(xí)速率為0.001,最大迭代次數(shù)為1000,設(shè)置2層神經(jīng)元個(gè)數(shù)均為10的隱藏層。整體代碼如下圖所示。
【4:訓(xùn)練模型】
在任務(wù)4中,調(diào)用fit來(lái)使用訓(xùn)練集對(duì)該模型進(jìn)行訓(xùn)練。整體代碼如下圖所示。
【5:評(píng)估模型】
在任務(wù)5中,計(jì)算該模型在訓(xùn)練集上的準(zhǔn)確率和在測(cè)試集上的準(zhǔn)確率,并輸出相應(yīng)的計(jì)算結(jié)果。整體代碼和輸出結(jié)果如下圖所示,其中圖1為整體代碼,圖2為程序輸出的計(jì)算結(jié)果(訓(xùn)練集準(zhǔn)確率為98%,測(cè)試集準(zhǔn)確率為98%)。
(圖1)
(圖2)
2:第二部分(BP神經(jīng)網(wǎng)絡(luò)對(duì)小規(guī)模手寫數(shù)字?jǐn)?shù)據(jù)集進(jìn)行識(shí)別和預(yù)測(cè))
【0:導(dǎo)入?yún)⒖紝?shí)驗(yàn)代碼】
??? 在任務(wù)0中,導(dǎo)入neuralNetwork類中的相關(guān)代碼。
【1:設(shè)置模型參數(shù)】
在任務(wù)1中,人工填入BP神經(jīng)網(wǎng)絡(luò)模型的輸入節(jié)點(diǎn)數(shù)、隱藏節(jié)點(diǎn)數(shù)、輸出層節(jié)點(diǎn)數(shù)、學(xué)習(xí)速率。整體代碼如下圖所示。
【2:創(chuàng)建神經(jīng)網(wǎng)絡(luò)實(shí)例】
??? 在任務(wù)2中,調(diào)用neuralNetwork類,傳入各類模型參數(shù)后賦給變量n,進(jìn)行模型的存儲(chǔ)。整體代碼如下圖所示。
【3:加載MNIST訓(xùn)練數(shù)據(jù)集】
?? 在任務(wù)3中,打開存儲(chǔ)訓(xùn)練集信息的csv文件,并加載到training_data_list中。整體代碼如下圖所示。
【4:數(shù)據(jù)集抽樣可視化】
在任務(wù)4中,利用隨機(jī)種子抽取一個(gè)樣本數(shù)據(jù),然后調(diào)用matplotlib庫(kù)進(jìn)行圖像展示,并標(biāo)注其真實(shí)的標(biāo)簽類別。整體代碼如下圖所示,其中圖1為整體代碼,圖2為抽樣輸出結(jié)果。
(圖1)
(圖2)
【5:訓(xùn)練神經(jīng)網(wǎng)絡(luò)】
在任務(wù)5中,首先設(shè)置模型訓(xùn)練的迭代次數(shù)epochs,然后通過(guò)外層for循環(huán)訓(xùn)練每一代模型。內(nèi)存for循環(huán)遍歷每一個(gè)訓(xùn)練集數(shù)據(jù),輸入特征首先轉(zhuǎn)換為浮點(diǎn)數(shù),然后歸一化到0.01到1.00的范圍內(nèi),以便準(zhǔn)備神經(jīng)網(wǎng)絡(luò)的輸入。同時(shí),將輸出結(jié)果的標(biāo)記正確的分類任務(wù)輸出節(jié)點(diǎn),最后調(diào)用神經(jīng)網(wǎng)絡(luò)類中的train()函數(shù)進(jìn)行訓(xùn)練。整體代碼如下圖所示。
【6:加載MNIST測(cè)試數(shù)據(jù)集】
在任務(wù)6中,打開存儲(chǔ)測(cè)試集信息的csv文件,并加載到test_data_list中。整體代碼如下圖所示。
【7:預(yù)測(cè)測(cè)試集】
??? 在任務(wù)7中,初始化預(yù)測(cè)的標(biāo)簽集合predicted_labels、數(shù)據(jù)點(diǎn)真實(shí)的標(biāo)簽集合actual_labels和模型預(yù)測(cè)正確的個(gè)數(shù)cnt。在for循環(huán)中,遍歷每一個(gè)測(cè)試集數(shù)據(jù),并對(duì)輸入和輸出做預(yù)處理,然后調(diào)用神經(jīng)網(wǎng)絡(luò)類中的query()函數(shù)進(jìn)行預(yù)測(cè),最后將預(yù)測(cè)結(jié)果的標(biāo)簽加入predicted_labels中。整體代碼如下圖所示。
【8:計(jì)算準(zhǔn)確率】
??? 在任務(wù)8中,對(duì)比predicted_labels和actual_labels中的每一個(gè)標(biāo)簽,如果對(duì)應(yīng)相等則cnt自增1,表明該數(shù)據(jù)點(diǎn)預(yù)測(cè)正確。最后計(jì)算準(zhǔn)確率,且公式為:準(zhǔn)確率 = 預(yù)測(cè)正確的個(gè)數(shù) / 訓(xùn)練集數(shù)據(jù)的總數(shù)。整體代碼和準(zhǔn)確率計(jì)算結(jié)果如下圖所示,其中圖1為整體代碼,圖2為計(jì)算的準(zhǔn)確率結(jié)果(分類的準(zhǔn)確率為0.7)。
(圖1)
(圖2)
【9:輸出混淆矩陣】
在任務(wù)9中,調(diào)用sklearn庫(kù)中的混淆矩陣(confusion matrix),對(duì)測(cè)試集上的預(yù)測(cè)結(jié)果進(jìn)行可視化顯示。其中,x軸為模型預(yù)測(cè)的標(biāo)簽值,y軸為真實(shí)數(shù)據(jù)的標(biāo)簽值。整體代碼、標(biāo)簽對(duì)比結(jié)果和混淆矩陣結(jié)果如下圖所示,其中圖1為整體代碼,圖2為程序輸出的標(biāo)簽對(duì)比結(jié)果,圖3為程序輸出的混淆矩陣結(jié)果。
(圖1)
(圖2)
(圖3)
由混淆矩陣可知,對(duì)角線上的結(jié)果均為預(yù)測(cè)正確的結(jié)果。預(yù)測(cè)錯(cuò)誤的結(jié)果有以下3個(gè)情況:5被預(yù)測(cè)為4、4被預(yù)測(cè)為9、9被預(yù)測(cè)為4。由此可知,5和4、4和9之間的手寫數(shù)據(jù)集容易被誤判。
2:第三部分(BP神經(jīng)網(wǎng)絡(luò)對(duì)大規(guī)模手寫數(shù)字?jǐn)?shù)據(jù)集進(jìn)行識(shí)別和預(yù)測(cè))
【數(shù)據(jù)集】
在本部分中,只需要修改csv文件路徑即可,因此不再贅述各部分操作。訓(xùn)練集和測(cè)試集路徑的修改如下表所示。
訓(xùn)練集路徑 |
training_data_file = open(r"C:\Users\86158\Desktop\mnist_train.csv") |
測(cè)試集路徑 |
test_data_file = open(r"C:\Users\86158\Desktop\mnist_test.csv") |
【混淆矩陣】
基于mnist_test.csv文件的測(cè)試集數(shù)據(jù)進(jìn)行預(yù)測(cè),預(yù)測(cè)的混淆矩陣結(jié)果如下圖所示??梢园l(fā)現(xiàn)大部分?jǐn)?shù)據(jù)都預(yù)測(cè)正確,位于混淆矩陣的主對(duì)角線上,部分?jǐn)?shù)據(jù)存在預(yù)測(cè)錯(cuò)誤的情況。真實(shí)值標(biāo)簽預(yù)測(cè)錯(cuò)誤分類不小于5個(gè)的有:2=>7、3=>5、4=>9、5=>3、5=>6、6=>0、6=>5、7=>2、7=>9、8=>0、9=>4。
【準(zhǔn)確率】
如下圖所示,計(jì)算的模型分類準(zhǔn)確率為98.13%。
整體來(lái)說(shuō),基于BP神經(jīng)網(wǎng)絡(luò)的mnist手寫數(shù)字?jǐn)?shù)據(jù)集分類具有較好的結(jié)果,模型的準(zhǔn)確度基本達(dá)到分類任務(wù)的要求。
四、遇到的問(wèn)題和解決方法
問(wèn)題1:一開始的混淆矩陣輸出錯(cuò)誤,無(wú)法顯示正確的標(biāo)簽值。錯(cuò)誤的結(jié)果如下圖所示。
解決1:上面的情況是由于向confusion_matrix只傳入了真實(shí)標(biāo)簽集合和預(yù)測(cè)標(biāo)簽集合,而測(cè)試集中沒(méi)有完全出現(xiàn)0~9這10個(gè)數(shù)字的數(shù)據(jù)。因此,需要向confusion_matrix額外傳入數(shù)據(jù)集可能的分類結(jié)果集合all_labels。關(guān)鍵代碼如下表所示:
# 生成混淆矩陣 all_labels = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] cm = confusion_matrix(actual_labels, predicted_labels, labels=all_labels) # 設(shè)置圖像大小 plt.figure(figsize=(10, 10)) # 創(chuàng)建熱圖 sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=all_labels, yticklabels=all_labels) |
五、實(shí)驗(yàn)討論
1:學(xué)習(xí)率對(duì)輸出結(jié)果的影響
【討論1】
??? 使用mnist小樣本數(shù)據(jù)集和第二部分實(shí)驗(yàn)的代碼,固定輸入節(jié)點(diǎn)數(shù)為784、隱藏層節(jié)點(diǎn)數(shù)為200、輸出節(jié)點(diǎn)數(shù)為10。由學(xué)習(xí)速率的變化所引起的模型分類準(zhǔn)確率的變化,如下表所示。
測(cè)試編號(hào) |
學(xué)習(xí)速率 |
模型分類準(zhǔn)確率 |
1 |
0.01 |
0.6 |
2 |
0.05 |
0.7 |
3 |
0.1 |
0.7 |
4 |
0.5 |
0.7 |
【測(cè)試編號(hào)1的輸出】
【測(cè)試編號(hào)2的輸出】
【測(cè)試編號(hào)3的輸出】
【測(cè)試編號(hào)4的輸出】
【討論2】
使用鳶尾數(shù)據(jù)集和第一部分實(shí)驗(yàn)的代碼,固定隱藏層1點(diǎn)數(shù)為10、隱藏層2點(diǎn)數(shù)為10、最大迭代次數(shù)為1000。由初始學(xué)習(xí)速率的變化所引起的模型分類準(zhǔn)確率的變化,如下表所示。
測(cè)試編號(hào) |
初始學(xué)習(xí)速率 |
模型分類準(zhǔn)確率 |
1 |
0.0001 |
0.62 |
2 |
0.0005 |
0.93 |
3 |
0.001 |
0.98 |
4 |
0.002 |
0.96 |
5 |
0.005 |
0.96 |
【測(cè)試編號(hào)1的輸出】
【測(cè)試編號(hào)2的輸出】
【測(cè)試編號(hào)3的輸出】
【測(cè)試編號(hào)4的輸出】
【測(cè)試編號(hào)5的輸出】
【總結(jié)】
??? 在其他參數(shù)不變的情況下,隨著學(xué)習(xí)速率的上升,訓(xùn)練集的準(zhǔn)確率不斷上升,而測(cè)試集的準(zhǔn)確率先上升后下降。這表明,學(xué)習(xí)速率會(huì)影響訓(xùn)練集的收斂速度和準(zhǔn)確率,并且當(dāng)學(xué)習(xí)速率過(guò)大時(shí)會(huì)產(chǎn)生過(guò)擬合現(xiàn)象,使得模型在測(cè)試集上的表現(xiàn)效果較差。
2:隱層神經(jīng)元對(duì)輸出結(jié)果的影響
【討論1】
使用mnist小樣本數(shù)據(jù)集和第二部分實(shí)驗(yàn)的代碼,固定輸入節(jié)點(diǎn)數(shù)為784、學(xué)習(xí)速率為0.1、輸出節(jié)點(diǎn)數(shù)為10。由隱藏層神經(jīng)元的變化所引起的模型分類準(zhǔn)確率的變化,如下表所示。
測(cè)試編號(hào) |
隱藏層神經(jīng)元數(shù) |
模型分類準(zhǔn)確率 |
1 |
10 |
0.6 |
2 |
40 |
0.6 |
3 |
60 |
0.7 |
4 |
100 |
0.7 |
5 |
200 |
0.7 |
6 |
1000 |
0.7 |
【測(cè)試編號(hào)1的輸出】
【測(cè)試編號(hào)2的輸出】
【測(cè)試編號(hào)3的輸出】
【測(cè)試編號(hào)4的輸出】
【測(cè)試編號(hào)5的輸出】
【測(cè)試編號(hào)6的輸出】
【討論2】
使用鳶尾數(shù)據(jù)集和第一部分實(shí)驗(yàn)的代碼,固定初始學(xué)習(xí)速率為0.001、最大迭代次數(shù)為500。由隱藏層神經(jīng)元的變化所引起的模型分類準(zhǔn)確率的變化,如下表所示。
測(cè)試編號(hào) |
隱藏層數(shù) |
各層的神經(jīng)元數(shù) |
模型分類準(zhǔn)確率 |
1 |
1 |
5 |
0.89 |
2 |
2 |
5,5 |
0.80 |
3 |
1 |
10 |
0.93 |
4 |
2 |
10,10 |
0.96 |
5 |
1 |
20 |
0.89 |
【測(cè)試編號(hào)1的輸出】
【測(cè)試編號(hào)2的輸出】
【測(cè)試編號(hào)3的輸出】
【測(cè)試編號(hào)4的輸出】
【測(cè)試編號(hào)5的輸出】
【測(cè)試編號(hào)6的輸出】
【總結(jié)】
??? 根據(jù)上述討論可知,過(guò)多或過(guò)少的神經(jīng)元都可能不利于模型的訓(xùn)練和性能。隱藏層神經(jīng)元在神經(jīng)網(wǎng)絡(luò)中的影響主要分為以下幾點(diǎn):
(1)捕捉數(shù)據(jù)復(fù)雜性的能力
隱層神經(jīng)元的數(shù)量和層數(shù)可以顯著影響網(wǎng)絡(luò)的能力來(lái)捕捉數(shù)據(jù)中的復(fù)雜關(guān)系和模式。較多的神經(jīng)元可以提供更強(qiáng)的模型容量,允許網(wǎng)絡(luò)學(xué)習(xí)更復(fù)雜的函數(shù)映射。
(2)過(guò)擬合風(fēng)險(xiǎn)
??? 如果隱層神經(jīng)元過(guò)多,可能會(huì)導(dǎo)致模型在訓(xùn)練數(shù)據(jù)上過(guò)于完美的擬合,從而降低了模型的泛化能力,即在新數(shù)據(jù)集上的表現(xiàn)性能不好。
(3)計(jì)算成本
??? 更多的隱層神經(jīng)元需要更多的參數(shù)來(lái)訓(xùn)練,會(huì)增加模型的計(jì)算負(fù)擔(dān),并可能需要更復(fù)雜的算法來(lái)避免訓(xùn)練中的梯度問(wèn)題(例如梯度消失或爆炸)。
(4)收斂速度
神經(jīng)元數(shù)量的增加可能會(huì)影響梯度下降的速度和穩(wěn)定性,進(jìn)而影響模型的收斂速度。
(5)信息丟失與重構(gòu)
每一層的隱層神經(jīng)元都在嘗試從前一層中提取信息并向下一層傳遞。如果隱層神經(jīng)元太少,可能會(huì)造成信息的丟失;如果神經(jīng)元太多,則可能會(huì)學(xué)習(xí)到數(shù)據(jù)中的噪聲。
3:在手寫數(shù)字的識(shí)別和預(yù)測(cè)中,大樣本數(shù)據(jù)集和小樣本數(shù)據(jù)集的差異
(1)泛化能力
大樣本數(shù)據(jù)集:通常能更好地代表問(wèn)題的整體分布,幫助模型學(xué)習(xí)更通用的規(guī)律,提高模型在未知數(shù)據(jù)上的泛化能力。
小樣本數(shù)據(jù)集:可能不足以捕捉數(shù)據(jù)的所有特征和變化,容易導(dǎo)致模型過(guò)擬合,即模型在訓(xùn)練數(shù)據(jù)上表現(xiàn)良好但在新數(shù)據(jù)上表現(xiàn)不佳。
(2)訓(xùn)練時(shí)間
大樣本數(shù)據(jù)集:模型需要處理更多的數(shù)據(jù),會(huì)需要更長(zhǎng)的時(shí)間來(lái)訓(xùn)練模型。
小樣本數(shù)據(jù)集:數(shù)據(jù)量較少,訓(xùn)練時(shí)間較短。
(3)性能和準(zhǔn)確度
大樣本數(shù)據(jù)集:由于數(shù)據(jù)量大,模型的性能和準(zhǔn)確度通常會(huì)更高。
小樣本數(shù)據(jù)集:可能因?yàn)閿?shù)據(jù)量不足而難以達(dá)到高準(zhǔn)確度,特別是在數(shù)據(jù)分布非常多樣化的任務(wù)中。
(4)數(shù)據(jù)多樣性和覆蓋范圍
大樣本數(shù)據(jù)集:通常能覆蓋更廣泛的樣本多樣性,包括各種不同的手寫風(fēng)格和變形。
小樣本數(shù)據(jù)集:可能缺乏多樣性,限制了模型學(xué)習(xí)數(shù)據(jù)的全貌。
六、實(shí)驗(yàn)總結(jié)
1:BP神經(jīng)網(wǎng)絡(luò)是一個(gè)前向多層網(wǎng)絡(luò),利用誤差反向傳播算法對(duì)網(wǎng)絡(luò)進(jìn)行訓(xùn)練。BP神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)由輸入層、隱藏層和輸出層構(gòu)成,結(jié)構(gòu)簡(jiǎn)單、可塑性強(qiáng)。
2:輸入層的節(jié)點(diǎn)只起到緩沖器的作用,負(fù)責(zé)把網(wǎng)絡(luò)的輸入數(shù)據(jù)傳遞給第一隱含層,因而各節(jié)點(diǎn)之間沒(méi)有傳遞函數(shù)的功能。BP神經(jīng)網(wǎng)絡(luò)的上下層之間實(shí)現(xiàn)全連接,而每層神經(jīng)元之間無(wú)連接。
七、程序源代碼
1:第一部分
import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import LabelEncoder, StandardScaler import matplotlib.pyplot as plt import seaborn as sns from sklearn.neural_network import MLPClassifier ################# 1:加載和預(yù)處理數(shù)據(jù) ################# # 加載數(shù)據(jù) url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data' df = pd.read_csv(url, header=None) df.columns = ['Sepal Length', 'Sepal Width', 'Petal Length', 'Petal Width', 'Species'] # 提取特征和標(biāo)簽 X = df.iloc[:, 0:4].values y = df.iloc[:, 4].values # 編碼標(biāo)簽 label_encoder = LabelEncoder() y = label_encoder.fit_transform(y) # 劃分訓(xùn)練集和測(cè)試集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1) # 特征縮放 scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) ################# 2:數(shù)據(jù)可視化和分析 ################# # 使用Seaborn對(duì)特征進(jìn)行對(duì)比 sns.pairplot(df, hue='Species', vars=df.columns[0:4]) plt.show()文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-781691.html # 特征列表 features = df.columns[:4] # 創(chuàng)建直方圖 for feature in features: ? ? plt.figure() ? ? sns.histplot(df[feature], kde=True) ? ? plt.title(f'Distribution of {feature}') ? ? plt.show() ################# 3:構(gòu)建神經(jīng)網(wǎng)絡(luò)模型 ################# # 創(chuàng)建神經(jīng)網(wǎng)絡(luò)模型————多層感知器分類器(Multilayer Perceptron Classifier) model = MLPClassifier(hidden_layer_sizes=(10, 10), max_iter=1000, learning_rate_init=0.001) ################# 4:訓(xùn)練模型 ################# # 訓(xùn)練模型 model.fit(X_train, y_train) ################# 5:評(píng)估模型 ################# # 評(píng)估模型 train_accuracy = model.score(X_train, y_train) print(f"train數(shù)據(jù)集準(zhǔn)確率: {train_accuracy:.2f}") test_accuracy = model.score(X_test, y_test) print(f"test數(shù)據(jù)集準(zhǔn)確率: {test_accuracy:.2f}") |
2:第二部分
import numpy as np import scipy.special as S import matplotlib.pyplot as plt from sklearn.metrics import confusion_matrix import seaborn as sns import random class neuralNetwork: ? ? #初始化神經(jīng)網(wǎng)絡(luò),構(gòu)造函數(shù) ? ? def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate): ? ? ? ? #設(shè)置每個(gè)輸入、隱藏、輸出層中的節(jié)點(diǎn)數(shù) ? ? ? ? self.inodes = inputnodes ? ? ? ? self.hnodes = hiddennodes ? ? ? ? self.onodes = outputnodes ? ? ? ? #鏈接權(quán)重矩陣,wih和who ? ? ? ? self.wih = np.random.normal(0.0, pow(self.inodes, -0.5), (self.hnodes, self.inodes)) ? ? ? ? self.who = np.random.normal(0.0, pow(self.hnodes, -0.5), (self.onodes, self.hnodes)) ? ? ? ? #學(xué)習(xí)率 ? ? ? ? self.lr = learningrate ? ? ? ? #創(chuàng)建激活函數(shù)(函數(shù)的另一種定義方法,這樣以后可以直接調(diào)用) ? ? ? ? self.activation_function = lambda x: S.expit(x) ? ? #訓(xùn)練神經(jīng)網(wǎng)絡(luò) ? ? def train(self, inputs_list, targets_list): ? ? ? ? #將輸入列表轉(zhuǎn)換成二維數(shù)組 ? ? ? ? inputs = np.array(inputs_list, ndmin = 2).T ? ? ? ? targets = np.array(targets_list, ndmin = 2).T ? ? ? ? #將輸入信號(hào)計(jì)算到隱藏層 ? ? ? ? hidden_inputs = np.dot(self.wih, inputs) ? ? ? ? #計(jì)算隱藏層中輸出的信號(hào)(使用激活函數(shù)計(jì)算) ? ? ? ? hidden_outputs = self.activation_function(hidden_inputs) ? ? ? ? #將傳輸?shù)男盘?hào)計(jì)算到輸出層 ? ? ? ? final_inputs = np.dot(self.who, hidden_outputs) ? ? ? ? #計(jì)算輸出層中輸出的信號(hào)(使用激活函數(shù)) ? ? ? ? final_outputs = self.activation_function(final_inputs) ? ? ? ? #計(jì)算輸出層的誤差:(target - actual)(預(yù)期目標(biāo)輸出值-實(shí)際計(jì)算得到的輸出值) ? ? ? ? output_errors = targets - final_outputs ? ? ? ? #隱藏層的誤差:是輸出層誤差按權(quán)重分割,在隱藏節(jié)點(diǎn)上重新組合 ? ? ? ? hidden_errors = np.dot(self.who.T, output_errors*final_outputs*(1.0 - final_outputs)) ? ? ? ? #反向傳播,更新各層權(quán)重 ? ? ? ? #更新隱層和輸出層之間的權(quán)重 ? ? ? ? self.who += self.lr*np.dot((output_errors*final_outputs*(1.0 - final_outputs)), np.transpose(hidden_outputs)) ? ? ? ? self.wih += self.lr*np.dot((hidden_errors*hidden_outputs*(1.0 - hidden_outputs)), np.transpose(inputs)) ? ? def query(self, inputs_list): ? ? ? ? #將輸入列表轉(zhuǎn)換成二維數(shù)組 ? ? ? ? inputs = np.array(inputs_list, ndmin = 2).T ? ? ? ? hidden_inputs = np.dot(self.wih, inputs) ? ? ? ? hidden_outputs = self.activation_function(hidden_inputs) ? ? ? ? final_inputs = np.dot(self.who, hidden_outputs) ? ? ? ? final_outputs = self.activation_function(final_inputs) ? ? ? ? return final_outputs # 設(shè)置輸入、隱藏、輸出層中的節(jié)點(diǎn)數(shù),和學(xué)習(xí)率 input_nodes = 784 ? # 根據(jù)一開始的圖像特征數(shù)決定 hidden_nodes = 200 output_nodes = 10 ? # 根據(jù)最后的分類決定 learning_rate = 0.1 # 創(chuàng)建神經(jīng)網(wǎng)絡(luò)實(shí)例 n = neuralNetwork(input_nodes, hidden_nodes, output_nodes, learning_rate) # 加載MNIST訓(xùn)練數(shù)據(jù)集 training_data_file = open(r"C:\Users\86158\Desktop\mnist_train_100.csv") training_data_list = training_data_file.readlines() training_data_file.close() # 隨機(jī)選擇一個(gè)樣本 random_index = random.randint(0, len(training_data_list) - 1) all_values = training_data_list[random_index].split(',') image_array = np.asfarray(all_values[1:]).reshape((28,28)) # 可視化選中的樣本 plt.imshow(image_array, cmap='Greys', interpolation='None') plt.title("Label: " + all_values[0]) plt.show() # 訓(xùn)練神經(jīng)網(wǎng)絡(luò) epochs = 50 for e in range(epochs): ? ? for record in training_data_list: ? ? ? ? all_values = record.split(',') ? ? ? ? inputs = (np.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01 ? ? ? ? targets = np.zeros(output_nodes) + 0.01 ? ? ? ? targets[int(all_values[0])] = 0.99 ? ? ? ? n.train(inputs, targets) # 加載MNIST測(cè)試數(shù)據(jù)集 test_data_file = open(r"C:\Users\86158\Desktop\mnist_test_10.csv") test_data_list = test_data_file.readlines() test_data_file.close() # 預(yù)測(cè)測(cè)試集 predicted_labels = [] actual_labels = [] cnt = 0 for record in test_data_list: ? ? all_values = record.split(',') ? ? actual_label = int(all_values[0]) ? ? actual_labels.append(actual_label) ? ? inputs = (np.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01 ? ? outputs = n.query(inputs) ? ? predicted_label = np.argmax(outputs) ? ? predicted_labels.append(predicted_label) # 計(jì)算準(zhǔn)確率 for i in range(len(predicted_labels)): ? ? if actual_labels[i] == predicted_labels[i]: ? ? ? ? cnt += 1 accuracy = float(cnt / len(predicted_labels)) print("分類的準(zhǔn)確率:",accuracy) # 打印標(biāo)簽 print("真實(shí)值標(biāo)簽:",actual_labels) print("預(yù)測(cè)值標(biāo)簽:",predicted_labels) # 生成混淆矩陣 all_labels = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] cm = confusion_matrix(actual_labels, predicted_labels, labels=all_labels) # 設(shè)置圖像大小 plt.figure(figsize=(10, 10)) # 創(chuàng)建熱圖 sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=all_labels, yticklabels=all_labels) plt.xlabel('Predicted Labels') plt.ylabel('True Labels') plt.title('Confusion Matrix')文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-781691.html plt.show() |
到了這里,關(guān)于【人工智能Ⅰ】實(shí)驗(yàn)9:BP神經(jīng)網(wǎng)絡(luò)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!