Hazırda meteoroloqlar 5 gün ərzində hava proqnozlarının 90%-nin doğru olduğunu təxmin edirlər. Verilən proqnozlar adətən iki ayrı metoda əsaslanır:
-
Fizikaya əsaslanan yanaşmalar: Bu yanaşmalar təzyiq, buludların hərəkəti, səma şəraiti kimi ölçülə bilən kəmiyyətləri birləşdirən modellərdən istifadə edir... Bu cür modellər qarşıdan gələn günlər və ya həftələr üçün hava şəraitini yaxşı proqnozlaşdırır.
-
Fizikadan azad (məlumata əsaslanan) yanaşmalar: Bu yanaşmalar proqnozlar verə bilən modellər yaratmaq üçün tarixi məlumatlardan istifadə edir. Bu cür modellər havanın 6 saata qədər proqnozlaşdırılmasında və ya hava indiki kimi tanınanda yaxşı nəticələr göstərir.
Bu yazıda biz yanaşmaların ikinci kateqoriyasını müzakirə edəcəyik. Biz hava məlumatlarının müxtəlif formatlarını, indi hava proqnozunu vermək üçün maşın öyrənməsinin necə istifadə oluna biləcəyini və inkişaf etdirilən arxitekturaların oxşar problemlərin həlli üçün necə faydalı ola biləcəyini müzakirə edəcəyik.
İqlim Proqnozu üçün Data
Fizikasız yanaşmalar tarixi məlumatlardan istifadə etdiyi üçün, mövcud məlumatlara baxmaqla başlayaq.
Biz iki əsas məlumat mənbəyindən istifadə edəcəyik:
- Şəkil məlumatı: Bu məlumat müəyyən coğrafi ərazinin radar və ya peyk şəkilləri şəklini alır. Yağıntı, küləyin hərəkəti və ya rütubəti proqnozlaşdırmaq üçün istifadə olunur.
- Cədvəl məlumatları: Bu məlumatlar temperatur, rütubət və ya küləyin sürəti kimi ölçülə bilən kəmiyyətlərin qeydləri formasını alır.
Hər iki məlumat mənbəyi güclü modellər yaratmaq üçün vacib olsa da, biz sadəlik üçün birinciyə (radarlardan və ya peyklərdən toplanmış təsvir məlumatları) diqqət yetirəcəyik. Şəkil məlumatı ilə ən çox istifadə edilən modellər Convolutional Neural Networks (CNNs ).
Bu işdən sonra biz öz nowcasting modelimizi qurmaq üçün U-Net arxitekturasından istifadə edəcəyik.
Memarlıq
Mövcud bir arxitekturadan başlamaq bir çox səbəbə görə faydalıdır, bunlar arasında:
Memarlıq yeni modellərin yaradılması üçün təlimat rolunu oynayır. Yeni arxitekturalar yaradan insanlar son nəticələrinə çatmaq üçün sınaq və səhv yanaşmasını tətbiq edirlər. Onların son nəticələrini təkrar istifadə etməklə biz çox vaxta qənaət edə bilərik.
Əvvəlcədən hazırlanmış modellər adətən dərhal istifadə üçün mövcuddur. Tədqiqatçılar yeni arxitekturalarını dərc edərkən, adətən öyrədilmiş parametrləri də dərc edirlər ki, istifadəçilər sıfırdan təlim/optimallaşdırma problemindən keçməli olmayacaqlar. Bu, xüsusilə [çox böyük, resurslara susamış modellər] üçün faydalıdır (https://twitter.com/huggingface/status/1377273424641466370?lang=en).
Məşhur görmə arxitekturasının nümunələri bunlardır:
- LeNet (60k parametr)
- AlexNet (60m parametrlər)
- VGG-16 (138m parametrlər)
U-Net
U-Net tam bükülmə şəbəkəsinə əsaslanan arxitekturadır, yəni onun heç bir tam əlaqəli təbəqəsi yoxdur. İlk dəfə tibbi görüntü seqmentasiyası tapşırığı üçün təqdim edildi. Bu nəticələr tədqiqatçıları kompüter görmə sahəsindəki digər vəzifələrə genişləndirməyə ruhlandırdı.
2019-cu ildə Google yağışın proqnozlaşdırılması modeli yaratmaq üçün U-Net-based arxitekturasından istifadə edib.
“U-Net” adı onun memarlığının “U” formasından gəlir.
Üç əsas komponenti müəyyən edirik:
-
Müqavilə / Kodlayıcı: Daxil edilmiş təsviri daha kiçik ölçülü təsvirə sıxışdıran bükülmə/toplama təbəqələrinin ardıcıllığı.
-
Körpü / Darboğaz: “U”-nun aşağı hissəsi kodlayıcını dekoderə birləşdirir. Bir sıra bükülmə əməliyyatları ilə formalaşır.
-
Decontracting / Decoder : Darboğazın çıxışını “dekompressiya edən” upconvolutions və convolution laylarının ardıcıllığı.
U-Net-in arxitekturası indiyə qədər avtomatik kodlayıcıya bənzəyir. Bununla belə, fərq kodlayıcı ilə dekoder arasında keçən məlumatda olur. Bu məlumat kodlayıcıdan gələn konvolyutsiyaların nəticələrini dekoderin yuxarı çevrilməsinin nəticələri ilə birləşdirərək ötürülür. Bu modifikasiya ayırdetmə qabiliyyətini artırır və modelə məkan baxımından daha dəqiq nəticə çıxarmağa imkan verir (çıxışdakı piksellərin yeri daha dəqiq olacaq, birləşmə daxil olmayan modellərdə baş vermiş problemi həll edəcək). Birləşdirmə simmetrik şəkildə aparılır.
Yağışların İndi Dökülməsi üçün U-Net Modelinin qurulması
Bu bölmədə biz peyk görüntülərindən hava proqnozlaşdırmaq üçün U-Net modelini quracağıq. Biz Rain-Net adlı əvvəlcədən öyrədilmiş modeldən istifadə edəcəyik.
Aşağıdakı kod bu [colab]-da mövcuddur(https://colab.research.google.com/drive/1jHzESsHAWKPPxIqGmWLIBY7JLhgThCZ5?usp=sharing).
Əvvəlcə Hava Radarı Məlumatlarının Emalı üçün Açıq Mənbə Kitabxanası olan wradlib quraşdırırıq.
!pip install wradlib
import wradlib as wrl
Sonra [DWD-nin açıq məlumat serverindən] peyk məlumatlarını yükləmək üçün iki yardımçı funksiya yazırıq (https://www.dwd.de/EN/ourservices/opendata/opendata.html)
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
Bu yardım proqramları bizə əvvəlcədən hazırlanmış modelimizlə proqnozlar vermək üçün lazım olan peyk şəkillərinin sayı olan ən son 4 peyk şəklini endirməyə imkan verir.
Daha sonra ən son 4 şəkli əldə etmək üçün yaradılmış funksiyalardan istifadə edə bilərik
RY_latest, RY_latest_timestep = download_data()
Şəkilləri əldə etdikdən sonra biz verilənlərin planlaşdırılması üçün wradlib-in vis.plot_ppi metodundan istifadə edirik.
for i in range(RY_latest.shape[0]):
wrl.vis.plot_ppi(RY_latest[i])
İndi məlumatlarımızı yüklədik. Sonra modeli yükləyək.
Müvafiq sinifləri idxal etməklə başlayırıq. Bu məqalədə TensorFlow-dan istifadə edəcəyik.
tensorflow.keras.layers-dən Daxiletmə, Conv2D, Aktivləşdirmə, Concatenate, Conv2DTranspose, MaxPool2D idxal
tensorflow.keras.models idxal Modelindən
Gəlin 3 primitiv tikinti bloku tikək. Bu "tikinti blokları" buna görə bütün arxitekturanı yaratmaq üçün istifadə olunacaq (https://github.com/bnsreenu/python_for_microscopists/blob/master/219-unet_model_with_functions_of_blocks.py).
Birinci blok bükülmə təbəqələrinin ardıcıllığına uyğundur, biz onu "conv_block" adlandırırıq
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
İkinci blok kodlayıcı hissəsindən (konvolutional blok + maksimum hovuz) qurmaq üçün istifadə olunur. Biz buna “encoder_block” deyirik
def encoder_block(input, num_filters):
x = conv_block(input, num_filters)
p = MaxPool2D((2,2))(x)
return x,p
Üçüncü və son blok “dekoder_blokdur” (yuxarı cərəyan + birləşmə + bükülmə).
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
Biz U-Net modelini yaratmaq üçün bu tikinti bloklarını birləşdiririk
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
Tətbiqlə oynamaqdan, onu təkmilləşdirməkdən və ya başqa bir şey üçün istifadə etmək istəyirsinizsə, onu ehtiyaclarınıza uyğunlaşdırmaqdan çekinmeyin.
Bu modeli öyrətmək çox vaxt apara bilər. Xoşbəxtlikdən, U-Net arxitekturası əsasında yaradılmış və yağışın indiki dövriyyəsi üzrə ixtisaslaşmış Rain-Net adlı model var.
Gəlin onun GitHub anbarını klonlayaq
! git clone https://github.com/hydrogo/rainnet.git
Sonra bu model üçün əvvəlcədən hazırlanmış çəkiləri yükləyirik
!wget -O /content/rainnet/rainnet_weights.h5 https://zenodo.org/record/3630429/files/rainnet_weights.h5
Növbəti addım depoda tapılan arxitektura əsasında model yaratmaq və sonra bu modelə yüklənmiş çəkiləri yükləməkdir.
import sys
from rainnet import rainnet
model = rainnet.rainnet()
model.load_weights('/content/rainnet/rainnet_weights.h5')
model.summary()
Endirdiyimiz şəkillərin ölçüsü 900*900 pikseldir. Rain-Net-in gözlənilən girişinə uyğunlaşdırmaq üçün bu şəkilləri yenidən formalaşdırmaq niyyətindəyik
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
Sonra proqnozlar verən bir funksiya yaradırıq.
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
Daha sonra bu funksiyanı əvvəllər yüklədiyimiz məlumatlara çağırırıq
Y_pred = prediction(model, RY_latest)
Biz proqnozları tərtib edə və proqnozları vizuallaşdırmağa imkan verən gif şəklini yaratmaq üçün yadda qalan nəticələrdən istifadə etmək üçün onları saxlaya bilərik.
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')
Bu günə qədər gəldiyiniz üçün sizi təbrik edirik! İndi siz proqnozlar vermək və onları vizuallaşdırmaq üçün Rain-Net-dən istifadə edə bilərsiniz.
Nəticə
Bu yazıda yağışın indi yayımını etmək üçün maşın öyrənmə modelindən (Rain-Net) istifadə etdik. TensorFlow istifadə edərək qurduğumuz U-Net arxitekturasından istifadə etdik. Peyk şəkillərini proqnozlaşdırmaq üçün əvvəlcədən hazırlanmış modeli yüklədik.
Bu tətbiqi bir çox cəhətdən təkmilləşdirmək olar. Məsələn:
-
Verilənlər dəstinizdə modeli dəqiqləşdirin
-
Memarlıqda CBAM (Convolutional Block Attention Module) kimi diqqətə əsaslanan moduldan istifadə edin.
İstinadlar
Pulsuz seminarlarımızdan birinə gəlin!
Uyğunlaşa bilən kurrikuluma əsaslanan və sənaye ekspertləri tərəfindən idarə olunan pulsuz seminarlarımız ilə məlumat alimi kimi karyeranıza başlayın.
Master Maşın Öyrənməsi ilə Code Labs Academy! Onlayn təlim düşərgəmizə qoşulun – Çevik Part-Time və Tam Zamanlı Seçimlər Mövcuddur.