import torch
import torch.nn.functional as f #激勵函式,relu,sigmoid, tanh, softplus
import matplotlib.pyplot as plt
from torch.autograd import variable
sigmoid函式的表示式為y=1/(1+ex)。
sigmoid函式是傳統神經網路中最常用的啟用函式,一度被視為神經網路的核心所在。
從數學上來看,sigmoid函式對**區的訊號增益較大,對兩側區的訊號增益小,在訊號的特徵空間對映上,有很好的效果。
從神經科學上來看,**區酷似神經元的興奮態,兩側區酷似神經元的抑制態,因而在神經網路學習方面,可以將重點特徵推向**區,將非重點特徵推向兩側區。
tanhyperbolic(tanh)函式又稱作雙曲正切函式,數學表示式為y=(ex−e−x)/(ex+e−x)。
在具體應用中,tanh函式相比於sigmoid函式往往更具有優越性,這主要是因為sigmoid函式在輸入處於[-1,1]之間時,函式值變化敏感,一旦接近或者超出區間就失去敏感性,處於飽和狀態,影響神經網路**的精度值。而tanh的輸出和輸入能夠保持非線性單調上公升和下降關係,符合bp網路的梯度求解,容錯性好,有界,漸進於0、1,符合人腦神經飽和的規律,但比sigmoid函式延遲了飽和期。
relu函式的全稱為rectified linear units,函式表示式為y=max(0,x),softplus函式的數學表示式為y=log(1+ex)。
那麼softplus和relu相比於sigmoid的優點在**呢?
第一,採用sigmoid等函式,算啟用函式時(指數運算),計算量大,反向傳播求誤差梯度時,求導涉及除法,計算量相對大,而採用relu啟用函式,整個過程的計算量節省很多。
第二,對於深層網路,sigmoid函式反向傳播時,很容易就會出現梯度消失的情況(在sigmoid接近飽和區時,變換太緩慢,導數趨於0,這種情況會造成資訊丟失),從而無法完成深層網路的訓練。
第三,relu會使一部分神經元的輸出為0,這樣就造成了網路的稀疏性,並且減少了引數的相互依存關係,緩解了過擬合問題的發生。
softmax函式
我們可以看到,sigmoid函式實際上就是把資料對映到乙個(−1,1)的空間上,也就是說,sigmoid函式如果用來分類的話,只能進行二分類,而這裡的softmax函式可以看做是sigmoid函式的一般化,可以進行多分類。softmax函式的函式表示式為:σ(z)j=ezj/∑kk=1ezk。從公式中可以看出,就是如果某乙個zj大過其他z,那這個對映的分量就逼近於1,其他就逼近於0,即用於多分類。也可以理解為將k維向量對映為另外一種k維向量。
# 生成資料
x = torch.unsqueeze(torch.linspace(-1, 1,100), dim = 1)
y = x.pow(2) + 0.2 * torch.rand(x.size())
# 變為variable, variable 就是乙個存放會變化的值的位置
# 定義tensor: tensor =torch.floattensor([[1,2],[3,4]])
# 將tensor放入variable:variable = variable(tensor, requires_grad=true)
# requires_grad 是參不參與誤差反向傳播, 要不要計算梯度
x,y = variable(x), variable(y)
# 繪製資料影象
plt.scatter(x.data.numpy(), y.data.numpy())
plt.show()
# 定義pytorch網路,__init__只是定義了幾個層,forward進行傳播,也就是整個網路的搭建,因為是**,最後一層不需要激勵函式
class net(torch.nn.module):
def __init__(self, n_features, n_hidden, n_output):
super(net, self).__init__()
self.hidden = torch.nn.linear(n_features, n_hidden)
self.predict = torch.nn.linear(n_hidden, n_output)
def forward(self, x):
x = f.relu(self.hidden(x))
y = self.predict(x)
return y
# 構建網路
net = net(1, 10, 1)
print net
#sgd,隨機梯度下降;momentum,動量加速;rmsprop,指定引數alpha;adam,引數betas
#opt_sgd = torch.optim.sgd(net_sgd.parameters(), lr=lr)
#opt_momentum = torch.optim.sgd(net_momentum.parameters(),lr=lr, momentum=0.8)
#opt_rmsprop = torch.optim.rmsprop(net_rmsprop.parameters(), lr=lr, alpha=0.9)
#opt_adam = torch.optim.adam(net_adam.parameters(), lr=lr, betas=(0.9, 0.99))
# 定義優化器,選擇優化方法,傳入 net 的所有引數, 學習率lr
optimizer = torch.optim.sgd(net.parameters(),lr = 0.5)
# 選擇損失函式,# **值和真實值的誤差計算公式 (均方差)
loss_func = torch.nn.mseloss()
plt.ion()
# 訓練
for i in xrange(100):
#餵給 net 訓練資料 x,對x進行**,輸出**值
prediction = net(x)
#計算損失
loss = loss_func(prediction, y)
#每次迭代清空上一次的梯度
optimizer.zero_grad()
#反向傳播,計算引數更新值
loss.backward()
#更新梯度,將引數更新值施加到 net 的 parameters 上
optimizer.step()
if i % 5 == 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, 'loss=%.4f' % loss.data[0], fontdict=)
plt.pause(0.1)
plt.ioff()
plt.show()
由乙個網域名稱想到的
花了 大價錢 買了乙個網域名稱 zzm.hk,夠短了,其實沒有什麼含義,但沒有其它選擇。這樣的網域名稱,好像只能指向個人部落格站點,或者用qq郵箱體系裡的網域名稱郵箱功能設定乙個如 i zzm.hk 記得給我發郵件 的個人email。記得 phpdragon 以前還註冊過乙個 phpdragon.c...
由乙個矩陣得到乙個掩模矩陣
1.假設有乙個不完整的資料,如下 2030251 51830 317810 0232930112 1815 0import pandas as pd import numpy as np read data data pd.read csv data.csv a np.isnan data get ...
由解乙個bug想到的
最近花費了很久時間去解決乙個bug,在我手裡有乙個月了。今天同事出手幫忙解決掉了,分外感激。這個bug如果按照我的思路,再過乙個月也不一定能夠解決掉。三人行,必有我師。同事身上有許多值得我學習的地方。比如,我是從程式碼執行機制方面找尋產生bug的原因,可是程式碼數量龐大。很難發現其中的某一處問題所在...