PINN零基礎(chǔ)入門指南,附代碼(一)
目標(biāo)
使用最簡的神經(jīng)網(wǎng)絡(luò)模型來擬合簡單函數(shù)
。
內(nèi)容介紹
- 神經(jīng)網(wǎng)絡(luò)模型
如上圖所示,為最簡單的MLP架構(gòu)(隱藏層的線性簡單堆疊,隱藏層的圓圈即表示一個神經(jīng)元),本文采用一個隱藏層64個神經(jīng)元,一個輸入層一個輸出層,表示變量所在層數(shù),和表示變量所在層的位置,表示第層第個神經(jīng)元的值,所有神經(jīng)元的和為優(yōu)化參數(shù)下文用指代。
為激活函數(shù),通常情況下激活函數(shù)有以下幾種,神經(jīng)網(wǎng)絡(luò)添加激活函數(shù)的原因是,線性函數(shù)的疊加無法表示非線性函數(shù),本文采用的是函數(shù)
- 損失函數(shù)
是需要訓(xùn)練的神經(jīng)網(wǎng)絡(luò)參數(shù),是訓(xùn)練結(jié)果,是真實結(jié)果,本文采用均方誤差即:
除此之外也有一些其他的誤差形式,這里就不一一舉例。損失函數(shù)決定了優(yōu)化目標(biāo),優(yōu)化器通過梯度下降法優(yōu)化,即:
是步長也叫學(xué)習(xí)率,當(dāng)前減去步長乘以梯度就是更新后的參數(shù)值,現(xiàn)成的梯度算法工具有很多,本文采用Adam。
- 反向傳播
在優(yōu)化過程中需要對損失函數(shù)關(guān)于優(yōu)化參數(shù)求導(dǎo),獲得每一個優(yōu)化參數(shù)對損失函數(shù)的影響即梯度計算:
具體方法如下圖所示,采用鏈?zhǔn)椒▌t的方法從后往前計算,因此也叫反向傳播。
步驟
- 準(zhǔn)備訓(xùn)練數(shù)據(jù):生成一些樣本點(diǎn)
x=torch.linspace(0,1,101).reshape(-1,1) y=torch.sin(x)
- 定義神經(jīng)網(wǎng)絡(luò)模型
class SimpleNN(nn.Module): def __init__(self): super(SimpleNN, self).__init__() self.hidden =nn.Linear(1,64)#隱藏層 self.output = nn.Linear(64,1)#輸出層 def forward(self, x): x=torch.relu(self.hidden(x))#Relu激活函數(shù) return self.output(x)
- 初始化模型,使用均方誤差(MSF)損失函數(shù)來衡量預(yù)測值和真實值之間的差異,選取Adam優(yōu)化器,更新網(wǎng)絡(luò)參數(shù),最小化損失函數(shù)
model = SimpleNN()#初始化模型 criterion = nn.MSELoss()#均方誤差損失函數(shù) optimizer = optim.Adam(model.parameters(), lr=0.001)#Adam優(yōu)化器
- 開始訓(xùn)練模型
num_epochs = 5000#訓(xùn)練5000次 train_losses = [] val_losses = [] for epoch in range(num_epochs): model.train()#啟用訓(xùn)練模式 optimizer.zero_grad()#清除梯度 output_train = model(x_train)#前向傳播 loss_train = criterion(output_train, y_train)#計算訓(xùn)練集損失 loss_train.backward()#反向傳播 optimizer.step()#更新參數(shù)
- 計算結(jié)果
本本文涉及的完整代碼,請后臺回復(fù)關(guān)鍵詞" pinn-1" 獲取。
感謝每一位朋友的關(guān)注!期待能和大家在這個領(lǐng)域攜手前行,后續(xù)會有更多技術(shù)解讀和實戰(zhàn)技巧分享,我們一起學(xué)習(xí),共同成長!~~~??????
工程師必備
- 項目客服
- 培訓(xùn)客服
- 平臺客服
TOP




















