用淺層神經(jīng)網(wǎng)絡(luò)擬合數(shù)據(jù)
神經(jīng)網(wǎng)絡(luò)擅長擬合功能延刘。 實(shí)際上,有證據(jù)表明极谊,相當(dāng)簡單的神經(jīng)網(wǎng)絡(luò)可以滿足任何實(shí)際功能诡右。
例如,假設(shè)您有一家健康診所的數(shù)據(jù)轻猖。 您想要設(shè)計(jì)一個(gè)網(wǎng)絡(luò)帆吻,該網(wǎng)絡(luò)可以根據(jù)13個(gè)解剖測量結(jié)果預(yù)測一個(gè)人的體內(nèi)脂肪百分比。 您總共有252個(gè)示例人員咙边,您為其擁有這13項(xiàng)數(shù)據(jù)及其相關(guān)的體內(nèi)脂肪百分比猜煮。
您可以通過兩種方式解決此問題:
?使用圖形用戶界面nftool,如第1-36頁的“使用神經(jīng)網(wǎng)絡(luò)擬合應(yīng)用程序”中所述败许。
?使用命令行功能王带,如第1-51頁的“使用命令行功能”中所述。
通常最好先從GUI開始市殷,然后使用GUI自動(dòng)生成命令行腳本愕撰。 使用任何一種方法之前,請先通過選擇數(shù)據(jù)集來定義問題醋寝。 每個(gè)GUI都可以訪問許多示例數(shù)據(jù)集搞挣,您可以使用這些示例數(shù)據(jù)來試用工具箱(請參閱“淺層神經(jīng)網(wǎng)絡(luò)的示例數(shù)據(jù)集”)。 如果您有要解決的特定問題音羞,可以將自己的數(shù)據(jù)加載到工作區(qū)中囱桨。 下一節(jié)描述數(shù)據(jù)格式。
- 定義問題
要定義工具箱的擬合問題嗅绰,請將一組Q輸入向量排列為矩陣中的列舍肠。 然后,將另一組Q目標(biāo)向量(每個(gè)輸入向量的正確輸出向量)排列到第二矩陣中(有關(guān)靜態(tài)和時(shí)序數(shù)據(jù)的數(shù)據(jù)格式的詳細(xì)說明办陷,請參見“數(shù)據(jù)結(jié)構(gòu)”)貌夕。 例如,您可以為布爾AND門定義擬合問題民镜,該邏輯與門具有四組兩元素輸入向量和一個(gè)元素目標(biāo)啡专,如下所示:
inputs = [0 1 0 1; 0 0 1 1];
targets = [0 0 0 1];
下一部分顯示了如何使用神經(jīng)網(wǎng)絡(luò)擬合應(yīng)用程序nftool訓(xùn)練網(wǎng)絡(luò)以擬合數(shù)據(jù)集。 本示例使用工具箱隨附的身體脂肪數(shù)據(jù)集制圈。
使用神經(jīng)網(wǎng)絡(luò)擬合應(yīng)用
1 使用以下命令打開神經(jīng)網(wǎng)絡(luò)啟動(dòng)GUI:
nnstart
2單擊配件應(yīng)用程序以打開神經(jīng)網(wǎng)絡(luò)配件應(yīng)用程序们童。 (您也可以使用命令nftool畔况。)
3單擊“下一步”繼續(xù)。
4在“選擇數(shù)據(jù)”窗口中慧库,單擊“加載示例數(shù)據(jù)集”跷跪。 擬合數(shù)據(jù)集選擇器窗口打開。
注意當(dāng)需要從MATLAB工作區(qū)加載數(shù)據(jù)時(shí)齐板,請使用“選擇數(shù)據(jù)”窗口中的“輸入和目標(biāo)”選項(xiàng)吵瞻。
5選擇 Chemical,然后單擊import甘磨。 這將使您返回“選擇數(shù)據(jù)”窗口橡羞。
6單擊“下一步”以顯示“驗(yàn)證和測試數(shù)據(jù)”窗口,如下圖所示济舆。
驗(yàn)證和測試數(shù)據(jù)集分別設(shè)置為原始數(shù)據(jù)的15%卿泽。
通過這些設(shè)置,輸入向量和目標(biāo)向量將被隨機(jī)分為三組滋觉,如下所示:
?70%用于訓(xùn)練签夭。
?15%將用于驗(yàn)證網(wǎng)絡(luò)是否泛化,并在過度擬合之前停止訓(xùn)練椎侠。
?最后的15%將用作網(wǎng)絡(luò)泛化的完全獨(dú)立測試第租。
7 單擊下一步。
用于功能擬合的標(biāo)準(zhǔn)網(wǎng)絡(luò)是兩層前饋網(wǎng)絡(luò)肺蔚,在隱藏層具有S型傳遞函數(shù)煌妈,在輸出層具有線性傳遞函數(shù)儡羔。 隱藏神經(jīng)元的默認(rèn)數(shù)量設(shè)置為10宣羊。如果網(wǎng)絡(luò)訓(xùn)練性能較差,則可能需要稍后增加該數(shù)量汰蜘。
8單擊“下一步”仇冯。
9選擇一種訓(xùn)練算法,然后單擊“訓(xùn)練”族操。
對于大多數(shù)問題苛坚,建議使用Levenberg-Marquardt(trainlm),但對于某些嘈雜和小問題色难,建議使用貝葉斯正則化(trainbr)花費(fèi)更長的時(shí)間泼舱,但可以獲得更好的解決方案。 但是枷莉,對于大問題娇昙,建議使用比例共軛梯度(trainscg),因?yàn)樗褂锰荻扔?jì)算笤妙,比其他兩種算法使用的雅可比計(jì)算的存儲效率更高冒掌。 本示例使用默認(rèn)的LevenbergMarquardt噪裕。 (這是一些計(jì)算梯度的方法)
訓(xùn)連持續(xù)進(jìn)行,直到驗(yàn)證錯(cuò)誤未能減少六次迭代(驗(yàn)證停止)為止股毫。
10在“plots”下膳音,單擊“Regression”。 這用于驗(yàn)證網(wǎng)絡(luò)性能铃诬。
以下回歸圖顯示了針對訓(xùn)練祭陷,驗(yàn)證和測試集目標(biāo)的網(wǎng)絡(luò)輸出。 為了達(dá)到最佳擬合趣席,數(shù)據(jù)應(yīng)沿著45度線落下颗胡,網(wǎng)絡(luò)輸出應(yīng)等于目標(biāo)。 對于此問題吩坝,所有數(shù)據(jù)集的擬合度都相當(dāng)好毒姨,R值分別為0.93或更高。 如果需要更準(zhǔn)確的結(jié)果钉寝,則可以通過在nftool中單擊“Retrain”來重新訓(xùn)練網(wǎng)絡(luò)弧呐。 這將改變網(wǎng)絡(luò)的初始權(quán)重和偏差,并且在重新訓(xùn)練后可以產(chǎn)生改進(jìn)的網(wǎng)絡(luò)嵌纲。 在以下窗格中提供了其他選項(xiàng)俘枫。
1 查看錯(cuò)誤直方圖以獲得網(wǎng)絡(luò)性能的其他驗(yàn)證。
在“plot”窗格下逮走,單擊“Error Histogram”鸠蚪。
藍(lán)色條形代表訓(xùn)練數(shù)據(jù),綠色條形代表驗(yàn)證數(shù)據(jù)师溅,紅色條形代表測試數(shù)據(jù)茅信。 直方圖可以為您提供離群值的指示,離群值是擬合度明顯比大多數(shù)數(shù)據(jù)差的數(shù)據(jù)點(diǎn)墓臭。 在這種情況下蘸鲸,您可以看到雖然大多數(shù)錯(cuò)誤都在-5到5之間,但是有一個(gè)訓(xùn)練點(diǎn)的錯(cuò)誤值為17窿锉,而驗(yàn)證點(diǎn)的錯(cuò)誤值為12和13酌摇。
這些異常值在測試回歸圖上也可見。 第一個(gè)對應(yīng)于該點(diǎn)的目標(biāo)是50嗡载,輸出接近33窑多。最好檢查異常值以確定數(shù)據(jù)是否不好,或者這些數(shù)據(jù)點(diǎn)是否與其余數(shù)據(jù)集不同洼滚。 如果離群值是有效數(shù)據(jù)點(diǎn)埂息,但與其余數(shù)據(jù)不同,則網(wǎng)絡(luò)將為這些點(diǎn)外推。 您應(yīng)該收集更多看起來像異常值的數(shù)據(jù)耿芹,然后重新訓(xùn)練網(wǎng)絡(luò)崭篡。
2在“神經(jīng)網(wǎng)絡(luò)擬合應(yīng)用程序”中單擊“下一步”以評估網(wǎng)絡(luò)。
此時(shí)吧秕,您可以針對新數(shù)據(jù)測試網(wǎng)絡(luò)琉闪。
如果您對原始或新數(shù)據(jù)的網(wǎng)絡(luò)性能不滿意,可以執(zhí)行以下操作之一:
?再次訓(xùn)練砸彬。
?增加神經(jīng)元的數(shù)量颠毙。
?獲得更大的訓(xùn)練數(shù)據(jù)集。
如果訓(xùn)練集的性能良好砂碉,但測試集的性能卻明顯較差蛀蜜,這可能表明過擬合,那么減少神經(jīng)元數(shù)量可以改善結(jié)果增蹭。 如果訓(xùn)練效果不佳滴某,則可能需要增加神經(jīng)元的數(shù)量。
3 如果您對網(wǎng)絡(luò)性能滿意滋迈,請單擊“下一步”霎奢。
4 使用此面板生成用于模擬神經(jīng)網(wǎng)絡(luò)的MATLAB函數(shù)或Simulink?圖。 您可以使用生成的代碼或圖表更好地了解神經(jīng)網(wǎng)絡(luò)如何計(jì)算輸入的輸出饼灿,或者使用MATLAB Compiler?工具和其他MATLAB代碼生成工具來部署網(wǎng)絡(luò)幕侠。
5 使用此屏幕上的按鈕來生成腳本或保存結(jié)果。
?您可以單擊“Simple Script”或“Advanced Script”來創(chuàng)建MATLAB代碼碍彭,該代碼可用于從命令行重現(xiàn)之前的所有步驟晤硕。如果您想學(xué)習(xí)如何使用工具箱的命令行功能來自定義訓(xùn)練過程,創(chuàng)建MATLAB代碼可能會(huì)有所幫助庇忌。 在第1-51頁的“使用命令行功能”中舞箍,您將更詳細(xì)地研究生成的腳本。
?您也可以將網(wǎng)絡(luò)另存為工作區(qū)中的網(wǎng)絡(luò)漆枚。 您可以對其執(zhí)行其他測試创译,也可以將其用于新輸入抵知。
6創(chuàng)建MATLAB代碼并保存結(jié)果后墙基,單擊Finish。
使用命令行功能
學(xué)習(xí)如何使用工具箱的命令行功能的最簡單方法是從GUI生成腳本刷喜,然后對其進(jìn)行修改以自定義網(wǎng)絡(luò)訓(xùn)練残制。
作為示例,請看在上一節(jié)的步驟14中創(chuàng)建的簡單腳本掖疮。
% Solve an Input-Output Fitting problem with a Neural Network % Script generated by NFTOOL % % This script assumes these variables are defined: % % houseInputs - input data.
% houseTargets - target data.
inputs = houseInputs;
targets = houseTargets;
% Create a Fitting Network
hiddenLayerSize = 10;
net = fitnet(hiddenLayerSize); % Set up Division of Data for Training, Validation, Testing
net.divideParam.trainRatio = 70/100; net.divideParam.valRatio = 15/100; net.divideParam.testRatio = 15/100;
% Train the Network
[net,tr] = train(net,inputs,targets);
% Test the Network
outputs = net(inputs);
errors = gsubtract(outputs,targets);
performance = perform(net,targets,outputs)
% View the Network
view(net)
% Plots
% Uncomment these lines to enable various plots.
% figure, plotperform(tr)
% figure, plottrainstate(tr)
% figure, plotfit(targets,outputs)
您可以保存腳本初茶,然后從命令行運(yùn)行它以重現(xiàn)上一個(gè)GUI會(huì)話的結(jié)果。 您還可以編輯腳本以自定義訓(xùn)練過程浊闪。 在這種情況下恼布,請按照腳本中的每個(gè)步驟進(jìn)行操作螺戳。
- 該腳本假定輸入向量和目標(biāo)向量已經(jīng)加載到工作空間中。 如果未加載數(shù)據(jù)折汞,則可以按以下方式加載它們:
load bodyfat_dataset
inputs = bodyfatInputs;
targets = bodyfatTargets;
此數(shù)據(jù)集是工具箱中一部分的示例數(shù)據(jù)集(請參閱第1-137頁的“淺層神經(jīng)網(wǎng)絡(luò)的示例數(shù)據(jù)集”)倔幼。 通過輸入命令help nndatasets,可以查看所有可用數(shù)據(jù)集的列表爽待。 load命令還允許您使用自己的變量名從任何這些數(shù)據(jù)集中加載變量损同。 例如,命令
[inputs,targets] = bodyfat_dataset;
將人體脂肪輸入加載到數(shù)組輸入中鸟款,并將人體脂肪目標(biāo)加載到數(shù)組目標(biāo)中膏燃。
2創(chuàng)建一個(gè)網(wǎng)絡(luò)。 函數(shù)擬合(或回歸)問題的默認(rèn)網(wǎng)絡(luò)fitnet是前饋網(wǎng)絡(luò)何什,在隱藏層具有默認(rèn)的tan-Sigmoid傳遞函數(shù)组哩,在輸出層具有線性傳遞函數(shù)。 您為上一節(jié)中的一個(gè)隱藏層分配了十個(gè)神經(jīng)元(有些隨意)处渣。 該網(wǎng)絡(luò)具有一個(gè)輸出神經(jīng)元禁炒,因?yàn)槊總€(gè)輸入向量只有一個(gè)目標(biāo)值。
hiddenLayerSize = 10;
net = fitnet(hiddenLayerSize);
注意:更多的神經(jīng)元需要更多的計(jì)算霍比,并且當(dāng)數(shù)字設(shè)置得太高時(shí)幕袱,它們傾向于使數(shù)據(jù)過擬合,但是它們使網(wǎng)絡(luò)能夠解決更復(fù)雜的問題悠瞬。 更多的層需要更多的計(jì)算们豌,但是它們的使用可能會(huì)導(dǎo)致網(wǎng)絡(luò)更有效地解決復(fù)雜的問題。 要使用多個(gè)隱藏層浅妆,請?jiān)趂itnet命令中輸入隱藏層大小作為數(shù)組的元素望迎。
3設(shè)置數(shù)據(jù)劃分。
net.divideParam.trainRatio = 70/100; net.divideParam.valRatio = 15/100; net.divideParam.testRatio = 15/100;
通過這些設(shè)置凌外,輸入向量和目標(biāo)向量將被隨機(jī)劃分辩尊,其中70%用于訓(xùn)練,15%用于驗(yàn)證康辑,而15%用于測試摄欲。 (有關(guān)數(shù)據(jù)劃分過程的更多討論,請參見“劃分?jǐn)?shù)據(jù)”疮薇。)
4訓(xùn)練網(wǎng)絡(luò)胸墙。 網(wǎng)絡(luò)使用默認(rèn)的Levenberg-Marquardt算法(trainlm)進(jìn)行訓(xùn)練。 對于Levenberg-Marquardt無法獲得所需的準(zhǔn)確結(jié)果的問題按咒,或者對于大數(shù)據(jù)問題迟隅,請考慮分別將網(wǎng)絡(luò)訓(xùn)練功能設(shè)置為貝葉斯正則化(trainbr)或縮放共軛梯度(trainscg),
net.trainFcn = 'trainbr';
net.trainFcn = 'trainscg';
要訓(xùn)??練網(wǎng)絡(luò),請輸入:
[net, tr] = train(net, inputs, targets);
在訓(xùn)練期間智袭,將打開以下訓(xùn)練窗口奔缠。 該窗口顯示訓(xùn)練進(jìn)度,并允許您通過單擊“停止訓(xùn)練”隨時(shí)中斷訓(xùn)練吼野。
5測試網(wǎng)絡(luò)添坊。 訓(xùn)練完網(wǎng)絡(luò)后,您可以使用它來計(jì)算網(wǎng)絡(luò)輸出箫锤。 以下代碼計(jì)算網(wǎng)絡(luò)輸出贬蛙,錯(cuò)誤和整體性能。
outputs = net(inputs);
errors = gsubtract(targets, outputs);
performance = perform(net, targets, outputs)
通過使用位于訓(xùn)練記錄中的測試索引谚攒,也可以僅在測試集上計(jì)算網(wǎng)絡(luò)性能阳准。
tInd = tr.testInd;
tstOutputs = net(inputs(:, tInd));
tstPerform = perform(net,targets(tInd),tstOutputs)
對網(wǎng)絡(luò)響應(yīng)進(jìn)行一些分析。 如果在訓(xùn)練窗口中單擊Regression馏臭,則可以在網(wǎng)絡(luò)輸出和相應(yīng)目標(biāo)之間執(zhí)行線性回歸野蝇。
下圖顯示了結(jié)果。
輸出可以很好地跟蹤目標(biāo)以進(jìn)行訓(xùn)練括儒,測試和驗(yàn)證绕沈,并且總響應(yīng)的R值超過0.96。 如果需要更精確的結(jié)果帮寻,則可以嘗試以下任何一種方法:?使用init將初始網(wǎng)絡(luò)權(quán)重和偏差重置為新值乍狐,然后再次進(jìn)行訓(xùn)練(請參閱“初始化權(quán)重”(init))。
?增加隱藏神經(jīng)元的數(shù)量固逗。
?增加訓(xùn)練向量的數(shù)量浅蚪。
?如果有更多相關(guān)信息,請?jiān)黾虞斎胫档臄?shù)量烫罩。
?嘗試其他訓(xùn)練算法(請參閱“訓(xùn)練算法”)惜傲。
在這種情況下,網(wǎng)絡(luò)響應(yīng)令人滿意贝攒,您現(xiàn)在可以將網(wǎng)絡(luò)用于新輸入盗誊。
7查看網(wǎng)絡(luò)圖。
view(net)
要獲得更多有關(guān)命令行操作的經(jīng)驗(yàn)隘弊,請嘗試以下一些任務(wù):?在訓(xùn)練過程中哈踱,打開一個(gè)繪圖窗口(例如回歸繪圖),并觀看其動(dòng)畫长捧。
?使用諸如plotfit嚣鄙,plotregression,plottrainstate和plotperform之類的功能從命令行進(jìn)行打印串结。 (有關(guān)使用這些功能的更多信息,請參見其參考頁。)另外肌割,從命令行進(jìn)行培訓(xùn)時(shí)卧蜓,請參閱高級腳本以獲取更多選項(xiàng)。
每次訓(xùn)練神經(jīng)網(wǎng)絡(luò)時(shí)把敞,由于不同的初始權(quán)重和偏差值以及對訓(xùn)練弥奸,驗(yàn)證和測試集。 結(jié)果奋早,針對相同問題訓(xùn)練的不同神經(jīng)網(wǎng)絡(luò)可以為相同輸入提供不同的輸出盛霎。 為了確保找到了精度較高的神經(jīng)網(wǎng)絡(luò),請重新訓(xùn)練幾次耽装。
如果需要更高的精度愤炸,還有幾種其他技術(shù)可以改善初始解決方案。 有關(guān)更多信息掉奄,請參見“改善淺層神經(jīng)網(wǎng)絡(luò)泛化并避免過度擬合”规个。