Maşın Öyrənməsi ilə İndi Yağış

ML
DL
CNN
Hava Proqnozu
UNet
Maşın Öyrənməsi ilə İndi Yağış cover image

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:

  1. 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.

  2. 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 şəraitinin yayımlanması üçü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:

  1. Şə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.

Satellite Image

  1. 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.

Tabular Data

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ına nümunələr daxildir:

  • LeNet (60k parametr)

LeNet

  • AlexNet (60 m parametrlər)

AlexNet

  • VGG-16 (138m parametrlər)

VGG-16

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.

U-net Architecture

Üç əsas komponenti müəyyən edirik:

  1. 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ığı.

  2. 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.

  3. 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).

Biz əvvəlcə wradlib, Hava Radarı Məlumatlarının Emalı üçün Açıq Mənbə Kitabxanasını 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 kommunal 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])

VIS Radar

İndi məlumatlarımızı yükləmişik. 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ədə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ə, 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ına əsaslanaraq yaradılmış və yağışın indiki dövriyyəsi üzrə ixtisaslaşmış Rain-Net adlı model var.

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

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 şəkli 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')

Resuts

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:

  1. Verilənlər dəstinizdə modeli dəqiqləşdirin

  2. 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.


Career Services background pattern

Karyera Xidmətləri

Contact Section background image

Əlaqə saxlayaq

Code Labs Academy © 2024 Bütün hüquqlar qorunur.