Машина үйрөнүү менен жаан-чачындар

ML
DL
CNN
Аба ырайы
UNet
Машина үйрөнүү менен жаан-чачындар cover image

Учурда метеорологдор 5 күндүк аба ырайы тууралуу болжолдоолордун 90% туура деп эсептешет. Болжолдоолор, адатта, эки башка ыкмага негизделет:

  1. Физикага негизделген ыкмалар: Бул ыкмалар басым, булуттардын кыймылы, асман шарттары сыяктуу өлчөнгөн чоңдуктарды бириктирген моделдерди колдонот... Мындай моделдер алдыдагы күндөрдүн же жумалардын аба ырайын алдын ала айтууда жакшы.

  2. Физикасыз (маалыматка негизделген) ыкмалар: Бул ыкмалар болжолдоолорду жасай ала турган моделдерди түзүү үчүн тарыхый маалыматтарды колдонот. Мындай моделдер 6 саатка чейин аба ырайын алдын ала айтууда жакшы натыйжаларды көрсөтөт же аба ырайынын азыр жарыялоосу деп аталат.

Бул макалада биз ыкмалардын экинчи категориясын талкуулайбыз. Биз аба ырайы маалыматтарынын ар кандай форматтарын, азыр аба ырайын көрсөтүү үчүн машинаны үйрөнүүнү кантип колдонсо болорун жана иштелип чыккан архитектуралар ушул сыяктуу көйгөйлөрдү чечүү үчүн кандай пайдалуу болоорун талкуулайбыз.

Климатты болжолдоо үчүн маалыматтар

Физикасыз ыкмалар тарыхый маалыматтарды колдонгондуктан, келгиле, жеткиликтүү маалыматтарды карап баштайлы.

Биз эки негизги маалымат булагын колдонобуз:

  1. Сүрөт маалыматтары: Бул маалыматтар белгилүү бир географиялык аймактын радар же спутник сүрөттөрү түрүндө болот. Ал жаан-чачынды, шамалдын кыймылын же нымдуулукту алдын ала айтуу үчүн колдонулат.

Satellite Image

  1. Таблица маалыматтары: Бул маалыматтар температура, нымдуулук же шамалдын ылдамдыгы сыяктуу өлчөнө турган чоңдуктарды жазуу түрүндө болот.

Tabular Data

Күчтүү моделдерди түзүү үчүн эки маалымат булагы тең маанилүү болгону менен, биз жөнөкөй себептерден улам мурункуга (радарлардан же спутниктерден алынган сүрөт маалыматтарына) көңүл бурабыз. Сүрөт маалыматтары менен эң көп колдонулган моделдер Convolutional Neural Networks (CNNs ).

Бул жумуштан кийин, биз өз nowcasting моделибизди куруу үчүн U-Net архитектурасын колдонобуз.

Архитектура

Учурдагы архитектурадан баштоо көптөгөн себептерден улам пайдалуу, алардын арасында:

Архитектура жаңы моделдерди түзүү үчүн көрсөтмө катары кызмат кылат. Жаңы архитектураларды жараткан адамдар акыркы натыйжаларга жетүү үчүн сыноо жана ката ыкмасын колдонушат. Алардын акыркы натыйжаларын кайра колдонуу менен биз көп убакытты үнөмдөй алабыз.

Алдын ала даярдалган моделдер, адатта, дароо колдонуу үчүн жеткиликтүү. Изилдөөчүлөр жаңы архитектураларын жарыялоодо, адатта, үйрөтүлгөн параметрлерди да жарыялашат, андыктан колдонуучулар нөлдөн баштап окутуу/оптималдаштыруу кыйынчылыгын баштан өткөрбөшү керек. Бул өзгөчө [өтө чоң, ресурстарга суусаган моделдер] үчүн пайдалуу (https://twitter.com/huggingface/status/1377273424641466370?lang=en).

Мисал белгилүү көрүү архитектурасына төмөнкүлөр кирет:

  • LeNet (60k параметр)

LeNet

  • AlexNet (60м параметрлер)

AlexNet

  • VGG-16 (138м параметрлер)

VGG-16

U-Net

U-Net бул толугу менен конволюциялык тармакка негизделген архитектура, башкача айтканда, анын толук туташкан катмарлары жок. Ал биринчи жолу медициналык сүрөттү сегментациялоо тапшырмасы үчүн киргизилген. Бул жыйынтыктар изилдөөчүлөргө аны компьютердик көрүүнүн башка милдеттерине жайылтууга шыктандырды.

2019-жылы Google жаан-чачынды болжолдоо моделин түзүү үчүн U-Net-негизделген архитектурасын колдонгон.

"U-Net" аталышы анын архитектурасынын "U" формасынан келип чыккан.

U-net Architecture

Биз үч негизги компонентти аныктайбыз:

  1. Contracting / Encoder: Киргизилген сүрөттөлүштү кичирээк өлчөмдөгү өкүлчүлүккө кысуучу конволюция/повинг катмарларынын ырааттуулугу.

  2. Көпүрө / Бөтөлкө: “U” ылдыйкы бөлүгү коддогучту декодерге туташтырат. Ал бир катар конволюциялык операциялар аркылуу түзүлөт.

  3. Деконтракциялоо / Декодер : Бөгөттүн чыгышын “декомпрессия кылган” өйдө-конволюциялардын жана конволюция катмарларынын ырааттуулугу.

U-Netтин архитектурасы азырынча авто-кодер сыяктуу көрүнөт. Бирок, айырма коддоочу менен декодер ортосунда өтүүчү маалыматта болот. Бул маалымат коддогучтан конволюциялардын натыйжалары менен дешифратордун өйдө айлануусунун натыйжаларын бириктирүү аркылуу берилет. Бул модификация резолюцияны жакшыртат жана моделге мейкиндик боюнча так чыгарууга мүмкүндүк берет (чыгармадагы пикселдердин жайгашуусу тагыраак болот, бул конкатенацияны камтыбаган моделдерде пайда болгон көйгөйдү чечет). бириктирүү симметриялуу жүзөгө ашырылат.

Жаан-чачындарды азыр чыгаруу үчүн U-Net моделин түзүү

Бул бөлүмдө биз спутник сүрөттөрүнөн аба ырайын алдын ала айтуу үчүн U-Net моделин курабыз. Биз Rain-Net деп аталган алдын ала үйрөтүлгөн моделди колдонобуз.

Төмөнкү код бул [colab] ичинде жеткиликтүү (https://drive.google.com/uc?export=view&id=1HWFcllu9clloTt5fql2VDpa_RiaC8rZZ).

Адегенде wradlib орнотобуз, Аба ырайынын радар маалыматтарын иштетүү үчүн ачык булак китепканасы

!pip install wradlib
import wradlib as wrl

Андан кийин биз [DWD ачык маалымат серверинен] спутниктик маалыматтарды жүктөп алуу үчүн эки пайдалуу функцияны жазабыз (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

Бул утилиталар акыркы 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])

VIS Radar

Биз азыр маалыматтарыбызды жүктөгөнбүз. Кийинки моделди жүктөйбүз.

Тиешелүү класстарды импорттоодон баштайбыз. Бул макалада биз TensorFlow колдонобуз.

tensorflow.keras.layers'тен киргизүү, Conv2D, активдештирүү, бириктирүү, Conv2DTranspose, MaxPool2D

tensorflow.keras.models импорттоо моделинен

Келгиле, 3 примитивдүү курулуш блокторун курабыз. Бул "курулуш блоктору" бул [ишке ашыруу] боюнча бүт архитектураны түзүү үчүн колдонулат (https://colab.research.google.com/drive/1jHzESsHAWKPPxIqGmWLIBY7JLhgThCZ5?usp=sharing).

Биринчи блок конволюциялык катмарлардын ырааттуулугуна туура келет, биз аны "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

Экинчи блок коддоочу бөлүгүн куруу үчүн колдонулат (конволюциялык блок + максималдуу бассейн). Биз аны "коддогуч_блок" деп атайбыз

def encoder_block(input, num_filters):
   x = conv_block(input, num_filters)
   p = MaxPool2D((2,2))(x)
   return x,p

Үчүнчү жана акыркы блок "decoder_block" (upconvolution + concatenation + convolution) болуп саналат.

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

Эгерде сиз аны башка нерсеге колдонгуңуз келсе, аны ишке ашыруу менен ойноп, аны өркүндөтүңүз же өз муктаждыктарыңызга ылайыктаңыз.

Бул моделди окутуу көп убакытты талап кылышы мүмкүн. Бактыга жараша, U-Net архитектурасынын негизинде түзүлгөн Rain-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')

Resuts

Ушуга чейин жеткениңиз үчүн куттуктайбыз! Сиз азыр Rain-Net аркылуу болжолдоолорду жасап, аларды визуализациялай аласыз.

Корутунду

Бул макалада биз машинаны үйрөнүү моделин (Rain-Net) колдондук. Биз U-Net архитектурасын колдондук, аны TensorFlow аркылуу курдук. Спутниктен тартылган сүрөттөрдү болжолдоо үчүн алдын ала даярдалган моделди жүктөгөнбүз.

Бул ишке ашыруу ар кандай жолдор менен жакшыртылышы мүмкүн. Мисалы:

  1. Берилиштер топтомуңуздагы моделди тууралаңыз

  2. Архитектурада CBAM (Convolutional Block Attention Module) сыяктуу көңүл бурууга негизделген модулду колдонуңуз.

Шилтемелер

Биздин бекер семинарлардын бирине келиңиз!

Биздин акысыз семинарлар менен маалымат таануучу катары карьераңызды баштаңыз, алар ийкемдүү окуу планына негизделген жана тармактык эксперттер жетектеген.


Career Services background pattern

Карьера кызматтары

Contact Section background image

байланышта бололу

Code Labs Academy © 2024 Бардык укуктар корголгон.