程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++卷積神經網絡實例:tiny_cnn代碼詳解(9)——partial_connected_layer層結構類分析(下)

C++卷積神經網絡實例:tiny_cnn代碼詳解(9)——partial_connected_layer層結構類分析(下)

編輯:關於C++

  在上一篇博文中我們著重分析了partial_connected_layer類的成員變量的結構,在這篇博文中我們將繼續對partial_connected_layer類中的其他成員函數做一下簡要介紹。

  一、構造函數

  由於partial_connected_layer類是繼承自基類layer,因此在構造函數中同樣分為兩部分,即調用基類構造函數以及初始化自身成員變量:

partial_connected_layer(layer_size_t in_dim, layer_size_t out_dim, size_t weight_dim, size_t bias_dim, float_t scale_factor = 1.0)
    : layer (in_dim, out_dim, weight_dim, bias_dim), 
     weight2io_(weight_dim), out2wi_(out_dim), in2wo_(in_dim), bias2out_(bias_dim), out2bias_(out_dim), scale_factor_(scale_factor) {}

  這裡對於自身的成員變量的賦值采用直接復制的方式,weight2io_代表網絡中映射矩陣中映射核的總個數,為(卷積核尺寸的平方*通道數*卷積核個數);out2wi_代表卷積層網絡輸出特征的維數,為(in_width - window_size + 1) * (in_height - window_size + 1) * out_channels;in2wo_代表卷積層輸入輸入的維數,為數據矩陣的行數*列數*通道數;bias2out_代表卷積層中加性偏置的總個數;out2bias_代表輸出特征的維數。

  這裡對partial_connected_layer的基類layer做了一個宏定義,方便後面使用:

\

  二、層屬性計算參數

  由於卷積層和下采樣層的參數眾多,為了方便用戶了解各個層的參數數量以及連接規模,這裡提供三個參數個數計算函數,用以返回卷積層的下采樣層中的對應參數個數。首先,返回當前層的待學習參數個數(包括卷積核權值和偏置):
\

  返回當前層與前一層的連接個數:

\

  返回當前層的特征輸出維數:

\

  三、前向傳播函數forward_propagation

  由於partial_connected_layer類是卷積層和下采樣層的公共基類,而卷積層和下采樣層同樣都需要前向傳播和反向傳播功能,因此作者選擇在partial_connected_layer類中定義前向傳播算法和反向傳播算法,而不是在兩個子類中分別進行定義,至於這樣做的原因,在後面的博文中會進行詳細說明。

  這裡封裝的前向傳播算法和前文介紹的全連接層中的前向傳播算法類似,主要分為三大部分:前向傳播的卷積過程、輸出卷積結構、遞歸。

  首選在卷積過程中,需要進行卷積、對應系數擴展(這裡系數默認為1,因此這一步基本可以忽略)、加偏置值,而且這些操作都是以Lamda表達式的方式來實現的:

\

  接下來需要將卷積結果傳遞給輸出數組,這裡主要需要先經過激活函數來做一步處理:

\

  最後通過遞歸的方式來完成算法的傳播(前向傳播和反向傳播都是通過遞歸來完成的):

\

  至於反向傳播函數back_propagation,由於其函數結構相對復雜,我們將對反向傳播函數的解讀放在後續介紹BP算法的博文中,這個系類博客的前三分之一的篇幅都是先分析tiny_cnn的前向傳播過程,因此這裡針對back_propagation()函數暫時先挖下一個大坑,等待後續的博文來填,望大家諒解。

  OK,這篇博客就先介紹到這裡,至此我們已經對partial_connected_layer類的大部分成員變量和功能函數(除了反向傳播算法)都介紹完畢,在下一篇博文中我們將繼續對更底層的基類:layer、layer_base進行簡要分析,然後就開始研究卷積網絡的前向傳播實現方法,大家敬請期待吧。

  三、注意事項

  1、函數調用格式以及構造流程的問題

  這裡需要強調一點的是tiny_cnn在構造整個網絡結構的過程中,是采用一種類似於“流”的形式來完成的構造:

\

  這種流操作方式定義在network類中,有關這種流構造技巧的更多詳細信息我會在介紹network類的過程中來專門進行詳細的介紹(又是一個坑),目前已知的就是這種流操作方式在表面上是一次性完成整個網絡結構的構造,這也給我們在程序調試中查看中間層的網絡初始化參數帶來了麻煩,看看後續怎麼解決吧。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved