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