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) # 隱藏層線性
首先創(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的形式給出
神經(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