深度學習筆記6 全連線層的實現

2021-08-09 17:26:10 字數 3441 閱讀 8027

標籤: c語言

神經網路

深度學習

cuda

2016-08-21 14:31

14420人閱讀收藏

舉報

深度學習(13)

作者同類文章x

目錄(?)

[+]

全連線層的推導

全連線層的前向計算

全連線層的反向傳播

對上一層的輸出即當前層的輸入求導

對權重係數w求導

對偏置係數b求導

caffe中全連線層的實現

前向計算

反向傳播

全連線層的每乙個結點都與上一層的所有結點相連,用來把前邊提取到的特徵綜合起來。由於其全相連的特性,一般全連線層的引數也是最多的。

下圖中連線最密集的2個地方就是全連線層,這很明顯的可以看出全連線層的引數的確很多。在前向計算過程,也就是乙個線性的加權求和的過程,全連線層的每乙個輸出都可以看成前一層的每乙個結點乘以乙個權重係數w,最後加上乙個偏置值b得到,即 。如下圖中第乙個全連線層,輸入有50*4*4個神經元結點,輸出有500個結點,則一共需要50*4*4*500=400000個權值引數w和500個偏置引數b。

下面用乙個簡單的網路具體介紹一下推導過程

其中,x1、x2、x3為全連線層的輸入,a1、a2、a3為輸出,根據我前邊在筆記1中的推導,有

可以寫成如下矩陣形式:

以我們的第乙個全連線層為例,該層有50*4*4=800個輸入結點和500個輸出結點。

由於需要對w和b進行更新,還要向前傳遞梯度,所以我們需要計算如下三個偏導數。

1、對上一層的輸出(即當前層的輸入)求導 若我們已知轉遞到該層的梯度

首先需要求得該層的輸出a

i對輸入x

j的偏導數

再通過鏈式法則求得loss對x的偏導數:

上邊求導的結果也印證了我前邊那句話:在反向傳播過程中,若第x層的a節點通過權值w對x+1層的b節點有貢獻,則在反向傳播過程中,梯度通過權值w從b節點傳播回a節點。

若我們的一次訓練16張,即batch_size=16,則我們可以把計算轉化為如下矩陣形式。

2、對權重係數w求導

我們前向計算的公式如下圖,

由圖可知

當batch_size=16時,寫成矩陣形式:

3、對偏置係數b求導 由上面前向推導公式可知

即loss對偏置係數的偏導數等於對上一層輸出的偏導數。

當batch_size=16時,將不同batch對應的相同b的偏導相加即可,寫成矩陣形式即為乘以乙個全1的矩陣:

在caffe中,關於全連線層的配置資訊如下:

[cpp]view plain

copy

print?

layer   

param   

inner_product_param   

bias_filler   

}  }  

layer 

param

inner_product_param

bias_filler

}}

該層型別為innerproduct內積,也就是我們常說的全連線層,前一層(底層)為pool2乙個池化層,頂層,即該層的輸出ip1,即為乙個全連線層。關於學習率的引數lr_mult我們後面在權值更新章節再看。其他的引數我們在之前的卷積層都遇到過,含義和卷積層也一樣,這裡就不再多說。

caffe中全連線層相關的gpu檔案有1個,為\src\caffe\layersi\nner_product_layer.cu 。

前向過程**如下,具體解釋見注釋部分:

[cpp]view plain

copy

print?

template

void innerproductlayer::forward_gpu(const vector*>& bottom,  

const vector*>& top)  else   

}  

template void innerproductlayer::forward_gpu(const vector*>& bottom,

const vector*>& top) else

}

**及注釋如下

[cpp]view plain

copy

print?

template

void innerproductlayer::backward_gpu(const vector*>& top,  

const vector& propagate_down,  

const vector*>& bottom)  else   

}  if (bias_term_ && this->param_propagate_down_[1])   

if (propagate_down[0])  else   

}  }  

template void innerproductlayer::backward_gpu(const vector*>& top,

const vector& propagate_down,

const vector*>& bottom) else

} if (bias_term_ && this->param_propagate_down_[1])

if (propagate_down[0]) else

}}

5 踩

0

深度學習筆記6 全連線層的實現

全連線層的每乙個結點都與上一層的所有結點相連,用來把前邊提取到的特徵綜合起來。由於其全相連的特性,一般全連線層的引數也是最多的。下圖中連線最密集的2個地方就是全連線層,這很明顯的可以看出全連線層的引數的確很多。在前向計算過程,也就是乙個線性的加權求和的過程,全連線層的每乙個輸出都可以看成前一層的每乙...

全連線層的作用 全連線層實現

將圖1 堆疊可以得到含有多個隱藏層的全連線層,如圖2所示。因為當前層的輸入要與前一層的輸出相匹配 所以,要保證當前層的神經元個數與前一層的輸出結點數相同。即,圖二中隱藏層1有256個神經元,隱藏層2有128個神經元,則隱藏層1中每個神經元的輸出節點數為12。下面,以圖2為例,用不同的方式實現全連線層...

全連線層的實現

全連線層的每乙個結點都與上一層的所有結點相連,用來把前邊提取到的特徵綜合起來。由於其全相連的特性,一般全連線層的引數也是最多的。下圖中連線最密集的2個地方就是全連線層,這很明顯的可以看出全連線層的引數的確很多。在前向計算過程,也就是乙個線性的加權求和的過程,全連線層的每乙個輸出都可以看成前一層的每乙...