面對更加複雜的問題時,基於卷積神經網路的演算法模型表現更加優異,遠遠超過了傳統的機器學習演算法,特別是在影象分類資料集上有非常突出的表現。
卷積神經網路
卷積神經網路與全連線神經網路在整體架構上比較相似,都是通過一層一層的節點組織起來,每乙個節點都是乙個神經元。
卷積神經網路相鄰層之間只有部分節點相連。
這是卷積神經網路和全連線神經網路唯一的區別,因為全連線神經網路處理影象的問題在於全連線層的引數太多。引數增多除了導致計算速度減慢,還很容易導致過擬合問題,而卷積神經網路可以有效減少神經網路中的引數個數。卷積神經網路的輸入影象就是原始影象的原始畫素,而輸出層中的每一各節點代表了不同類別的可信度。
定義損失函式以及引數的優化過程都使用於卷積神經網路。
卷積神經網路的結構
卷積神經網路結構圖
一般卷積神經網路主要包含5種結構:
卷積層:卷積層中每乙個節點的輸入只是上一層神經網路的一小塊,這個小塊常用的大小為3x3或者5x5,卷積層試圖對每一小塊進行更加深度分析從而得到抽象程度更高的特徵。經過卷積層的節點矩陣的深度會增加。
全連線層:卷積神經網路最後一般會是1到2個全連線層來給出最後的分類結果,即經過卷積和池化層後的影象已經完成了特徵提取,但仍然需要使用全連線來完成分類任務。
softmax層:主要用於分類,得到當前樣例屬於不同種類概率分布情況。
卷積層
卷積層過濾器結構
該部分是卷積神經網路結構中最重要的部分,被稱之為過濾器或者核心。
過濾器可以將當前層神經網路上的乙個子節點矩陣轉化為下一層神經網路上乙個單位節點矩陣,單位節點矩陣指的是乙個長和寬都為1,深度不限的節點。
過濾器處理的矩陣深度和當前層的神經網路節點的矩陣深度是一致的。過濾器的尺寸需要指定兩個引數,另乙個需要人工指定的引數是處理得到的單位節點矩陣的深度,這個深度稱之為過濾器深度。過濾器尺寸指的是乙個過濾器輸入節點矩陣的大小。
前向傳播過程
卷積層結構的前向傳播過程就是通過將乙個過濾器從神經網路當前層的左上角移動到右下角,並且在移動中計算每乙個對應的單位矩陣。過濾器每移動一次,可以計算得到乙個值(當深度為k時會計算出k個值),將這些數值拼接成乙個新的矩陣,就完成了前向傳播過程。
卷積前向傳播過程得到的矩陣尺寸要小於當前層矩陣的尺寸。為了避免尺寸大小的變化,可以在當前層矩陣的邊上加入全0填充。同時可以通過過設定過濾器移動的步長來調整結果矩陣的大小。
同時,每乙個卷積層中使用的過濾器中的引數都是一樣的,這樣做有以下優點:
通過共享過濾器的引數可以使得影象上的內容不受位置的影響,因為無論目標出現在在什麼位置得到的結果都一眼。
可以巨幅減小神經網路上的引數。
卷積層的引數個數和的大小無關,可以使得過濾器可以擴充套件到更大的影象資料上。
# 卷積層的引數個數只和過濾器的尺寸有關、深度及當前層節點矩陣的深度有關
#所以宣告的引數變數是乙個四維矩陣,前兩個維度代表過濾器尺寸,第三個維度表示當前層的深度,第四個維度表示過濾器深度
filter_weight = tf.get_variable('weight', [5, 5, 3, 16], initializer=tf.truncated_normal_initializer(stddev=0.1))
# 當前層矩陣上的不同位置的偏置項也是也是共享,所以共有下一層深度個不同的偏置
biases = tf.get_variable('biases', [16], initializer=tf.constant_initializer(0.1))
# conv2d()是乙個實現卷積層前向傳播的演算法,第乙個引數為輸入節點矩陣,第二個引數是卷積層權重,第三個引數為不同維度的步長,最後乙個引數為填充,same=0表示全零填充
conv = tf.nn.conv2d(input, filter_weights, strides=[1, 1, 1, 1], padding='same')
bias = tf.nn.bias_add(conv, biases)
actived_conv = tf.nn.relu(bias)
池化層
也叫pooling layer,池化層可以非常有效縮小矩陣的尺寸,從而減少全連線層中的引數,同時也可以加快計算速度和防止過擬合問題。
與卷積層類似,池化層前向傳播過程也是通過移動乙個類似過濾器的結構完成的。但是池化層不是計算節點的加權和,而是採用更加簡單的最大或者平均值運算。卷積層和池化層中過濾器移動的方式是類似的,唯一區別在於池化層不改變矩陣的深度,所以池化層過濾器除了在長和寬兩個維度移動之外,還需要在深度上移動。
# max_pool()實現了最大池化層的前向傳播過程,引數和conv2d()類似。ksize提供了過濾器的尺寸,strides提供了步長資訊。
pool = tf.nn.max_pool(actived_conv, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding='same')
經典卷積神經網路
let-ned-5:
乙個比較經典的卷積神經網路模型是let-ned-5,結構如下:
第一層:卷積層
第二層:池化層
第三層:卷積層
第四層:池化層
第五層:全連線層
第六層:全連線層
第七層:全連線層
輸入層—>(卷積層+—>池化層?)+—>全連線層+inception-v3:+表示一層或者多層,?表示沒有或者有一層。
該結構是一種完全不同的卷積神經網路結構,不同於串聯的連線方式,而是將不同的卷積層通過併聯的方式結合在一起。雖然濾波器的大小不同,但是使用全0填充且步長為1的過濾器處理之後他們擁有相同的長和寬。
# tensorflow-slim工具可以更加簡潔的實現乙個卷積層
# slim.conv2d()有三個引數比必填,第乙個引數是輸入節點矩陣,第二個引數是當前卷積層過濾器的深度,第三個引數是過濾器的尺寸
with tf.variable_scope('layer'):
# concat()第乙個引數指定了拼接的維度
branch_1 = tf.concat(3, [
slim.conv2d(input_tensor, 384, [1, 3], scope='conv2d_ob_1x3'),
slim.conv2d(input_tensor, 384, [3, 1], scope='conv2d_ob_3x1')])
遷移學習
所謂遷移學習,就是將乙個問題上訓練好的模型通過簡單的調整使其使用於乙個新的問題。通常的做法是保留所有卷積層的引數,替換最後的全連線層。
神經網路 卷積神經網路
這篇卷積神經網路是前面介紹的多層神經網路的進一步深入,它將深度學習的思想引入到了神經網路當中,通過卷積運算來由淺入深的提取影象的不同層次的特徵,而利用神經網路的訓練過程讓整個網路自動調節卷積核的引數,從而無監督的產生了最適合的分類特徵。這個概括可能有點抽象,我盡量在下面描述細緻一些,但如果要更深入了...
神經網路 卷積神經網路
1.卷積神經網路概覽 來自吳恩達課上一張,通過對應位置相乘求和,我們從左邊矩陣得到了右邊矩陣,邊緣是白色寬條,當畫素大一些時候,邊緣就會變細。觀察卷積核,左邊一列權重高,右邊一列權重低。輸入,左邊的部分明亮,右邊的部分灰暗。這個學到的邊緣是權重大的寬條 都是30 表示是由亮向暗過渡,下面這個圖左邊暗...
卷積神經網路 有趣的卷積神經網路
一 前言 最近一直在研究深度學習,聯想起之前所學,感嘆數學是一門樸素而神奇的科學。f g m1 m2 r 萬有引力描述了宇宙星河運轉的規律,e mc 描述了恆星發光的奧秘,v h d哈勃定律描述了宇宙膨脹的奧秘,自然界的大部分現象和規律都可以用數學函式來描述,也就是可以求得乙個函式。神經網路 簡單又...