Pytorch中的啟用函式

2021-10-02 21:48:59 字數 4254 閱讀 3128

介紹神經網路的時候已經說到,神經元會對化學物質的刺激進行,當達到一定程度的時候,神經元才會興奮,並向其他神經元傳送資訊。神經網路中的啟用函式就是用來判斷我們所計算的資訊是否達到了往後面傳輸的條件。

因為如果使用線性的啟用函式,那麼input跟output之間的關係始終為線性的,這樣完全可以不使用網路結構,直接使用線性組合即可。

所以需要啟用函式來引入非線性因素,使得神經網路可以任意逼近任何非線性函式,這樣神經網路就可以應用到眾多的非線性模型中,增加了神經網路模型泛化的特性。

一般只有在輸出層有極小的可能性使用線性啟用函式,在隱含層都使用非線性啟用函式.

# 初始化一些資訊

import torch

import torch.nn.functional as f

import matplotlib.pyplot as plt

import numpy as np

x= torch.linspace(-10

,10,60

)

g(z)

= a =1/

(1+ e^

(-z)

)g'(z) = a'

= a (

1- a)

在sigmod函式中我們可以看到,其輸出是在(0,1)這個開區間,它能夠把輸入的連續實值變換為0和1之間的輸出,如果是非常大的負數,那麼輸出就是0;如果是非常大的正數輸出就是1,起到了抑制的作用。

但是sigmod由於需要進行指數運算(這個對於計算機來說是比較慢,相比relu),再加上函式輸出不是以0為中心的(這樣會使權重更新效率降低),當輸入稍微遠離了座標原點,函式的梯度就變得很小了(幾乎為零)。

在神經網路反向傳播的過程中不利於權重的優化,這個問題叫做梯度飽和,也可以叫梯度瀰散。這些不足,所以現在使用到sigmod基本很少了,基本上只有在做二元分類(0,1)時的輸出層才會使用。

tanh是雙曲正切函式,輸出區間是在(-1,1)之間,而且整個函式是以0為中心的

ax = plt.gca(

)ax.spines[

'right'

].set_color(

'none'

)ax.spines[

'top'

].set_color(

'none'

)ax.xaxis.set_ticks_position(

'bottom'

)ax.spines[

'bottom'

].set_position(

('data',0

))ax.yaxis.set_ticks_position(

'left'

)ax.spines[

'left'

].set_position(

('data',0

))plt.ylim((-

1,1)

)tanh=torch.tanh(x)

plt.plot(x.numpy(

),tanh.numpy(

))

[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-c15ouvsv-1581873565035)(

與sigmoid函式類似,當輸入稍微遠離了座標原點,梯度還是會很小,但是好在tanh是以0為中心點,如果使用tanh作為啟用函式,還能起到歸一化(均值為0)的效果。

一般二分類問題中,隱藏層用tanh函式,輸出層用sigmod函式,但是隨著relu的出現所有的隱藏層基本上都使用relu來作為啟用函式了

relu(rectified linear units) 修正線性單元

a =

max(

0, z)

relu函式只有線性關係(只需要判斷輸入是否大於0),不管是前向傳播還是反向傳播,都比simoid和tanh要快很多

當輸入是負數的時候,relu是完全不被啟用的;但是到了反向傳播過程中,輸入負數,梯度就會完全到0,這個和sigmod函式、tanh函式有一樣的問題。 實際的運用中,該缺陷的影響不是很大。

為了解決relu函式z<0時的問題出現了 leaky relu函式,該函式保證在z<0的時候,梯度仍然不為0。

relu的前半段設為αz而非0,通常α=0.01

a =

max(?z, z)

ax = plt.gca(

)ax.spines[

'right'

].set_color(

'none'

)ax.spines[

'top'

].set_color(

'none'

)ax.xaxis.set_ticks_position(

'bottom'

)ax.spines[

'bottom'

].set_position(

('data',0

))ax.yaxis.set_ticks_position(

'left'

)ax.spines[

'left'

].set_position(

('data',0

))plt.ylim((-

3,10)

)l_relu=f.leaky_relu(x,

0.1)

# 這裡的0.1是為了方便展示,理論上應為0.01甚至更小的值

理論上來講,leaky relu有relu的所有優點,但是在實際操作當中,並沒有完全證明leaky relu總是好於relu。

relu目前仍是最常用的activation function,在隱藏層中推薦優先嘗試!

pytorch學習(三)啟用函式

啟用函式 activity function 存在的原因是我們日常解決的實際問題大部分不是線性可分的,而是非線性的,此時就需要啟用函式來處理這一分類問題。y wx b是線性分類問題,啟用函式則通過y af wx b 將線性問題轉換為非線性問題。常用的啟用函式有relu函式 sigmoid函式 tan...

PyTorch中常用的啟用函式的方法示例

神經網路只是由兩個或多個線性網路層疊加,並不能學到新的東西,簡單地堆疊網路層,不經過非線性啟用函式啟用,學到的仍然是線性關係。dpirnpv 但是加入啟用函式可以學到非線性的關係,就具有更強的能力去進行特徵提取。構造資料 import torch import torch.nn.functional...

pytorch中的gather函式

from 今天剛開始接觸,讀了一下documentation,寫乙個一開始每太搞懂的函式gather b torch.tensor 1,2,3 4,5,6 print bindex 1 torch.longtensor 0,1 2,0 index 2 torch.longtensor 0,1,1 0...