要實現監督學習訓練,我們首先要有訓練集(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...