Pytorch搭建神經網路完成監督學習 回歸任務

2021-10-18 04:14:00 字數 3518 閱讀 5042

要實現監督學習訓練,我們首先要有訓練集(trainning set)。我們用如下方法建立:

import torch

import matplotlib.pyplot as plt

import torch.nn.functional as f

from torch.autograd import variable

batch_n = 100

#create training-set

x = torch.linspace(-3, 3, batch_n).reshape(batch_n, 1)

real_y = 5*torch.cos(x) + 2*torch.sin(5*x)

y = real_y + 0.3*torch.randn(batch_n, 1)

解釋:

batch_n:訓練集樣本個數;

建立100個離散點。其橫座標用torch.linspace函式在[-3, 3]區間上平均取100個點,然後以y = 5cos(x)+2sin(5x)函式為原型,加入高斯雜訊,得到訓練集(x, y)。

將訓練集視覺化:

plt.figure()

plt.scatter(x.data.numpy(), y.data.numpy(), label='trainning set')

plt.plot(x.data.numpy(), real_y.data.numpy(), 'g-', label='real-curve')

plt.legend()

plt.show()

用藍色的離散點表示訓練集,綠線作為原型函式的參考。

作回歸**時,我們只給神經網路乙個引數x,所以輸入層維度時1;神經網路只需要反饋給我們乙個**值y,因此**層維度也是1。關於隱藏層,這裡我們新增20個神經元,選用sigmoid啟用函式。

使用mseloss作損失函式,選用adam優化器,初始化學習率0.8

#network

class net(torch.nn.module):

def __init__(self, in_dim, hidden_dim, out_dim):

super(net, self).__init__()

self.hidden = torch.nn.linear(in_dim, hidden_dim)

self.predict = torch.nn.linear(hidden_dim, out_dim)

def forward(self, x):

x = self.hidden(x)

x = f.sigmoid(x)

x = self.predict(x)

return x

net = net(in_dim=1, hidden_dim=20, out_dim=1)

loss_func = torch.nn.mseloss()

optimizer = torch.optim.adam(net.parameters(), lr=0.8)

筆者用for迴圈作500次迭代訓練。

for i in range(500):

pre_y = net(x)

loss = loss_func(pre_y, y)

optimizer.zero_grad()

loss.backward()

optimizer.step()

直接附上總**。

import torch

import matplotlib.pyplot as plt

import torch.nn.functional as f

from torch.autograd import variable

batch_n = 100

#create training-set

x = torch.linspace(-3, 3, batch_n).reshape(batch_n, 1)

real_y = 5*torch.cos(x) + 2*torch.sin(5*x)

y = real_y + 0.3*torch.randn(batch_n, 1)

#network

class net(torch.nn.module):

def __init__(self, in_dim, hidden_dim, out_dim):

super(net, self).__init__()

self.hidden = torch.nn.linear(in_dim, hidden_dim)

self.predict = torch.nn.linear(hidden_dim, out_dim)

def forward(self, x):

x = self.hidden(x)

x = f.sigmoid(x)

x = self.predict(x)

return x

net = net(in_dim=1, hidden_dim=20, out_dim=1)

loss_func = torch.nn.mseloss()

optimizer = torch.optim.adam(net.parameters(), lr=0.8)

for i in range(500):

pre_y = net(x)

loss = loss_func(pre_y, y)

optimizer.zero_grad()

loss.backward()

optimizer.step()

pre_y = net(x)

loss = loss_func(pre_y, y)

plt.figure()

plt.scatter(x.data.numpy(), y.data.numpy(), label='trainning-set')

plt.plot(x.data.numpy(), real_y.data.numpy(), 'g-', label='real-curve')

plt.plot(x.data.numpy(), pre_y.data.numpy(), 'r-', label='pred-curve')

plt.title('loss:%.2f' % loss)

plt.legend()

plt.show()

用藍色的離散點表示訓練集,綠線作為原型函式的參考,紅線為神經網路模型給出的回歸模型。

筆者在做實驗時還嘗試過兩個隱藏層,但效果卻比乙個隱藏層差很多,原因是多加入的隱藏層增加了非線性成分,容易導致模型過擬合。單隱藏層神經元數量選取過多,同樣也容易產生過擬合的問題。

pytorch搭建神經網路入門

autograd自動求導 pytorch 是乙個基於python的科學計算包,用於代替numpy,可以利用gpu的效能進行計算 作為乙個深度學習平台。張量 tensor 類似於numpy中的ndarray,但還可以在gpu上使用,實現加速計算的效果。建立張量的幾種方式 建立乙個沒有初始化的矩陣張量 ...

pytorch 快速搭建神經網路

另一種搭建神經網路的方法,並不定義類 快速搭建乙個神經網路模組 net2 torch.nn.sequential 在這個括號裡面一層一層的壘神經元就好了 torch.nn.linear 2,10 如果中間有激勵函式,也加進來 torch.nn.relu torch.nn.linear 10,2 等同...

pytorch搭建簡單的神經網路

主要是熟悉pytorch這個開源框架。這個網路主要是用來擬合y x 2這個函式用的 所以說很簡單啦 自己生成的訓練資料,全部用來做訓練集了。網路結構 乙個輸入的向量,一層隱藏層,一層輸出層。隱藏層用的relu啟用函式,輸出層什麼都沒加,直接線性輸出。from torch.autograd impor...