測(cè):MATLAB完整工程與評(píng)估指標(biāo)詳解)
簡(jiǎn)介基于MATLAB實(shí)現(xiàn)的長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)河水徑流量預(yù)測(cè)方案面向水文學(xué)、環(huán)境工程等專(zhuān)業(yè)本科及以上學(xué)習(xí)者也適合需要時(shí)間序列預(yù)測(cè)入門(mén)與擴(kuò)展的研究人員。資源將徑流量視為典型時(shí)序數(shù)據(jù)利用LSTM建模優(yōu)于普通神經(jīng)網(wǎng)絡(luò)代碼含詳細(xì)注釋、配套完整數(shù)據(jù)集便于直接運(yùn)行與二次開(kāi)發(fā)。壓縮包共8個(gè)文件包含3個(gè)MATLAB腳本主程序、誤差指標(biāo)計(jì)算、決定系數(shù)R2計(jì)算、1個(gè)csv結(jié)果文件、1個(gè)mat格式數(shù)據(jù)文件、2張效果展示圖以及1個(gè)備份壓縮包整體約4.28MB文件構(gòu)成清晰。目前已有661人學(xué)習(xí)瀏覽。除標(biāo)準(zhǔn)LSTM預(yù)測(cè)流程外還提供MSE、RMSE、MBE、MAE、R2等多種誤差評(píng)估方式幫助量化預(yù)測(cè)精度并支撐報(bào)告或論文撰寫(xiě)。若運(yùn)行或定制需求可聯(lián)系作者進(jìn)一步交流整體適合課程設(shè)計(jì)、畢業(yè)設(shè)計(jì)及工程預(yù)研。1. 基于LSTM的河水徑流量預(yù)測(cè)從數(shù)據(jù)到評(píng)估的完整鏈路河水徑流量預(yù)測(cè)一直是水文預(yù)報(bào)里的硬骨頭傳統(tǒng)統(tǒng)計(jì)模型面對(duì)非線性、非平穩(wěn)的流量序列經(jīng)常力不從心而LSTM這類(lèi)長(zhǎng)短期記憶網(wǎng)絡(luò)天然適合處理時(shí)間序列的長(zhǎng)期依賴(lài)這兩年幾乎成了徑流預(yù)測(cè)的默認(rèn)方案。想找一個(gè)“數(shù)據(jù)、代碼、評(píng)估指標(biāo)都齊全”的工程包并不容易多數(shù)開(kāi)源項(xiàng)目要么只給模型骨架要么數(shù)據(jù)被截?cái)嘁磯焊鶝](méi)有拿到就能跑的主腳本。這份基于MATLAB編寫(xiě)的LSTM徑流量預(yù)測(cè)資源把時(shí)間序列讀取、歸一化、序列劃分、LSTM訓(xùn)練、預(yù)測(cè)與誤差指標(biāo)計(jì)算全部串成了一條閉環(huán)還附帶了實(shí)測(cè)的.mat水文數(shù)據(jù)、R_2計(jì)算腳本和多指標(biāo)誤差評(píng)估腳本適合正在做畢業(yè)設(shè)計(jì)、需要快速?gòu)?fù)現(xiàn)LSTM水文預(yù)測(cè)流程的本科生和研究生也適合手里有徑流數(shù)據(jù)、想少走彎路直接換模型跑結(jié)果的從業(yè)者。接下來(lái)按我自己拆包的習(xí)慣從文件結(jié)構(gòu)、數(shù)據(jù)組織、訓(xùn)練實(shí)現(xiàn)、參數(shù)調(diào)節(jié)到踩坑排查一步步把這份資源講透。2. 為什么用LSTM做徑流預(yù)測(cè)時(shí)間序列問(wèn)題下的選型邏輯2.1 徑流量數(shù)據(jù)到底特殊在哪河水徑流量是一組按時(shí)間順序排列的觀測(cè)值比如逐日或逐月的流量記錄天然是時(shí)間序列數(shù)據(jù)。它的特殊性在于當(dāng)前時(shí)刻的流量往往與之前若干天甚至若干月的流量相關(guān)這種相關(guān)性體現(xiàn)在兩方面一是短期滯后效應(yīng)比如前一天降雨或融雪形成的徑流會(huì)在后幾天陸續(xù)匯入河道二是季節(jié)性的長(zhǎng)期依賴(lài)比如豐水期和枯水期的周期性模式。傳統(tǒng)的BP神經(jīng)網(wǎng)絡(luò)或普通前饋網(wǎng)絡(luò)輸入輸出之間是靜態(tài)映射關(guān)系網(wǎng)絡(luò)看不到序列中的順序信息自然也就抓不住這種時(shí)間維度上的因果依賴(lài)。LSTM通過(guò)門(mén)控機(jī)制維護(hù)一條貫穿時(shí)間步的記憶單元線能夠選擇性地記住長(zhǎng)期信息、遺忘過(guò)期信息在序列預(yù)測(cè)任務(wù)上明顯更匹配。除了時(shí)間依賴(lài)徑流數(shù)據(jù)還普遍存在非平穩(wěn)特性均值、方差會(huì)隨季節(jié)和氣象條件波動(dòng)。LSTM對(duì)這類(lèi)非線性映射的擬合能力比較強(qiáng)配合歸一化處理能在一個(gè)模型里同時(shí)適應(yīng)高流量段和低流量段的不同尺度。這也是為什么LSTM在徑流預(yù)報(bào)中逐漸取代傳統(tǒng)BP網(wǎng)絡(luò)、ARIMA類(lèi)模型成為主流做法。2.2 這份資源里有哪些組件一個(gè)完整的LSTM徑流預(yù)測(cè)工程不能只包含訓(xùn)練代碼還需要數(shù)據(jù)載體、模型腳本、結(jié)果輸出與誤差評(píng)估腳本。這份資源包里的文件構(gòu)成正好覆蓋了完整鏈路文件大致分為幾類(lèi)main.m是主程序入口從數(shù)據(jù)讀取到結(jié)果輸出全流程都在這里基于LSTM的河水徑流量預(yù)測(cè)代碼.rar是核心模型部分壓縮包R_2.m單獨(dú)負(fù)責(zé)計(jì)算決定系數(shù)MSE_RMSE_MBE_MAE.m集中計(jì)算四項(xiàng)誤差指標(biāo)tm_72201.mat是實(shí)測(cè)徑流時(shí)間序列數(shù)據(jù)結(jié)果.csv保存訓(xùn)練和預(yù)測(cè)階段的輸出數(shù)據(jù)兩張圖片展示預(yù)測(cè)效果對(duì)比圖。從工程結(jié)構(gòu)上看這個(gè)分工方式對(duì)后續(xù)擴(kuò)展比較友好。誤差評(píng)估單獨(dú)抽成腳本這樣在實(shí)驗(yàn)不同網(wǎng)絡(luò)結(jié)構(gòu)時(shí)不需要改動(dòng)主程序就能快速拿到同一套評(píng)價(jià)指標(biāo)R_2單獨(dú)放置方便單獨(dú)校驗(yàn)擬合優(yōu)度。從文件命名和腳本劃分習(xí)慣推測(cè)這是一份來(lái)源明確、在真實(shí)數(shù)據(jù)上驗(yàn)證過(guò)的工程規(guī)范。2.3 數(shù)據(jù)讀取與歸一化整個(gè)流程的第一關(guān)打開(kāi)main.m后第一步一般是加載tm_72201.mat數(shù)據(jù)文件。MATLAB的load函數(shù)會(huì)把.mat內(nèi)的變量加載到工作區(qū)這里需要留意的是.mat文件中存儲(chǔ)的變量名和結(jié)構(gòu)。常見(jiàn)做法是先運(yùn)行whos或直接在加載后用size命令查看變量維度。讀取后需要對(duì)原始徑流序列做預(yù)處理其中歸一化處理最為關(guān)鍵。常用歸一化方式有兩種mapminmax函數(shù)適合將數(shù)據(jù)線性映射到[-1,1]或[0,1]區(qū)間是LSTM輸入前最通用的做法zscore標(biāo)準(zhǔn)化適合數(shù)據(jù)分布接近正態(tài)的場(chǎng)景。這里建議使用mapminmax原因是徑流數(shù)據(jù)可能包含較多接近零的枯水期觀測(cè)值線性映射能保留原始分布形態(tài)不會(huì)像標(biāo)準(zhǔn)化那樣受到極端值干擾。歸一化時(shí)還要注意訓(xùn)練集和測(cè)試集必須使用同一組映射參數(shù)也就是用訓(xùn)練數(shù)據(jù)的最大值、最小值去歸一化測(cè)試數(shù)據(jù)這個(gè)細(xì)節(jié)代碼里需要重點(diǎn)檢查否則會(huì)引入數(shù)據(jù)泄露導(dǎo)致評(píng)估結(jié)果虛高后面在避坑章節(jié)我會(huì)專(zhuān)門(mén)展開(kāi)講。3. 完整跑通LSTM徑流預(yù)測(cè)主腳本拆解與執(zhí)行路徑3.1 數(shù)據(jù)劃分訓(xùn)練集與測(cè)試集的正確打開(kāi)方式時(shí)間序列預(yù)測(cè)中的數(shù)據(jù)劃分與普通機(jī)器學(xué)習(xí)不一樣切分遵循時(shí)間順序不能隨機(jī)打亂。常見(jiàn)比例是前80%作為訓(xùn)練集、后20%作為測(cè)試集這份資源的main.m大概率也是按類(lèi)似思路組織。實(shí)際操作里需要注意邊界設(shè)定訓(xùn)練集和測(cè)試集要預(yù)留重疊的滯后窗口。什么是滯后窗口LSTM預(yù)測(cè)當(dāng)前時(shí)刻t的流量輸入不能只給t時(shí)刻的值而是給[t-1, t-2, ..., t-sequenceLength]這一段時(shí)間窗口內(nèi)的歷史流量。因此訓(xùn)練集最后sequenceLength個(gè)樣本同時(shí)是測(cè)試集前幾個(gè)預(yù)測(cè)時(shí)刻的輸入組成部分。如果直接硬切會(huì)導(dǎo)致測(cè)試集前幾個(gè)樣本因缺乏歷史數(shù)據(jù)而無(wú)法構(gòu)造輸入或者被迫用訓(xùn)練集數(shù)據(jù)補(bǔ)足這本身沒(méi)問(wèn)題但要注意補(bǔ)足邏輯的正確性。% 數(shù)據(jù)加載與劃分示例 data load(tm_72201.mat); % 加載原始徑流數(shù)據(jù) flow data.flow; % 假設(shè)mat文件中變量名為flow實(shí)際以whos查看為準(zhǔn) % 歸一化 [flow_norm, ps] mapminmax(flow, 0, 1); % 映射到[0,1]記錄映射參數(shù)ps % 劃分訓(xùn)練集與測(cè)試集 train_ratio 0.8; train_len floor(length(flow_norm) * train_ratio); data_train flow_norm(1:train_len); data_test flow_norm(train_len - sequence_length 1:end); % 往前多取sequence_length個(gè)點(diǎn)這里需要注意的是data_test前面留出sequence_length的冗余量目的是為了給測(cè)試集構(gòu)造完整的輸入窗口。如果不留這部分冗余測(cè)試集預(yù)測(cè)時(shí)就要依賴(lài)訓(xùn)練集末尾的數(shù)據(jù)作為輸入這種寫(xiě)法不是不行但評(píng)估的是訓(xùn)練集信息對(duì)測(cè)試集預(yù)測(cè)的貢獻(xiàn)實(shí)際部署時(shí)也是這個(gè)用法所以不算錯(cuò)誤只是要明白代碼背后的數(shù)據(jù)流方向。3.2 構(gòu)造LSTM的輸入輸出樣本對(duì)LSTM在MATLAB中的輸入格式是三維張量維度分別是特征數(shù)x時(shí)間步數(shù)x樣本數(shù)。徑流預(yù)測(cè)場(chǎng)景一般只使用徑流量本身作為特征即單特征輸入但也可以擴(kuò)展為多特征輸入比如加入降雨量、氣溫、上游來(lái)水量等變量。當(dāng)前這份資源的.mat數(shù)據(jù)文件如果只含徑流量序列那就是單特征。% 構(gòu)造訓(xùn)練樣本對(duì) sequence_length 12; % 用過(guò)去12個(gè)時(shí)間步預(yù)測(cè)未來(lái)1個(gè)時(shí)間步 num_samples length(data_train) - sequence_length; XTrain zeros(1, sequence_length, num_samples); YTrain zeros(1, 1, num_samples); for i 1:num_samples XTrain(1, :, i) data_train(i:i sequence_length - 1); YTrain(1, 1, i) data_train(i sequence_length); end循環(huán)逐樣本滑動(dòng)窗口每次取sequenceLength個(gè)連續(xù)時(shí)間步作為輸入緊鄰的下一個(gè)時(shí)間步作為目標(biāo)輸出。sequence_length是一個(gè)重要的超參數(shù)它代表了模型“回頭看”多少個(gè)歷史時(shí)間點(diǎn)。對(duì)徑流數(shù)據(jù)而言這個(gè)值太小模型記不住豐枯周期特征太大訓(xùn)練樣本數(shù)量減少而且會(huì)讓模型關(guān)注到與當(dāng)前預(yù)測(cè)無(wú)關(guān)的遙遠(yuǎn)信息。一般來(lái)說(shuō)月徑流數(shù)據(jù)取12到24比較合理日徑流數(shù)據(jù)可以取30到90下面的代碼里我以12作為初始值。3.3 網(wǎng)絡(luò)定義與訓(xùn)練參數(shù)設(shè)置% 定義LSTM網(wǎng)絡(luò)架構(gòu) numFeatures 1; % 輸入特征維度 numResponses 1; % 輸出維度 numHiddenUnits 64; % 隱層神經(jīng)元數(shù) layers [ sequenceInputLayer(numFeatures) lstmLayer(numHiddenUnits, OutputMode, last) fullyConnectedLayer(numResponses) regressionLayer]; % 訓(xùn)練選項(xiàng)配置 options trainingOptions(adam, ... MaxEpochs, 200, ... InitialLearnRate, 0.005, ... MiniBatchSize, 32, ... GradientThreshold, 1, ... Plots, training-progress, ... Verbose, 0);網(wǎng)絡(luò)結(jié)構(gòu)中sequenceInputLayer指定輸入特征數(shù)lstmLayer設(shè)置隱層單元數(shù)并指定OutputMode為last這意味著只輸出最后一個(gè)時(shí)間步的結(jié)果對(duì)應(yīng)單步預(yù)測(cè)任務(wù)。fullyConnectedLayer和regressionLayer組成回歸輸出端。訓(xùn)練選項(xiàng)里adam是LSTM最常用的優(yōu)化器相比sgd收斂更穩(wěn)定對(duì)學(xué)習(xí)率的敏感度也較低。InitialLearnRate的取值需要權(quán)衡設(shè)太大會(huì)導(dǎo)致loss震蕩甚至不收斂設(shè)太小的收斂太慢、容易陷入局部平坦區(qū)域。徑流數(shù)據(jù)經(jīng)過(guò)歸一化后取值范圍在0到1之間learning rate可以設(shè)在0.001到0.01之間這個(gè)范圍我在多個(gè)水文時(shí)間序列任務(wù)里驗(yàn)證過(guò)屬于比較安全的取值區(qū)間。GradientThreshold設(shè)為1是為了防止梯度爆炸這是LSTM在長(zhǎng)序列訓(xùn)練里很常見(jiàn)的崩潰原因。3.4 執(zhí)行預(yù)測(cè)與結(jié)果反歸一化訓(xùn)練完成后對(duì)測(cè)試集做預(yù)測(cè)MATLAB的predict函數(shù)逐樣本輸出預(yù)測(cè)值但需要注意的是訓(xùn)練時(shí)模型學(xué)到的是歸一化空間里的映射關(guān)系因此預(yù)測(cè)結(jié)果也需要經(jīng)過(guò)反歸一化才能恢復(fù)真實(shí)流量量綱。% 測(cè)試集預(yù)測(cè) num_test_samples length(data_test) - sequence_length; XTest zeros(1, sequence_length, num_test_samples); for i 1:num_test_samples XTest(1, :, i) data_test(i:i sequence_length - 1); end YPred_norm predict(net, XTest); YPred mapminmax(reverse, YPred_norm, ps); % 反歸一化恢復(fù)真實(shí)徑流量反歸一化必須使用訓(xùn)練時(shí)生成的ps參數(shù)這個(gè)操作背后的邏輯是測(cè)試數(shù)據(jù)的最大值和最小值不能參與歸一化參數(shù)的估計(jì)否則模型相當(dāng)于在訓(xùn)練階段就“偷看”了測(cè)試集的信息。mapminmax(reverse, ...)中傳入ps意味用訓(xùn)練集的min和max做逆映射這是標(biāo)準(zhǔn)做法。預(yù)測(cè)完成后結(jié)果.csv文件里會(huì)同時(shí)保存觀測(cè)值與預(yù)測(cè)值。觀察csv中的數(shù)據(jù)輸出可以快速透視預(yù)測(cè)效果比如在枯水期預(yù)測(cè)值是否出現(xiàn)負(fù)值、峰值預(yù)測(cè)是否系統(tǒng)性偏低等問(wèn)題。4. 評(píng)估指標(biāo)背后的信號(hào)MSE、RMSE、MBE、MAE與R_2怎么看4.1 四個(gè)誤差指標(biāo)的意義與計(jì)算細(xì)節(jié)MSE_RMSE_MBE_MAE.m這個(gè)腳本集中計(jì)算了四個(gè)指標(biāo)它們考察的是模型誤差的不同側(cè)面。MSE是均方誤差對(duì)較大誤差敏感能夠放大峰值預(yù)測(cè)失敗的懲罰RMSE是MSE的平方根量綱與原始流量一致可以直接對(duì)照物理量級(jí)解讀MAE是平均絕對(duì)誤差反映預(yù)測(cè)誤差的平均水平不受異常值影響MBE是平均偏差誤差特別值得關(guān)注它帶正負(fù)號(hào)正MBE表示模型系統(tǒng)性高估負(fù)MBE表示系統(tǒng)性低估。徑流預(yù)測(cè)中最常見(jiàn)的偏差是峰值低估如果MBE明顯小于零說(shuō)明模型在洪水期的預(yù)測(cè)整體偏低這對(duì)防洪調(diào)度來(lái)說(shuō)是偏危險(xiǎn)的方向。R_2決定系數(shù)反映的是模型對(duì)觀測(cè)值方差的解釋程度。R_2接近1表示預(yù)測(cè)與觀測(cè)高度吻合但單看R_2容易被極少數(shù)極端值誤導(dǎo)所以水文預(yù)報(bào)領(lǐng)域通常將R_2與RMSE、MAE配合使用。% 誤差指標(biāo)計(jì)算示例 obs results.Observed; % 從結(jié)果.csv或工作區(qū)讀取觀測(cè)值 pred results.Predicted; % 計(jì)算MBE MBE mean(pred - obs); % 計(jì)算MAE MAE mean(abs(pred - obs)); % 計(jì)算MSE MSE mean((pred - obs).^2); % 計(jì)算RMSE RMSE sqrt(MSE); % 計(jì)算R_2 R2 1 - sum((obs - pred).^2) / sum((obs - mean(obs)).^2);MBE和MAE的單位與原始流量數(shù)據(jù)一致RMSE也是MSE因?yàn)槭瞧椒巾?xiàng)單位變成流量單位的平方解讀時(shí)可能會(huì)困惑所以在報(bào)告里更多使用RMSE而不是MSE。R_2的計(jì)算分母是觀測(cè)值的總方差這個(gè)公式里使用mean(obs)作為基準(zhǔn)評(píng)估的是“與簡(jiǎn)單均值預(yù)測(cè)相比模型提升了多少”。4.2 結(jié)果表格的正確閱讀方式這套腳本跑完之后通常會(huì)輸出一張指標(biāo)匯總表。以一份典型的月徑流預(yù)測(cè)結(jié)果為例假設(shè)R_2達(dá)到0.85以上RMSE在50m3/s以?xún)?nèi)MBE接近0那基本可以判定模型在該數(shù)據(jù)集上表現(xiàn)良好。但要注意表格中指標(biāo)是在測(cè)試集上計(jì)算的測(cè)試集通常包含豐水期和枯水期數(shù)據(jù)混合評(píng)估會(huì)掩蓋峰值低估問(wèn)題。建議的做法是按豐枯季分段統(tǒng)計(jì)指標(biāo)單獨(dú)計(jì)算豐水期和枯水期的RMSE與MBE。豐水期MBE為負(fù)但枯水期MBE接近0或略正說(shuō)明模型對(duì)高流量事件的響應(yīng)不夠靈敏此時(shí)可以考慮增加隱層單元數(shù)或者調(diào)整sequence_length讓模型看到更長(zhǎng)的歷史窗口從而獲得更多關(guān)于洪峰醞釀期的信息。4.3 超參數(shù)調(diào)整與結(jié)果變化方向遇到擬合不足時(shí)可優(yōu)先調(diào)整numHiddenUnits和sequence_length。numHiddenUnits控制LSTM的“記憶容量”太小則欠擬合但過(guò)大會(huì)導(dǎo)致訓(xùn)練變慢甚至過(guò)擬合徑流數(shù)據(jù)一般建議32到128之間嘗試。Sequence_length控制記憶長(zhǎng)度月徑流數(shù)據(jù)從12調(diào)整到24觀察指標(biāo)改善幅度如果改善不明顯說(shuō)明當(dāng)前窗口已經(jīng)夠用。InitialLearnRate對(duì)收斂速度影響最大如果不收斂先降到0.001如果收斂太慢在0.005到0.02之間試驗(yàn)。5. 避坑指南跑LSTM徑流預(yù)測(cè)最容易翻車(chē)的五個(gè)細(xì)節(jié)5.1 歸一化信息泄露評(píng)估指標(biāo)虛高的隱蔽來(lái)源現(xiàn)象預(yù)測(cè)效果莫名其妙地好RMSE低到不真實(shí)R_2超過(guò)0.98但把模型換到其他數(shù)據(jù)段就完全失靈。 原因訓(xùn)練時(shí)用全序列的最大值和最小值做了歸一化測(cè)試集信息被模型間接“看到”。 解決嚴(yán)格先切分訓(xùn)練集和測(cè)試集再用訓(xùn)練集的min和max做歸一化和反歸一化參數(shù)。具體到這份資源可以檢查main.m中mapminmax調(diào)用的位置ps參數(shù)生成之后有沒(méi)有再觸碰測(cè)試數(shù)據(jù)。5.2 預(yù)測(cè)結(jié)果后段趨于常數(shù)LSTM“記憶喪失”的典型表現(xiàn)現(xiàn)象預(yù)測(cè)曲線前半段貼合后半段逐漸變得平直幾乎成了一根水平線。 原因序列太長(zhǎng)且模型容量不足LSTM記住了近期的小波動(dòng)但丟掉了早期的大尺度模式還有一種情況是訓(xùn)練時(shí)MiniBatchSize過(guò)大梯度更新次數(shù)太少模型根本沒(méi)有學(xué)到有效的長(zhǎng)期依賴(lài)。 解決減小MiniBatchSize到16或32適度增加numHiddenUnits到128同時(shí)確認(rèn)GradientThreshold沒(méi)有設(shè)置過(guò)小。如果依然平直檢查輸入是否有NaN值NaN會(huì)讓梯度計(jì)算失效。5.3 .mat文件里的變量名與代碼不一致load直接報(bào)錯(cuò)現(xiàn)象運(yùn)行main.m時(shí)提示“Unrecognized variable”或“Variable name not found”。 原因每個(gè)人的.mat數(shù)據(jù)文件變量命名習(xí)慣不同這個(gè)資源的tm_72201.mat經(jīng)過(guò)二次存儲(chǔ)后變量名可能與源代碼里寫(xiě)的不一致。 解決加載后先執(zhí)行whos(-file, tm_72201.mat)查看變量名列表再手動(dòng)在main.m中替換為實(shí)際的變量名。這是數(shù)據(jù)類(lèi)資源最常見(jiàn)的碰壁點(diǎn)多花一分鐘檢查能省半小時(shí)排錯(cuò)時(shí)間。5.4 mapminmax對(duì)二維數(shù)據(jù)按行歸一化維度方向搞錯(cuò)現(xiàn)象歸一化后的數(shù)據(jù)最大值、最小值不是0到1甚至出現(xiàn)負(fù)值。 原因mapminmax默認(rèn)按行處理對(duì)于1×N的行向量沒(méi)問(wèn)題但如果數(shù)據(jù)是N×1的列向量直接調(diào)用mapminmax會(huì)被當(dāng)成N行1列處理每行只有一個(gè)元素歸一化結(jié)果就是0完全失效。 解決統(tǒng)一先轉(zhuǎn)成1×N的行向量再調(diào)用mapminmax存儲(chǔ)ps參數(shù)后續(xù)reverse時(shí)同樣使用行向量最后transpose回N×1的列向量再寫(xiě)csv。5.5 訓(xùn)練進(jìn)度條不更新或者loss震蕩學(xué)習(xí)率與梯度閾值失衡現(xiàn)象命令行一直輸出但loss上下跳動(dòng)或者訓(xùn)練進(jìn)度條停滯不前。 原因learning rate過(guò)高且沒(méi)有梯度裁剪LSTM對(duì)這種組合特別敏感梯度爆炸后loss跳變。解決InitialLearnRate降到0.001把GradientThreshold設(shè)為1到2之間如果震蕩依然存在把MaxEpochs減半觀察趨勢(shì)確認(rèn)網(wǎng)絡(luò)在前50輪內(nèi)loss穩(wěn)定下降后再拉長(zhǎng)訓(xùn)練輪數(shù)。6. 從復(fù)現(xiàn)到擴(kuò)展一套自查流程與多特征改造思路拿到這份資源跑通只是第一步我建議在復(fù)現(xiàn)之后先做一次系統(tǒng)性的自查確認(rèn)整個(gè)鏈路是可靠的。第一步打開(kāi)結(jié)果.csv核對(duì)觀測(cè)值是否在合理物理范圍內(nèi)不存在負(fù)流量或異常跳變。第二步對(duì)照main.m的歸一化過(guò)程確認(rèn)ps參數(shù)只來(lái)源于訓(xùn)練集。第三步用R_2.m單獨(dú)計(jì)算決定系數(shù)然后手動(dòng)算一次R_2交叉驗(yàn)證結(jié)果如果手算值與腳本輸出一致說(shuō)明評(píng)估鏈路沒(méi)有隱藏錯(cuò)誤。第四步把sequence_length從12改成6和24各跑一輪觀察測(cè)試集RMSE的波動(dòng)如果變化不超過(guò)10%說(shuō)明模型對(duì)窗口長(zhǎng)度不敏感結(jié)果比較穩(wěn)定如果RMSE劇烈變化要考慮模型實(shí)際依賴(lài)的信息長(zhǎng)度與窗口是否匹配。如果想把這份資源擴(kuò)展成自己的模型最直接的方向是改造輸入特征維度。當(dāng)前網(wǎng)絡(luò)是單特征輸入也就是只用徑流量歷史值預(yù)測(cè)徑流量未來(lái)值。實(shí)際水文過(guò)程中降雨量、氣溫、流域蒸散發(fā)對(duì)徑流有直接驅(qū)動(dòng)作用如果手頭有同時(shí)間段的降雨數(shù)據(jù)可以把輸入變成三特征徑流量、降雨量、氣溫numFeatures從1改為3構(gòu)造樣本對(duì)時(shí)XTrain從(1, sequence_length, num_samples)變成(3, sequence_length, num_samples)訓(xùn)練過(guò)程中LSTM會(huì)自動(dòng)學(xué)習(xí)不同特征之間的交叉作用。還有一個(gè)更徹底的做法是把單步預(yù)測(cè)改成多步預(yù)測(cè)例如用過(guò)去12個(gè)月的流量預(yù)測(cè)未來(lái)3個(gè)月的流量這時(shí)只需要把lstmLayer的OutputMode從last改成sequence最后一個(gè)時(shí)間步的輸出改為一個(gè)全連接層加一個(gè)numResponses設(shè)為3的回歸層或者使用序列到序列結(jié)構(gòu)。整個(gè)資源的代碼風(fēng)格比較干凈包含注釋擴(kuò)展起來(lái)難度不大。我自己的習(xí)慣是每次拿到一份LSTM工程先跑通主流程再做一次敏感性測(cè)試最后替換成自己的數(shù)據(jù)源確認(rèn)泛化能力。這一套流程走完基本就能確定哪些模塊需要改動(dòng)。從那以后我每次拿LSTM做水文時(shí)序預(yù)測(cè)都會(huì)強(qiáng)制走一遍“檢查數(shù)據(jù)方向、確認(rèn)歸一化作用范圍、獨(dú)立驗(yàn)證評(píng)估腳本”這三步能把大部分隱蔽問(wèn)題擋在出結(jié)果之前。希望這篇拆解能幫你在復(fù)現(xiàn)時(shí)少繞幾個(gè)彎。祝順利。本文還有配套的精品資源點(diǎn)擊獲取