C++卷積神經網絡實例:tiny_cnn代碼詳解(5)——convolutional_layer類結構信息之其他成員函數


  在上一篇博客中我們介紹了convolutional_layer類的基本結構及其成員變量、構造函數的相關信息,在這篇博文中我們對其中剩余的其他成員函數進行分析。首先把convolutional_layer類的結構圖給出來:

  可見,convolutional_layer類除了構造函數之外,還有另外兩部分成員函數,一部分負責定義當前卷積層與前一層之間的連接關系,另一部分則完成convolutional_layer類的剩余輔助功能,例如返回相關屬性、將權重矩陣和輸出矩陣轉換為圖像格式輸出等等。

  一、層間連接規划函數

  這部分函數主要負責定義連接矩陣,來設計卷積層與前一層之間的連接關系,主要包含兩個函數和一個結構體類型,接下來它們進行一一介紹。

  1.1 connection_table結構體

  connection_table結構體實際上就是層間連接矩陣的基本原型,主要功能就是根據傳入的參數來構建指定的連接矩陣。這個結構體提供了兩個構造函數。其中一個構造函數算是缺省構造函數,另一個需要外部傳入連接矩陣和對應矩陣的行數和列數:

  第一個構造函數沒啥可說的,就是默認生成一個空的連接矩陣(rows_ == 0 && cols_ == 0),另一個構造函數則本質上完成一個復制操作,通過標准庫中的copy實現將用戶自定義的連接矩陣傳入connection_table內部:

        connection_table(const bool *ar, size_t rows, size_t cols) : connected_(rows * cols), rows_(rows), cols_(cols) 
{
std::copy(ar, ar
+ rows * cols, connected_.begin()); //拷貝對應的連接標志位
}

  此外connection_table結構體中還用另外兩個成員函數is_connected()和is_empty()函數。is_connected()的函數體如下:

        bool is_connected(size_t x, size_t y) const                         {            return is_empty() ? true : connected_[y * cols_ + x];   //這里空connection_table默認為全連接        }

  is_connected()函數的功能是判斷當前坐標(size_t x, size_t y)下的連接情況。舉個例子,在主程序中我們人工定義了一個層間連接矩陣:

  這個連接是遵循LeNet-5中第二卷積層與前一層的連接形式,這是一個6行16列矩陣,說明前一層的輸出特征矩陣有6個、本層的卷積模板有16個,矩陣中“0”代表連接,“X”代表不連接,接下來舉例分析一下這個矩陣的實際意義。比如,矩陣的第1行第2列為“0”,說明前一層的第一個輸出特征矩陣和本層的第一個卷積核模板是連接的;再舉個例子,矩陣中的第5行第6列為“X”,說明前一層的第5個輸出特征矩陣和本層的第6個卷積模板是不連接的,沒錯,這個連接矩陣就是這個含義。而is_connected()這個函數的作用就是根據前一層和本層的索引來讀取連接矩陣中對應的值(true or false)。

  至於is_empty()函數,作用只有一個:判斷當前矩陣是否為零陣:

        bool is_empty() const         {            return rows_ == 0 && cols_ == 0;        }

  1.2 connect_kernel函數

  connect_kernel()函數的作用是初始化卷積層的卷積核參數:

  1.3 init_connection函數

  init_connection()是初始化該卷積層的映射參數,包括卷積核權重和偏置,其中初始化卷積核權重是通過調用connect_kernel()函數來實現,初始化加性偏置則直接通過代碼實現:

  二、其他函數

  接下來針對convolutional_layer類中的剩余成員函數做一下掃尾工作,主要包含weight_to_image()函數和一些屬性返回函數。

  2.1 weight_to_image函數

  這個函數的作用是將該層卷積層中的卷積核權重轉換成圖像形式進行可視化顯示。之所以添加這個函數,是因為在實際實驗中經常需要將中間卷積層的卷積核權重進行輸出,來判斷網絡的收斂情況、學習進度,同時借助卷積核來對卷積神經網絡的特征提取原理做一些深入性的研究。這個函數大致可以分為兩部分,首先需要對圖像填充,然后在進行轉換,在轉換過程中涉及到工程中自定義中的image.h模塊,有關image模塊會在后續的博文中進行詳細講解。

  2.2 屬性返回函數

  convolutional_layer類的最后一個部分,屬性返回函數,顧名思義,返回類成員屬性:

  三、注意事項

  1、連接矩陣的本質屬性

  在這里需要稍稍糾正一個說法問題,在上文中我們一直說“連接矩陣”,其實這里的連接矩陣本質上並不是Mat類型的矩陣,而是存儲一系列布爾值的vector變量,具體上圖:

  至於connection變量,在connection_table結構體的內部給出了更為直接的定義:

  2、is_connected()函數實現

  is_connected()函數雖然功能很簡單,但是其實現起來還是有一點小麻煩,比如說其主要的功能實現部分的代碼:

  故名思議,如果矩陣為零陣,返回ture,否則按索引值返回,問題是這里的connected_變量是一個vector而非中規中矩的二維矩陣,因此我們要通過人工定義的列數(cols_)來輔助完成定位(y * cols_ + x)。

  3、“0”代表連接、“X”代表不連接

  這通過一個宏定義來實現:

  4、卷積網路的基本屬性

  這篇博文中提到了很多卷積神經網絡中的專用術語,例如卷積核權重、加性偏執、全連接等等,有關卷積神經網絡的基本原理可以參考之前我上傳的一個牛人寫的PPT,我當時讀完之后,受益良多。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com