最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

PyTorch上搭建簡(jiǎn)單神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)回歸和分類的示例

來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 14:12:30
文檔

PyTorch上搭建簡(jiǎn)單神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)回歸和分類的示例

PyTorch上搭建簡(jiǎn)單神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)回歸和分類的示例:本篇文章主要介紹了PyTorch上搭建簡(jiǎn)單神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)回歸和分類的示例,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起過來看看吧本文介紹了PyTorch上搭建簡(jiǎn)單神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)回歸和分類的示例,分享給大家,具體如下:一、PyTorch入門1. 安裝方法登錄PyTorch官網(wǎng)
推薦度:
導(dǎo)讀PyTorch上搭建簡(jiǎn)單神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)回歸和分類的示例:本篇文章主要介紹了PyTorch上搭建簡(jiǎn)單神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)回歸和分類的示例,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起過來看看吧本文介紹了PyTorch上搭建簡(jiǎn)單神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)回歸和分類的示例,分享給大家,具體如下:一、PyTorch入門1. 安裝方法登錄PyTorch官網(wǎng)

4. 激勵(lì)函數(shù)activationfunction

Torch的激勵(lì)函數(shù)都在torch.nn.functional中,relu,sigmoid, tanh, softplus都是常用的激勵(lì)函數(shù)。


相關(guān)代碼:

import torch 
import torch.nn.functional as F 
from torch.autograd import Variable 
import matplotlib.pyplot as plt 
 
x = torch.linspace(-5, 5, 200) 
x_variable = Variable(x) #將x放入Variable 
x_np = x_variable.data.numpy() 
 
# 經(jīng)過4種不同的激勵(lì)函數(shù)得到的numpy形式的數(shù)據(jù)結(jié)果 
y_relu = F.relu(x_variable).data.numpy() 
y_sigmoid = F.sigmoid(x_variable).data.numpy() 
y_tanh = F.tanh(x_variable).data.numpy() 
y_softplus = F.softplus(x_variable).data.numpy() 
 
plt.figure(1, figsize=(8, 6)) 
 
plt.subplot(221) 
plt.plot(x_np, y_relu, c='red', label='relu') 
plt.ylim((-1, 5)) 
plt.legend(loc='best') 
 
plt.subplot(222) 
plt.plot(x_np, y_sigmoid, c='red', label='sigmoid') 
plt.ylim((-0.2, 1.2)) 
plt.legend(loc='best') 
 
plt.subplot(223) 
plt.plot(x_np, y_tanh, c='red', label='tanh') 
plt.ylim((-1.2, 1.2)) 
plt.legend(loc='best') 
 
plt.subplot(224) 
plt.plot(x_np, y_softplus, c='red', label='softplus') 
plt.ylim((-0.2, 6)) 
plt.legend(loc='best') 
 
plt.show()

二、PyTorch實(shí)現(xiàn)回歸

先看完整代碼:

import torch 
from torch.autograd import Variable 
import torch.nn.functional as F 
import matplotlib.pyplot as plt 
 
x = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1) # 將1維的數(shù)據(jù)轉(zhuǎn)換為2維數(shù)據(jù) 
y = x.pow(2) + 0.2 * torch.rand(x.size()) 
 
# 將tensor置入Variable中 
x, y = Variable(x), Variable(y) 
 
#plt.scatter(x.data.numpy(), y.data.numpy()) 
#plt.show() 
 
# 定義一個(gè)構(gòu)建神經(jīng)網(wǎng)絡(luò)的類 
class Net(torch.nn.Module): # 繼承torch.nn.Module類 
 def __init__(self, n_feature, n_hidden, n_output): 
 super(Net, self).__init__() # 獲得Net類的超類(父類)的構(gòu)造方法 
 # 定義神經(jīng)網(wǎng)絡(luò)的每層結(jié)構(gòu)形式 
 # 各個(gè)層的信息都是Net類對(duì)象的屬性 
 self.hidden = torch.nn.Linear(n_feature, n_hidden) # 隱藏層線性
輸出 self.predict = torch.nn.Linear(n_hidden, n_output) # 輸出層線性輸出 # 將各層的神經(jīng)元搭建成完整的神經(jīng)網(wǎng)絡(luò)的前向通路 def forward(self, x): x = F.relu(self.hidden(x)) # 對(duì)隱藏層的輸出進(jìn)行relu激活 x = self.predict(x) return x # 定義神經(jīng)網(wǎng)絡(luò) net = Net(1, 10, 1) print(net) # 打印輸出net的結(jié)構(gòu) # 定義優(yōu)化器和損失函數(shù) optimizer = torch.optim.SGD(net.parameters(), lr=0.5) # 傳入網(wǎng)絡(luò)參數(shù)和學(xué)習(xí)率 loss_function = torch.nn.MSELoss() # 最小均方誤差 # 神經(jīng)網(wǎng)絡(luò)訓(xùn)練過程 plt.ion() # 動(dòng)態(tài)學(xué)習(xí)過程展示 plt.show() for t in range(300): prediction = net(x) # 把數(shù)據(jù)x喂給net,輸出預(yù)測(cè)值 loss = loss_function(prediction, y) # 計(jì)算兩者的誤差,要注意兩個(gè)參數(shù)的順序 optimizer.zero_grad() # 清空上一步的更新參數(shù)值 loss.backward() # 誤差反相傳播,計(jì)算新的更新參數(shù)值 optimizer.step() # 將計(jì)算得到的更新值賦給net.parameters() # 可視化訓(xùn)練過程 if (t+1) % 10 == 0: plt.cla() plt.scatter(x.data.numpy(), y.data.numpy()) plt.plot(x.data.numpy(), prediction.data.numpy(), 'r-', lw=5) plt.text(0.5, 0, 'L=%.4f' % loss.data[0], fontdict={'size': 20, 'color': 'red'}) plt.pause(0.1)

首先創(chuàng)建一組帶噪聲的二次函數(shù)擬合數(shù)據(jù),置于Variable中。定義一個(gè)構(gòu)建神經(jīng)網(wǎng)絡(luò)的類Net,繼承torch.nn.Module類。Net類的構(gòu)造方法中定義輸入神經(jīng)元、隱藏層神經(jīng)元、輸出神經(jīng)元數(shù)量的參數(shù),通過super()方法獲得Net父類的構(gòu)造方法,以屬性的方式定義Net的各個(gè)層的結(jié)構(gòu)形式;定義Net的forward()方法將各層的神經(jīng)元搭建成完整的神經(jīng)網(wǎng)絡(luò)前向通路。

定義好Net類后,定義神經(jīng)網(wǎng)絡(luò)實(shí)例,Net類實(shí)例可以直接print打印輸出神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)信息。接著定義神經(jīng)網(wǎng)絡(luò)的優(yōu)化器和損失函數(shù)。定義好這些后就可以進(jìn)行訓(xùn)練了。optimizer.zero_grad()、loss.backward()、optimizer.step()分別是清空上一步的更新參數(shù)值、進(jìn)行誤差的反向傳播并計(jì)算新的更新參數(shù)值、將計(jì)算得到的更新值賦給net.parameters()。循環(huán)迭代訓(xùn)練過程。

運(yùn)行結(jié)果:

Net (

(hidden): Linear (1 -> 10)

(predict): Linear (10 -> 1)

)

三、PyTorch實(shí)現(xiàn)簡(jiǎn)單分類

完整代碼:

import torch 
from torch.autograd import Variable 
import torch.nn.functional as F 
import matplotlib.pyplot as plt 
 
# 生成數(shù)據(jù) 
# 分別生成2組各100個(gè)數(shù)據(jù)點(diǎn),增加正態(tài)噪聲,后標(biāo)記以y0=0 y1=1兩類標(biāo)簽,最后cat連接到一起 
n_data = torch.ones(100,2) 
# torch.normal(means, std=1.0, out=None) 
x0 = torch.normal(2*n_data, 1) # 以tensor的形式給出
輸出tensor各元素的均值,共享標(biāo)準(zhǔn)差 y0 = torch.zeros(100) x1 = torch.normal(-2*n_data, 1) y1 = torch.ones(100) x = torch.cat((x0, x1), 0).type(torch.FloatTensor) # 組裝(連接) y = torch.cat((y0, y1), 0).type(torch.LongTensor) # 置入Variable中 x, y = Variable(x), Variable(y) class Net(torch.nn.Module): def __init__(self, n_feature, n_hidden, n_output): super(Net, self).__init__() self.hidden = torch.nn.Linear(n_feature, n_hidden) self.out = torch.nn.Linear(n_hidden, n_output) def forward(self, x): x = F.relu(self.hidden(x)) x = self.out(x) return x net = Net(n_feature=2, n_hidden=10, n_output=2) print(net) optimizer = torch.optim.SGD(net.parameters(), lr=0.012) loss_func = torch.nn.CrossEntropyLoss() plt.ion() plt.show() for t in range(100): out = net(x) loss = loss_func(out, y) # loss是定義為神經(jīng)網(wǎng)絡(luò)的輸出與樣本標(biāo)簽y的差別,故取softmax前的值 optimizer.zero_grad() loss.backward() optimizer.step() if t % 2 == 0: plt.cla() # 過了一道 softmax 的激勵(lì)函數(shù)后的最大概率才是預(yù)測(cè)值 # torch.max既返回某個(gè)維度上的最大值,同時(shí)返回該最大值的索引值 prediction = torch.max(F.softmax(out), 1)[1] # 在第1維度取最大值并返回索引值 pred_y = prediction.data.numpy().squeeze() target_y = y.data.numpy() plt.scatter(x.data.numpy()[:, 0], x.data.numpy()[:, 1], c=pred_y, s=100, lw=0, cmap='RdYlGn') accuracy = sum(pred_y == target_y)/200 # 預(yù)測(cè)中有多少和真實(shí)值一樣 plt.text(1.5, -4, 'Accu=%.2f' % accuracy, fontdict={'size': 20, 'color': 'red'}) plt.pause(0.1) plt.ioff() plt.show()

神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)部分的Net類與前文的回歸部分的結(jié)構(gòu)相同。

需要注意的是,在循環(huán)迭代訓(xùn)練部分,out定義為神經(jīng)網(wǎng)絡(luò)的輸出結(jié)果,計(jì)算誤差loss時(shí)不是使用one-hot形式的,loss是定義在out與y上的torch.nn.CrossEntropyLoss(),而預(yù)測(cè)值prediction定義為out經(jīng)過Softmax后(將結(jié)果轉(zhuǎn)化為概率值)的結(jié)果。

運(yùn)行結(jié)果:

Net (

(hidden): Linear (2 -> 10)

(out):Linear (10 -> 2)

)

四、補(bǔ)充知識(shí)

1. super()函數(shù)

在定義Net類的構(gòu)造方法的時(shí)候,使用了super(Net,self).__init__()語句,當(dāng)前的類和對(duì)象作為super函數(shù)的參數(shù)使用,這條語句的功能是使Net類的構(gòu)造方法獲得其超類(父類)的構(gòu)造方法,不影響對(duì)Net類單獨(dú)定義構(gòu)造方法,且不必關(guān)注Net類的父類到底是什么,若需要修改Net類的父類時(shí)只需修改class語句中的內(nèi)容即可。

2. torch.normal()

torch.normal()可分為三種情況:(1)torch.normal(means,std, out=None)中means和std都是Tensor,兩者的形狀可以不必相同,但Tensor內(nèi)的元素?cái)?shù)量必須相同,一一對(duì)應(yīng)的元素作為輸出的各元素的均值和標(biāo)準(zhǔn)差;(2)torch.normal(mean=0.0, std, out=None)中mean是一個(gè)可定義的float,各個(gè)元素共享該均值;(3)torch.normal(means,std=1.0, out=None)中std是一個(gè)可定義的float,各個(gè)元素共享該標(biāo)準(zhǔn)差。

3. torch.cat(seq, dim=0)

torch.cat可以將若干個(gè)Tensor組裝連接起來,dim指定在哪個(gè)維度上進(jìn)行組裝。

4. torch.max()

(1)torch.max(input)→ float

input是tensor,返回input中的最大值float。

(2)torch.max(input,dim, keepdim=True, max=None, max_indices=None) -> (Tensor, LongTensor)

同時(shí)返回指定維度=dim上的最大值和該最大值在該維度上的索引值。

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

PyTorch上搭建簡(jiǎn)單神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)回歸和分類的示例

PyTorch上搭建簡(jiǎn)單神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)回歸和分類的示例:本篇文章主要介紹了PyTorch上搭建簡(jiǎn)單神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)回歸和分類的示例,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起過來看看吧本文介紹了PyTorch上搭建簡(jiǎn)單神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)回歸和分類的示例,分享給大家,具體如下:一、PyTorch入門1. 安裝方法登錄PyTorch官網(wǎng)
推薦度:
標(biāo)簽: 分類 實(shí)現(xiàn) to
  • 熱門焦點(diǎn)

最新推薦

猜你喜歡

熱門推薦

專題
Top