由乙個關係擬合拓展的

2021-08-13 21:33:08 字數 3485 閱讀 8731

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的原因,可是程式碼數量龐大。很難發現其中的某一處問題所在...