Skip to main content

Vispārīgs ceļvedis 1D Burgersa vienādojuma risināšanai ar fizikas informētiem neironu tīkliem (PINNs): PyTorch pieeja, izmantojot automātisko diferenciāciju un kolokācijas metodes

Praktisks ceļvedis Burgersa vienādojuma risināšanai ar fizikas informētiem neironu tīkliem

Šajā pamācībā mēs izpētām inovatīvu pieeju, kas apvieno dziālo mācīšanos ar fizikas likumiem, izmantojot fizikas informētos neironu tīklus (PINN) viendimensijas Burgersa vienādojuma risināšanai. Izmantojot PyTorch Google Colab vidē, mēs parādām, kā iekodēt vadāmo diferenciālvienādojumu tieši neironu tīkla zaudējumu funkcijā, ļaujot modelim apgūt risinājumu 𝑢(𝑥,𝑡), kas iekšēji ievēro pamatfiziku. Šī metode samazina atkarību no lieliem marķētiem datu kopumiem un piedāvā jaunu perspektīvu sarežģītu, nelineāru daļēju diferenciālvienādojumu risināšanā, izmantojot mūsdienu skaitļošanas rīkus.

Vispirms mēs instalējam PyTorch un matplotlib bibliotēkas, izmantojot pip, nodrošinot, ka jūsu Google Colab vidē ir nepieciešamie rīki neironu tīklu veidošanai un rezultātu vizualizēšanai.

import torch 
import torch.nn as nn 
import torch.optim as optim 
import numpy as np 
import matplotlib.pyplot as plt 

torch.set_default_dtype(torch.float32)

Mēs importējam nepieciešamās bibliotēkas: PyTorch dziālai mācīšanai, NumPy skaitliskām operācijām un matplotlib zīmēšanai. Mēs iestatām noklusējuma tenzora datu tipu uz float32, lai nodrošinātu konsekventu skaitlisko precizitāti visos aprēķinos.

Datu sagatavošana un modeļa definēšana

Mēs definējam simulācijas domēnu Burgersa vienādojumam, nosakot telpiskās un temporālās robežas, viskozitāti un kolokācijas, sākotnējo un robežu punktu skaitu. Pēc tam mēs ģenerējam nejaušus un vienmērīgi sadalītus datu punktus šiem nosacījumiem un pārveidojam tos par PyTorch tenzoriem, iespējojot gradientu aprēķinu, kur nepieciešams.

class PINN(nn.Module):
    def __init__(self, layers):
        super(PINN, self).__init__()
        self.activation = nn.Tanh()
        layer_list = []
        for i in range(len(layers) - 1):
            layer_list.append(nn.Linear(layers[i], layers[i+1]))
        self.layers = nn.ModuleList(layer_list)
    
def forward(self, x):
    for i, layer in enumerate(self.layers[:-1]):
        x = self.activation(layer(x))
    return self.layers[-1](x)

layers = [2, 50, 50, 50, 50, 1]
model = PINN(layers)
print(model)

Šeit mēs definējam pielāgotu fizikas informētu neironu tīklu (PINN), paplašinot PyTorch nn.Module. Tīkla arhitektūra tiek veidota dinamiski, izmantojot slāņu izmēru sarakstu, kur katru lineāro slāni seko Tanh aktivizācija (izņemot pēdējo izvades slāni). Šajā piemērā tīkls ņem 2-dimensiju ievadi, izlaiž to cauri četriem slēptajiem slāņiem (katrā pa 50 neironiem) un izvada vienu vērtību.

Modeļa mācīšana un rezultātu vizualizācija

Mēs iestatām PINN apmācības ciklu, izmantojot Adam optimizatoru ar mācīšanās ātrumu 1×10−3. 5000 epohu laikā tas atkārtoti aprēķina zaudējumus (kas ietver PDE atlikumu, sākotnējos un robežnosacījumu kļūdas), veic atpakaļizplatīšanu un atjaunina modeļa parametrus.

Beidzot, mēs izveidojam punktu režģi pār definēto telpisko (𝑥) un temporālo (𝑡) domēnu, padodam šos punktus apmācītajam modelim, lai prognozētu risinājumu 𝑢(𝑥, 𝑡), un pārveidojam izvadi 2D masīvā. Mēs arī vizualizējam prognozēto risinājumu kā kontūru zīmējumu, izmantojot matplotlib, ar krāsu joslu, asu nosaukumiem un virsrakstu.

Noslēgumā šī pamācība ir parādījusi, kā PINN var efektīvi īstenot 1D Burgersa vienādojuma risināšanai, iekļaujot problēmas fiziku apmācības procesā. Rūpīgi izveidojot neironu tīklu, ģenerējot kolokācijas un robeždatus, un izmantojot automātisku diferenciāciju, mēs esam sasnieguši modeli, kas apgūst risinājumu, kas atbilst PDE un noteiktajiem nosacījumiem.


Šeit ir Colab piezīmju grāmatiņa. Neaizmirstiet sekot mums Twitter un pievienoties mūsu Telegram kanālam un LinkedIn grupai. Pievienojieties arī mūsu 85k+ ML SubReddit.

https://www.marktechpost.com/

Atbildēt

Jūsu e-pasta adrese netiks publicēta. Obligātie lauki ir atzīmēti kā *