У наш час метэаролагі лічаць, што 90% прагнозаў надвор'я спраўджваюцца на працягу 5 дзён. Прагнозы, якія робяцца, звычайна грунтуюцца на двух асобных метадах:
-
Падыходы, заснаваныя на фізіцы: гэтыя падыходы выкарыстоўваюць мадэлі, якія аб'ядноўваюць вымерныя велічыні, такія як ціск, рух аблокаў, умовы неба... Такія мадэлі добрыя для прагназавання надвор'я на бліжэйшыя дні ці тыдні.
-
Безфізічныя падыходы (заснаваныя на дадзеных): гэтыя падыходы выкарыстоўваюць гістарычныя дадзеныя для стварэння мадэляў, якія могуць рабіць прагнозы. Такія мадэлі паказваюць добрыя вынікі ў прагназаванні надвор'я на тэрмін да 6 гадзін або так званай прагнозе надвор'я.
У гэтым артыкуле мы абмяркуем другую катэгорыю падыходаў. Мы абмяркуем розныя фарматы даных аб надвор'і, тое, як машыннае навучанне можа быць выкарыстана для прагнозу надвор'я, а таксама тое, як распрацаваныя архітэктуры могуць быць карыснымі для вырашэння падобных праблем.
Дадзеныя для прагназавання клімату
Паколькі падыходы без фізікі выкарыстоўваюць гістарычныя даныя, давайце пачнем з вывучэння даступных даных.
Мы будзем выкарыстоўваць дзве асноўныя крыніцы даных:
- Дадзеныя выявы: гэтыя даныя прымаюць форму радыёлакацыйных або спадарожнікавых здымкаў пэўнай геаграфічнай вобласці. Ён выкарыстоўваецца для прагназавання ападкаў, руху ветру або вільготнасці.
- Таблічныя даныя: гэтыя даныя маюць форму запісаў вымерных велічынь, такіх як тэмпература, вільготнасць або хуткасць ветру.
Нягледзячы на тое, што абедзве крыніцы даных важныя для стварэння магутных мадэляў, мы засяродзімся на першай (дадзеныя выявы, сабраныя з радараў або спадарожнікаў) дзеля прастаты. Найбольш часта выкарыстоўваюцца мадэлі з дадзенымі відарысаў: згорткавыя нейронавыя сеткі (CNN ).
Пасля гэтай працы мы збіраемся выкарыстоўваць архітэктуру U-Net для стварэння нашай уласнай мадэлі прагнозу цяперашняй сітуацыі.
Архітэктура
Пачынаць з існуючай архітэктуры карысна па многіх прычынах, сярод якіх:
Архітэктуры служаць арыенцірамі для стварэння новых мадэляў. Людзі, якія ствараюць новыя архітэктуры, выкарыстоўваюць метад спроб і памылак, каб дасягнуць канчатковых вынікаў. Паўторна выкарыстоўваючы іх канчатковыя вынікі, мы можам зэканоміць шмат часу.
Папярэдне падрыхтаваныя мадэлі звычайна даступныя для неадкладнага выкарыстання. Калі даследчыкі публікуюць свае новыя архітэктуры, яны звычайна таксама публікуюць навучаныя параметры, так што карыстальнікам не трэба будзе праходзіць праз праблемы з навучаннем/аптымізацыяй з нуля. Гэта асабліва карысна для вельмі вялікіх мадэляў, якія патрабуюць рэсурсаў.
Прыклады вядомых архітэктур бачання ўключаюць:
- LeNet (60k параметраў)
- AlexNet (параметры 60m)
- ВГГ-16 (параметры 138м)
U-Net
U-Net - гэта архітэктура, заснаваная на цалкам згортчнай сетцы, што азначае, што яна не мае цалкам звязаных слаёў. Упершыню ён быў уведзены для задачы сегментацыі медыцынскага малюнка. Гэтыя вынікі натхнілі даследчыкаў распаўсюдзіць яго на іншыя задачы камп'ютэрнага зроку.
У 2019 годзе Google выкарыстаў архітэктуру на аснове U-Net, каб стварыць мадэль прагназавання ападкаў.
Назва «U-Net» паходзіць ад «U» формы яго архітэктуры.
Мы вылучаем тры асноўныя кампаненты:
-
Скарачэнне/кадавальнік: паслядоўнасць слаёў згортвання/аб'яднання, якія сціскаюць уваходны відарыс у прадстаўленне меншага памеру.
-
Мост/вузкае месца: ніжняя частка «U» злучае кадавальнік з дэкодэрам. Ён утвораны серыяй аперацый згортвання.
-
Дэкантрактаванне/дэкодэр: паслядоўнасць згортванняў уверх і згортванняў, якія «распакоўваюць» выхад вузкага месца.
Архітэктура U-Net пакуль выглядае як аўтаматычны кадавальнік. Аднак розніца заключаецца ў інфармацыі, якая праходзіць паміж кадавальнікам і дэкодэрам. Гэтая інфармацыя перадаецца шляхам канкатэнацыі вынікаў згортвання ад кадавальніка з вынікамі згортвання ўверх дэкодэра. Гэтая мадыфікацыя павышае раздзяляльнасць і дазваляе мадэлі выводзіць больш прасторава дакладны вывад (размяшчэнне пікселяў у вывадзе будзе больш дакладным, вырашаючы праблему, якая ўзнікла ў мадэлях, якія не ўключаюць канкатэнацыю). Злучэнне выконваецца сіметрычна.
Стварэнне мадэлі U-Net для прагнозу ападкаў
У гэтым раздзеле мы пабудуем мадэль U-Net для прагназавання надвор'я па спадарожнікавых здымках. Мы будзем выкарыстоўваць папярэдне падрыхтаваную мадэль пад назвай Rain-Net.
Код ніжэй даступны ў гэтай colab.
Спачатку мы ўсталёўваем wradlib, бібліятэку з адкрытым зыходным кодам для апрацоўкі даных метэаралагічных радараў
!pip install wradlib
import wradlib as wrl
Затым мы пішам дзве службовыя функцыі для загрузкі спадарожнікавых даных з адкрытага сервера даных DWD
import urllib.request
import io
import numpy as np
import datetime
def download_and_read_RY(RY_timestamp):
url = f"https://opendata.dwd.de/weather/radar/radolan/ry/raa01-ry_10000-{RY_timestamp}-dwd---bin"
data_binary = urllib.request.urlopen(url).read()
data, attr = wrl.io.read_radolan_composite(io.BytesIO(data_binary), missing = 0)
data = data.astype("float32")
return data,attr
def download_data():
latest_scan, latest_attr = download_and_read_RY("latest")
latest_datetime = latest_attr["datetime"]
list_for_downloading = [ts.strftime("%y%m%d%H%M") for ts in
[latest_datetime - datetime.timedelta(minutes=t) for t in [15, 10, 5]]]
previous_scans = np.array([download_and_read_RY(ts)[0] for ts in list_for_downloading])
print(list_for_downloading)
scans = np.concatenate([previous_scans, latest_scan[np.newaxis, ::, ::]], axis = 0)
return scans, latest_datetime
Гэтыя ўтыліты дазваляюць спампоўваць апошнія 4 спадарожнікавыя здымкі, гэта колькасць спадарожнікавых здымкаў, якія нам патрэбныя для прагназавання з дапамогай нашай падрыхтаванай мадэлі.
Затым мы можам выкарыстоўваць створаныя функцыі для атрымання апошніх 4 малюнкаў
RY_latest, RY_latest_timestep = download_data()
Пасля атрымання відарысаў мы выкарыстоўваем метад wradlib vis.plot_ppi, каб пабудаваць даныя
for i in range(RY_latest.shape[0]):
wrl.vis.plot_ppi(RY_latest[i])
Цяпер мы загрузілі нашы дадзеныя. Далей загрузім мадэль.
Мы пачынаем з імпарту адпаведных класаў. У гэтым артыкуле мы будзем выкарыстоўваць TensorFlow.
з tensorflow.keras.layers імпарт Input, Conv2D, Activation, Concatenate, Conv2DTranspose, MaxPool2D
з tensorflow.keras.models імпартаваць мадэль
Давайце пабудуем 3 прымітыўныя будаўнічыя блокі. Гэтыя «будаўнічыя блокі» будуць выкарыстоўвацца для стварэння ўсёй архітэктуры ў адпаведнасці з гэтай рэалізацыяй.
Першы блок адпавядае паслядоўнасці згортачных слаёў, мы называем яго "conv_block"
def conv_block(input, num_filters):
x = Conv2D(num_filters, 3, padding ="same", kernel_initializer="he_normal"(input))
x = Activation("relu")(x)
x = Conv2D(num_filters, 3, padding ="same", kernel_initializer="he_normal"(x))
x = Activation("relu")(x)
return x
Другі блок выкарыстоўваецца для стварэння часткі кадавальніка (згорткавы блок + максімальнае аб'яднанне). Мы называем гэта "encoder_block"
def encoder_block(input, num_filters):
x = conv_block(input, num_filters)
p = MaxPool2D((2,2))(x)
return x,p
Трэці і апошні блок - гэта «decoder_block» (згортка + канкатэнацыя + згортка).
def decoder_block(input, skip_features, num_filters):
x = Conv2DTranspose(num_filters, (2,2), strides=2, padding="same", kernel_initializer="he_normal")
x = Concatenate()([x, skip_features])
x = conv_block(x, num_filters)
return x
Мы аб'ядноўваем гэтыя будаўнічыя блокі для стварэння мадэлі U-Net
def build_unet(input_shape = (928, 928, 4)):
inputs = Input(input_shape)
e1, p1 = encoder_bock(inputs, 64)
e2, p2 = encoder_bock(p1, 128)
e3, p3 = encoder_bock(p2, 256)
e4, p4 = encoder_bock(p3, 512)
b1 = conv_block(p4, 1024)
d1 = decoder_block(b1, e4, 512)
d2 = decoder_block(d1, e3, 256)
d3 = decoder_block(d2, e2, 128)
d4 = decoder_block(d3, e1, 64)
outputs = Conv2D(1, 1, padding="same", activation="linear")(d4)
unet = Model(inputs, outputs, name="U-Net")
return unet
Не саромейцеся гуляць з рэалізацыяй, паляпшаць яе або адаптаваць пад свае патрэбы, калі вы хочаце выкарыстоўваць яе для чагосьці іншага.
Навучанне гэтай мадэлі можа заняць шмат часу. На шчасце, ёсць мадэль пад назвай Rain-Net, якая была створана на аснове архітэктуры U-Net і спецыялізуецца на прагназаванні ападкаў.
Давайце кланіруем яго рэпазітар GitHub
! git clone https://github.com/hydrogo/rainnet.git
Затым мы спампоўваем падрыхтаваныя гіры для гэтай мадэлі
!wget -O /content/rainnet/rainnet_weights.h5 https://zenodo.org/record/3630429/files/rainnet_weights.h5
Наступным крокам з'яўляецца стварэнне мадэлі на аснове архітэктуры, знойдзенай у сховішчы, затым загрузка вагавых паказчыкаў, загружаных у гэтую мадэль
import sys
from rainnet import rainnet
model = rainnet.rainnet()
model.load_weights('/content/rainnet/rainnet_weights.h5')
model.summary()
Спампаваныя выявы маюць памер 900*900 пікселяў. Мы збіраемся змяніць форму гэтых малюнкаў, каб яны адпавядалі чаканым уводам Rain-Net
def Scaler(array):
return np.log(array+0.01)
def invScaler(array):
return np.exp(array) - 0.01
def pad_to_shape(array, from_shape=900, to_shape=928, how="mirror"):
# calculate how much to pad in respect with native resolution
padding = int( (to_shape - from_shape) / 2)
# for input shape as (batch, W, H, channels)
if how == "zero":
array_padded = np.pad(array, ((0,0),(padding,padding),(padding,padding),(0,0)), mode="constant", constant_values=0)
elif how == "mirror":
array_padded = np.pad(array, ((0,0),(padding,padding),(padding,padding),(0,0)), mode="reflect")
return array_padded
def pred_to_rad(pred, from_shape=928, to_shape=900):
# pred shape 12,928,928
padding = int( (from_shape - to_shape) / 2)
return pred[::, padding:padding+to_shape, padding:padding+to_shape].copy()
'''
the spatial extent of input data has to be a multiple of 2n+1
where n is the number of max pooling layers
'''
def data_preprocessing(X):
# 0. Right shape for batch
X = np.moveaxis(X, 0, -1)
X = X[np.newaxis, ::, ::, ::]
# 1. To log scale
'''
We use a log scale to respond to skewness towards large values
'''
X = Scaler(X)
# 2. from 900x900 to 928x928
X = pad_to_shape(X)
return X
def data_postprocessing(nwcst):
# 0. Squeeze empty dimensions
nwcst = np.squeeze(np.array(nwcst))
# 1. Convert back to rainfall depth
nwcst = invScaler(nwcst)
# 2. Convert from 928x928 back to 900x900
nwcst = pred_to_rad(nwcst)
# 3. Return only positive values
nwcst = np.where(nwcst>0, nwcst, 0)
return nwcst
Затым мы ствараем функцыю, якая робіць прагнозы.
def prediction(model_instance, input_data, lead_time=24):
input_data = data_preprocessing(input_data)
nwcst = []
for _ in range(lead_time):
pred = model_instance.predict(input_data)
nwcst.append(pred)
input_data = np.concatenate([input_data[::, ::, ::, 1:], pred], axis = -1)
nwcst = data_postprocessing(nwcst)
return nwcst
Затым мы выклікаем гэтую функцыю на дадзеных, якія мы спампавалі раней
Y_pred = prediction(model, RY_latest)
Мы можам пабудаваць прагнозы і захаваць іх, каб выкарыстоўваць захаваныя вынікі для стварэння gif-малюнка, які дазваляе візуалізаваць прагнозы
import matplotlib.pyplot as plt
names = []
for i in range(0, 19):
im = wrl.vis.plot_ppi(Y_pred[i])
name = '/content/image'+str(i)+'.png'
names.append(name)
plt.savefig(name)
import imageio
from google.colab import files
imgs = []
for name in names:
imgs.append(imageio.imread(name))
imageio.mimsave('/content/pred.gif', imgs, fps=4)
files.download('/content/pred.gif')
Віншуем з поспехам! Цяпер вы можаце выкарыстоўваць Rain-Net, каб рабіць прагнозы і візуалізаваць іх.
Выснова
У гэтым артыкуле мы выкарыстоўвалі мадэль машыннага навучання (Rain-Net) для прагнозу ападкаў. Мы выкарыстоўвалі архітэктуру U-Net, якую пабудавалі з дапамогай TensorFlow. Мы загрузілі загадзя падрыхтаваную мадэль для прагназавання спадарожнікавых здымкаў.
Гэтую рэалізацыю можна палепшыць рознымі спосабамі. Напрыклад:
-
Адрэгулюйце мадэль на вашым наборы даных
-
Выкарыстоўвайце ў архітэктуры модуль, заснаваны на ўвазе, напрыклад CBAM (Модуль увагі згорткавага блока).
Спасылкі
Прыходзьце на адзін з нашых бясплатных семінараў!
Пачніце сваю кар'еру ў якасці навукоўца па апрацоўцы дадзеных з нашых бясплатных семінараў, якія заснаваны на адаптаванай праграме і праводзяцца экспертамі галіны.
Асвойце Машыннае навучанне з Code Labs Academy! Далучайцеся да нашага онлайн-курса навучання – даступныя гнуткія варыянты няпоўнага і поўнага працоўнага дня.