何迪,陸德輝,韋翠,劉海華,甘婷
(清遠(yuǎn)市氣象局,廣東 清遠(yuǎn) 511510)
清遠(yuǎn)市的清城佛岡是廣東省3大暴雨中心之一[1],每年受臺(tái)風(fēng)、暴雨及其引發(fā)的山洪、泥石流地質(zhì)災(zāi)害尤為嚴(yán)重[2-3]。臺(tái)風(fēng)路徑和臺(tái)風(fēng)直接影響地區(qū)和范圍有很大關(guān)聯(lián)[4]。各業(yè)務(wù)部門雖有很多臺(tái)風(fēng)查詢系統(tǒng),但絕大多數(shù)系統(tǒng)基本上只能查看臺(tái)風(fēng)路徑、強(qiáng)度、影響范圍、云圖、雷達(dá)圖,很難找到相似路徑歷史臺(tái)風(fēng)查找功能。該功能對(duì)于臺(tái)風(fēng)天氣過程風(fēng)雨預(yù)報(bào)尤為重要,可以了解歷史實(shí)況,預(yù)測(cè)相似風(fēng)雨,為更好地做好氣象防災(zāi)減災(zāi)服務(wù)提供參考[5-6]。
近年來,無論從理論上、開發(fā)工具上、硬件支持上人工智能技術(shù)都得到了飛速發(fā)展,在各個(gè)方面應(yīng)用效果突出。本研究將介紹運(yùn)用BP人工神經(jīng)網(wǎng)絡(luò)分類模型[7],對(duì)經(jīng)過或登陸廣東及鄰近省份的歷史臺(tái)風(fēng)路徑數(shù)據(jù)進(jìn)行學(xué)習(xí)與訓(xùn)練,獲得最優(yōu)人工神經(jīng)網(wǎng)絡(luò)節(jié)點(diǎn)權(quán)重。再利用訓(xùn)練好的模型,用最優(yōu)神經(jīng)節(jié)點(diǎn)權(quán)重計(jì)算并尋找與新生臺(tái)風(fēng)實(shí)況和預(yù)報(bào)路徑相似的若干歷史臺(tái)風(fēng)。同時(shí)將尋找相似路徑歷史臺(tái)風(fēng)這項(xiàng)功能新增到“清遠(yuǎn)市歷史臺(tái)風(fēng)查詢系統(tǒng)”中。
人工神經(jīng)網(wǎng)絡(luò)有多種模型,如CNN(卷積)型、LSTM(長(zhǎng)短期記憶)型、BP(前饋)型等等。BP型是最基礎(chǔ)的一種模型,常常作用于整個(gè)神經(jīng)網(wǎng)絡(luò)模型的最后一層,作為前幾層特征提取后的最后輸入和標(biāo)簽分類輸出。BP神經(jīng)網(wǎng)絡(luò)是一種按照誤差逆向傳播算法訓(xùn)練的多層前饋神經(jīng)網(wǎng)絡(luò),分為輸入層、中間層、輸出層,其中輸入層節(jié)點(diǎn)數(shù)固定為特征向量個(gè)數(shù),中間層可以有多層,中間層每層節(jié)點(diǎn)數(shù)不固定,輸出層節(jié)點(diǎn)數(shù)固定為標(biāo)簽類別個(gè)數(shù)。人工神經(jīng)網(wǎng)絡(luò)項(xiàng)目實(shí)施通常遵循以下步驟[8-9]:一是數(shù)據(jù)整理;二是定義各層次及其神經(jīng)元個(gè)數(shù);三是對(duì)模型進(jìn)行訓(xùn)練和學(xué)習(xí);四是對(duì)模型進(jìn)行驗(yàn)證和優(yōu)化。
整理出1949至2019年經(jīng)過或登陸廣東省及附近省份的歷史臺(tái)風(fēng)共526個(gè),利用.NET編程進(jìn)行數(shù)據(jù)格式轉(zhuǎn)換,將原始數(shù)據(jù)轉(zhuǎn)為向量數(shù)據(jù)。先將原始路徑數(shù)據(jù)按6 h為間隔取一次臺(tái)風(fēng)經(jīng)緯度并連成線,再確定一個(gè)以廣東省清遠(yuǎn)市為中心具有一定范圍的矩形邊界。每個(gè)歷史臺(tái)風(fēng)畫一張50×50像素白底黑線圖片,黑線代表臺(tái)風(fēng)路徑,如圖1所示。
圖1 臺(tái)風(fēng)路徑圖片示意圖
每個(gè)臺(tái)風(fēng)路徑圖下方為臺(tái)風(fēng)實(shí)際編號(hào),如“T0005”,“T”為臺(tái)風(fēng)英語單詞Typhoon第1個(gè)字母,“0005”為2000年第05號(hào)。然后再將圖片按寬度和高度展開為1×2 500的數(shù)值向量,其中用1表示圖片黑點(diǎn),0表示圖片白點(diǎn)。該1×2 500的數(shù)值向量為某個(gè)臺(tái)風(fēng)的屬性,也就是神經(jīng)網(wǎng)絡(luò)的輸入。再將所有歷史臺(tái)風(fēng)從0開始編號(hào),將編號(hào)轉(zhuǎn)為one hot型向量,即為該編號(hào)臺(tái)風(fēng)的類別標(biāo)簽,也就是神經(jīng)網(wǎng)絡(luò)的輸出。例如有3個(gè)歷史臺(tái)風(fēng),編號(hào)分別為0、1、2,其中0號(hào)臺(tái)風(fēng)標(biāo)簽為[1,0,0],1號(hào)臺(tái)風(fēng)為[0,1,0],2號(hào)臺(tái)風(fēng)為[0,0,1]。將所有歷史臺(tái)風(fēng)的屬性和標(biāo)簽形成一個(gè)EXCEL文件。每行1至2 500列為臺(tái)風(fēng)路徑圖片屬性,2 501至3 026列為臺(tái)風(fēng)one hot編碼標(biāo)簽。整個(gè)EXCEL文件共526行數(shù)據(jù)。數(shù)據(jù)整理過程和數(shù)據(jù)格式如圖2所示。
圖2 數(shù)據(jù)整理過程和格式
利用python和人工智能框架TensorFlow編程實(shí)現(xiàn)BP人工神經(jīng)網(wǎng)絡(luò)。定義神經(jīng)網(wǎng)絡(luò)的輸入層、中間隱含層和輸出層,以及學(xué)習(xí)率、激活函數(shù)、損失函數(shù),實(shí)現(xiàn)信號(hào)的向前傳播以及誤差的反向傳播。該模型輸入層為1×2 500的向量。中間隱含層只有1層,節(jié)點(diǎn)數(shù)為1 000。輸出層為1×526的向量,526為歷史臺(tái)風(fēng)個(gè)數(shù)。激活函數(shù)為sigmoid,學(xué)習(xí)率0.001。神經(jīng)網(wǎng)絡(luò)分類模型的損失函數(shù)一般情況下為交叉熵softmax_cross_entropy_with_logits,一般情況下每1類會(huì)有多個(gè)歷史樣本。但該模型比較特殊,將每1個(gè)歷史臺(tái)風(fēng)都作為單獨(dú)1類,共526類,即每1類只有1個(gè)歷史臺(tái)風(fēng)樣本??上葘⒎诸惸P涂闯蓴?shù)值回歸模型,在最后輸出1×526向量數(shù)值中挑取最大值所在的位置作為樣本標(biāo)簽,即再分類。因此該模型的損失函數(shù)選用均方差mean_squared_error替代。
讀取EXCEL文件,利用格式化向量數(shù)據(jù)對(duì)BP人工神經(jīng)網(wǎng)絡(luò)進(jìn)行訓(xùn)練學(xué)習(xí),通過多次迭代不斷調(diào)整節(jié)點(diǎn)權(quán)重,獲取最小計(jì)算誤差。模型學(xué)習(xí)過程就是用神經(jīng)網(wǎng)絡(luò)節(jié)點(diǎn)權(quán)重矩陣根據(jù)每個(gè)臺(tái)風(fēng)的路徑屬性不斷區(qū)分出每個(gè)臺(tái)風(fēng)編號(hào)的one hot標(biāo)簽。當(dāng)輸入為某個(gè)臺(tái)風(fēng)路徑屬性向量時(shí),使這個(gè)臺(tái)風(fēng)的計(jì)算結(jié)果不斷向數(shù)值1靠近,而其他臺(tái)風(fēng)向數(shù)值0靠近,計(jì)算結(jié)果和實(shí)際結(jié)果的均方差不斷減少。最后這個(gè)臺(tái)風(fēng)計(jì)算結(jié)果并不需要為數(shù)值1,而是在所有臺(tái)風(fēng)計(jì)算結(jié)果中最大即為區(qū)分成功。例如有3個(gè)歷史臺(tái)風(fēng)要區(qū)分,0號(hào)臺(tái)風(fēng)one hot標(biāo)簽為[1,0,0]。若根據(jù)0號(hào)臺(tái)風(fēng)路徑屬性輸入得到最后計(jì)算結(jié)果為[0.005,0.002,0.001],由于最大值均出現(xiàn)在第一個(gè)位置,模型對(duì)0號(hào)臺(tái)風(fēng)區(qū)分成功。理想的模型應(yīng)該具有較高的區(qū)分準(zhǔn)確率,可以較好地區(qū)分所有歷史樣本。該模型經(jīng)過第1 000次迭代,準(zhǔn)確率61.21%;第4 000次迭代,準(zhǔn)確率已達(dá)100%,但仍然可以繼續(xù)進(jìn)行學(xué)習(xí),直到達(dá)到設(shè)定迭代次數(shù)或損失減少到幾乎沒變化。模型學(xué)習(xí)完畢保存神經(jīng)網(wǎng)絡(luò)各層權(quán)重和整個(gè)模型,形成pb文件,以供其他應(yīng)用程序調(diào)用。
以202002號(hào)臺(tái)風(fēng)“鸚鵡”驗(yàn)證,該臺(tái)風(fēng)沒有作為歷史臺(tái)風(fēng)樣本參加到模型學(xué)習(xí)。驗(yàn)證結(jié)果如圖3所示。圖3右側(cè)列表單數(shù)行是臺(tái)風(fēng)實(shí)際編號(hào),偶數(shù)行是模型用“鸚鵡”計(jì)算出來的數(shù)值,是“鸚鵡”和各歷史臺(tái)風(fēng)路徑相似度排行前10名。即在模型計(jì)算輸出的526個(gè)數(shù)值中最大的10個(gè),該數(shù)值意義為臺(tái)風(fēng)“鸚鵡”很可能是526個(gè)歷史臺(tái)風(fēng)之中的這10個(gè),可能程度就是計(jì)算所得數(shù)值,數(shù)值越大路徑越相似。例如有3個(gè)歷史臺(tái)風(fēng)已被模型學(xué)習(xí)區(qū)分和記憶,根據(jù)新生3號(hào)臺(tái)風(fēng)路徑屬性輸入得到最后計(jì)算結(jié)果為[0.003,0.004,0.001],那么模型就認(rèn)為新生3號(hào)臺(tái)風(fēng)路徑和1號(hào)臺(tái)風(fēng)最相似,和0號(hào)臺(tái)風(fēng)較相似,和2號(hào)臺(tái)風(fēng)最不相似。10個(gè)是人為設(shè)定,也可以設(shè)為10個(gè)以上。但一般情況下相似路徑臺(tái)風(fēng)不會(huì)多于10個(gè),或者超過10個(gè)以后認(rèn)為路徑肯定會(huì)不相似,因此設(shè)定10個(gè)。圖3的臺(tái)風(fēng)路徑圖“T7525(Flossie)”、“T8703(Ruth)”、“T8404(Betty)”則是前10名中人工再挑取的相似度高的臺(tái)風(fēng)。其中“T8703(Ruth)”是預(yù)報(bào)員人工翻查歷史資料逐個(gè)臺(tái)風(fēng)苦苦尋找的結(jié)果,也被人工神經(jīng)網(wǎng)絡(luò)模型成功找到!排名第1的“T8510(未命名)”雖然臺(tái)風(fēng)后期路徑完全不一樣,但臺(tái)風(fēng)前期的路徑也是很相似的。
從模型數(shù)據(jù)整理方法上看,是將實(shí)際經(jīng)緯度路徑截取一定經(jīng)緯度范圍的臺(tái)風(fēng)路徑再轉(zhuǎn)化為50×50的圖片。該圖片每個(gè)像素轉(zhuǎn)換為實(shí)際經(jīng)緯度約為0.3°,即約30 km。因此在實(shí)際地圖上如果兩條路徑某點(diǎn)距離差距在30 km范圍內(nèi),在圖片上是同一點(diǎn)表示,并不能顯示出兩點(diǎn)。該方法保證了兩條臺(tái)風(fēng)路徑在靠近段的擬合。即線路越靠近,靠近的距離越長(zhǎng),就越相似。另一種情況是若兩路徑中在30 km范圍內(nèi)的點(diǎn)很少,甚至沒有,但若兩條路徑有很多交點(diǎn),即使兩條路徑在某段走向不一致,但從整條路徑來看趨勢(shì)是一致的。即線路交點(diǎn)越多,就越相似。兩種情況如圖4所示。
圖4 路徑靠近和多交點(diǎn)示意圖
從模型運(yùn)行過程上看,路徑用數(shù)值1來表示,非路徑部分用數(shù)值0表示,在參與計(jì)算過程中,由于神經(jīng)網(wǎng)絡(luò)經(jīng)過學(xué)習(xí)后用神經(jīng)節(jié)點(diǎn)權(quán)重矩陣記憶了所有歷史臺(tái)風(fēng)路徑屬性,如果新生臺(tái)風(fēng)路徑屬性輸入向量為1和0分布位置,就和某個(gè)歷史臺(tái)風(fēng)路徑屬性向量1和0分布位置越相同,那么屬性輸入經(jīng)過神經(jīng)節(jié)點(diǎn)權(quán)重矩陣計(jì)算最后輸出結(jié)果必然越大和越接近1,模型識(shí)別該新生臺(tái)風(fēng)很可能是某個(gè)歷史臺(tái)風(fēng)類。因模型搭建時(shí)將每一個(gè)臺(tái)風(fēng)都作為一類,該類就是該臺(tái)風(fēng),即和該歷史臺(tái)風(fēng)路徑越相似。但這也會(huì)造成模型的一個(gè)不足:若某小段路徑極其相似,其他路徑段極其不相似,計(jì)算結(jié)果也會(huì)很大。該情況就像圖4中的202002號(hào)“鸚鵡”的最相似路徑臺(tái)風(fēng)為“T8510(未命名)”。為彌補(bǔ)模型這個(gè)不足,同時(shí)相似路徑臺(tái)風(fēng)可能存在多個(gè),因此需要對(duì)最后計(jì)算結(jié)果進(jìn)行降序排列,再人工挑選。盡管最后需要人工挑取,但挑取范圍已經(jīng)從幾百條大大減少至10條。
雖然尋找結(jié)果存在一些干擾項(xiàng),但模型總能找到一條或以上相似臺(tái)風(fēng)路徑,參考2020和2021年新生臺(tái)風(fēng)驗(yàn)證結(jié)果,總體上模型還是相當(dāng)成功的。如圖5所示,圖5a-b為202117號(hào)臺(tái)風(fēng)“獅子山”尋找結(jié)果“T1508(鯨魚)”和“T5615(未命名)”;圖5c-d為202007號(hào)臺(tái)風(fēng)“海高斯”,尋找結(jié)果“T8309(Ellen)”和“T0813(鸚鵡)”。
圖5 臺(tái)風(fēng)“獅子山”和“海高斯”相似路徑尋找結(jié)果
另外,如果新生臺(tái)風(fēng)路徑“怪異”,在歷史上沒有出現(xiàn),模型學(xué)習(xí)不到,輸出的10個(gè)相似臺(tái)風(fēng)列表就沒有一條路徑相似,必須將新路徑作為學(xué)習(xí)樣本讓模型重新學(xué)習(xí),再次出現(xiàn)相似路徑時(shí)尋找才能成功。
模型是由python和TensorFlow開發(fā)。對(duì)于非程序員的普通用戶而言人機(jī)交互體驗(yàn)較差,需要將模型運(yùn)行在常用操作系統(tǒng)上,如windows,并開發(fā)用戶操作界面。OpenCvSharp是一個(gè)基于.NET框架可以運(yùn)行模型的動(dòng)態(tài)連接庫,而且OpenCvSharp并不依賴python和TensorFlow。在windows平臺(tái)上,可以直接安裝并引用其下深度神經(jīng)網(wǎng)絡(luò)類庫OpenCvSharp.Dnn,再調(diào)用類庫對(duì)象實(shí)現(xiàn)功能。只需按向量形狀輸入數(shù)據(jù),讀取TensorFlow訓(xùn)練完成后保存的模型pb文件,OpenCvSharp就能直接逐層計(jì)算,并輸出最后結(jié)果。此外也可以不依靠OpenCvSharp,手寫編程實(shí)現(xiàn)矩陣的相乘和相加方法。再按矩陣形狀輸入數(shù)據(jù),逐層調(diào)用矩陣相乘和相加方法。在此基礎(chǔ)上將尋找相似路徑功能增加到Web版“清遠(yuǎn)市歷史臺(tái)風(fēng)信息查詢系統(tǒng)”。當(dāng)有新臺(tái)風(fēng)生成并且實(shí)況路徑或者預(yù)測(cè)路徑經(jīng)過劃定的經(jīng)緯度范圍時(shí),打開Web臺(tái)風(fēng)信息查詢系統(tǒng),加載時(shí)先讀取廣東省氣象局探測(cè)數(shù)據(jù)中心一體化數(shù)據(jù)接口IDEA獲取最新臺(tái)風(fēng)編號(hào)[10],通過下拉框選擇編號(hào)獲取臺(tái)風(fēng)路徑實(shí)況和路徑預(yù)報(bào)數(shù)據(jù),拼接為一條完整的路徑用于檢索,并按照模型數(shù)據(jù)整理方法根據(jù)劃定的經(jīng)緯度范圍和拼接的路徑形成一張50×50的白底黑線臺(tái)風(fēng)路徑圖。按圖片像素先行后列方法展開1×2 500向量作為模型的輸入。C#編程引用OpenCvSharp.dll,讀取向量輸入,經(jīng)過模型運(yùn)算就能直接輸出最后結(jié)果526個(gè)數(shù)值。主要程序代碼如下:
OpenCvSharp.Mat tensor=new OpenCvSharp.Mat(1,2500,MatType.CV_32FC1);
//定義1×2500輸入向量和數(shù)據(jù)類型
for(int i=0;i<=2500-1;i++)
{tensor.Set(0,i,Convert.ToSingle(value[i]));}
//設(shè)置輸入向量數(shù)值
Stringmodel_path =@"F:\tf\frozen_tf.pb";
//學(xué)習(xí)完畢保存的整個(gè)模型文件
OpenCvSharp.Dnn.Net net=OpenCvSharp.Dnn.CvDnn.ReadNetFromTensorflow(model_path);
//根據(jù)路徑加載模型
net.SetInput(tensor);
//向模型輸入向量
Mat result=net.Forward();
//模型逐層次向前計(jì)算得出最后輸出向量
for(int i=0;i<=526-1;i++)
{float result_score=result.Get<float>(0,i);
resstr=resstr+result_score.ToString()+",";}
//獲取輸出向量的每個(gè)數(shù)據(jù)
最后從輸出向量的每個(gè)數(shù)據(jù)中挑取最大10個(gè),即為相似度排名前10歷史臺(tái)風(fēng)列表。點(diǎn)擊歷史臺(tái)風(fēng)列表某個(gè)臺(tái)風(fēng)可查詢路徑、雨量、極大風(fēng)、受災(zāi)情況等信息[11-13]。氣象歷史數(shù)據(jù)包括有整個(gè)臺(tái)風(fēng)生命周期國家站和區(qū)域站的日雨量、日極大風(fēng)、最大小時(shí)雨量、逐小時(shí)雨量。歷史災(zāi)情數(shù)據(jù)包括受災(zāi)區(qū)域、農(nóng)田和建筑損毀情況、直接經(jīng)濟(jì)損失等。圖6是系統(tǒng)運(yùn)行界面及202118號(hào)臺(tái)風(fēng)“圓規(guī)”尋找結(jié)果。中間線框?yàn)閯澏ń?jīng)緯度路徑尋找范圍。
圖6 系統(tǒng)運(yùn)行界面
該模型雖然只是針對(duì)途經(jīng)廣東省及附近的臺(tái)風(fēng)路徑進(jìn)行了學(xué)習(xí)與記憶,但建立模型的方式和過程同樣適應(yīng)于其他地區(qū),可以預(yù)見該模型在其他地區(qū)的應(yīng)用也會(huì)表現(xiàn)優(yōu)良。訓(xùn)練好的整個(gè)模型pb文件也可以拷貝到其他系統(tǒng)運(yùn)行。另外,該模型建立方法對(duì)于如路徑、軌跡等單線型黑白圖片識(shí)別與匹配也有一定的參考價(jià)值。但需要特別注意在數(shù)據(jù)整理時(shí)不宜將圖片寬和高設(shè)置太大。若圖片太大按行列展開為向量時(shí)維度會(huì)特別大。維度越多干擾也必然越大,模型學(xué)習(xí)的時(shí)間會(huì)大大增加。同時(shí)若圖片寬和高設(shè)置太大時(shí),由于每個(gè)像素點(diǎn)表示的經(jīng)緯度過于精細(xì),路徑在靠近段的擬合也會(huì)失效,此時(shí)模型只會(huì)學(xué)習(xí)和記憶路徑相交這一種情況,反而尋找相似路徑效果不理想。