全連線層是mlp的重要組成部分。其前向傳播的計算過程為:
其中,
為全連線層第
層的輸入,是乙個
的矩陣,其中
和 分別為乙個batch的樣本個數和上一層的節點數;
和 為權重和偏置,其中權重為
的矩陣,偏置為乙個
的向量,其中
為下一層的節點數。
對於第
層,其反向傳播的過程分為求權重與偏置的偏導(誤差)和求該層的誤差,權重與偏置的偏導即求損失對其的梯度用以進行網路的引數更新,而第
層的誤差是為了將誤差傳給前一層,以進行反向傳播。
對於第
層,其權重與偏置的偏導:
其中,
為網路的總層數,
為第 層的輸出,因而
為損失對第
層輸出的誤差。由於全連線網路的層與層之間是串聯的結構,因此第
層的輸出與第
層的輸入相同,即
。因此在反向傳播中,對於第
層來說,只需要獲取第
層傳來的誤差
,並計算當前層的權重與偏置的偏導即可獲得該層引數的梯度了。
由於 ,因此
。下面是全連線層fullconnectionlayer類的標頭檔案。
#ifndef fullconnection_layer_h_
#define fullconnection_layer_h_
#include "operator.hpp"
namespace mario
fc;}
#endif //fullconnection_layer_h_
fullconnectionlayer類的資料成員包括輸入輸出m_in、m_out,權重m_w、偏置m_b及其梯度m_dw、m_db,該層的誤差m_x。成員函式包括前向傳播forward(),反向傳播求梯度backward(),更新權重與偏置update(),還可以檢視權重和偏置getw()、getb()。
下面重點記錄一下前向與反向傳播的部分,首先是前向傳播forward()。
const matrix& fullconnectionlayer::forward(const matrix&_lastout)
m_in.release();
m_out.release();
m_in = _lastout;
m_out = m_in*m_w + m_b;
return m_out;
}
接下來是反向傳播。
const matrix& fullconnectionlayer::backward(const matrix &_nextderr)
m_dw.release();
m_db.release();
m_dx.release();
m_dw = m_in.t()*_nextderr / m_in.rows();
m_db = _nextderr.meanbycol();
m_dx = _nextderr*m_w.t();
return m_dx;
}
最後利用求得的梯度更新引數。
void fullconnectionlayer::update(const double &_learningrate)
至此,fullconnectionlayer的主要成員函式記錄完畢了 。
接下來是損失函式的介紹和如何利用這些資料和單個的層,連線成一整個網路,並進行前向與反向傳播。
全連線層的作用 全連線層實現
將圖1 堆疊可以得到含有多個隱藏層的全連線層,如圖2所示。因為當前層的輸入要與前一層的輸出相匹配 所以,要保證當前層的神經元個數與前一層的輸出結點數相同。即,圖二中隱藏層1有256個神經元,隱藏層2有128個神經元,則隱藏層1中每個神經元的輸出節點數為12。下面,以圖2為例,用不同的方式實現全連線層...
全連線層的作用
全連線層到底什麼用?我來談三點。注1 有關卷積操作 實現 全連線層,有必要多囉嗦幾句。以vgg 16為例,對224x224x3的輸入,最後一層卷積可得輸出為7x7x512,如後層是一層含4096個神經元的fc,則可用卷積核為7x7x512x4096的全域性卷積來實現這一全連線運算過程,其中該卷積核引...
全連線層的作用
全連線層的作用主要就是實現分類 全連線層中一層的乙個神經元就可以看成乙個多項式,我們用許多神經元去擬合資料分布但是只用一層fully connected layer 有時候沒法解決非線性問題,而如果有兩層或以上fully connected layer就可以很好地解決非線性問題了。在卷積神經網路的最...