4. 激勵函數activationfunction
Torch的激勵函數都在torch.nn.functional中,relu,sigmoid, tanh, softplus都是常用的激勵函數。
相關代碼:
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() # 經過4種不同的激勵函數得到的numpy形式的數據結果 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實現回歸
先看完整代碼:
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維的數據轉換為2維數據 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() # 定義一個構建神經網絡的類 class Net(torch.nn.Module): # 繼承torch.nn.Module類 def __init__(self, n_feature, n_hidden, n_output): super(Net, self).__init__() # 獲得Net類的超類(父類)的構造方法 # 定義神經網絡的每層結構形式 # 各個層的信息都是Net類對象的屬性 self.hidden = torch.nn.Linear(n_feature, n_hidden) # 隱藏層線性
首先創建一組帶噪聲的二次函數擬合數據,置于Variable中。定義一個構建神經網絡的類Net,繼承torch.nn.Module類。Net類的構造方法中定義輸入神經元、隱藏層神經元、輸出神經元數量的參數,通過super()方法獲得Net父類的構造方法,以屬性的方式定義Net的各個層的結構形式;定義Net的forward()方法將各層的神經元搭建成完整的神經網絡前向通路。
定義好Net類后,定義神經網絡實例,Net類實例可以直接print打印輸出神經網絡的結構信息。接著定義神經網絡的優化器和損失函數。定義好這些后就可以進行訓練了。optimizer.zero_grad()、loss.backward()、optimizer.step()分別是清空上一步的更新參數值、進行誤差的反向傳播并計算新的更新參數值、將計算得到的更新值賦給net.parameters()。循環迭代訓練過程。
運行結果:
Net (
(hidden): Linear (1 -> 10)
(predict): Linear (10 -> 1)
)
三、PyTorch實現簡單分類
完整代碼:
import torch from torch.autograd import Variable import torch.nn.functional as F import matplotlib.pyplot as plt # 生成數據 # 分別生成2組各100個數據點,增加正態噪聲,后標記以y0=0 y1=1兩類標簽,最后cat連接到一起 n_data = torch.ones(100,2) # torch.normal(means, std=1.0, out=None) x0 = torch.normal(2*n_data, 1) # 以tensor的形式給出
神經網絡結構部分的Net類與前文的回歸部分的結構相同。
需要注意的是,在循環迭代訓練部分,out定義為神經網絡的輸出結果,計算誤差loss時不是使用one-hot形式的,loss是定義在out與y上的torch.nn.CrossEntropyLoss(),而預測值prediction定義為out經過Softmax后(將結果轉化為概率值)的結果。
運行結果:
Net (
(hidden): Linear (2 -> 10)
(out):Linear (10 -> 2)
)
四、補充知識
1. super()函數
在定義Net類的構造方法的時候,使用了super(Net,self).__init__()語句,當前的類和對象作為super函數的參數使用,這條語句的功能是使Net類的構造方法獲得其超類(父類)的構造方法,不影響對Net類單獨定義構造方法,且不必關注Net類的父類到底是什么,若需要修改Net類的父類時只需修改class語句中的內容即可。
2. torch.normal()
torch.normal()可分為三種情況:(1)torch.normal(means,std, out=None)中means和std都是Tensor,兩者的形狀可以不必相同,但Tensor內的元素數量必須相同,一一對應的元素作為輸出的各元素的均值和標準差;(2)torch.normal(mean=0.0, std, out=None)中mean是一個可定義的float,各個元素共享該均值;(3)torch.normal(means,std=1.0, out=None)中std是一個可定義的float,各個元素共享該標準差。
3. torch.cat(seq, dim=0)
torch.cat可以將若干個Tensor組裝連接起來,dim指定在哪個維度上進行組裝。
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)
同時返回指定維度=dim上的最大值和該最大值在該維度上的索引值。
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com