隨著計算機硬件的升級與性能的提高,運算量已不再是阻礙深度學習發展的難題。卷積神經網絡(Convolution Neural Network,CNN)是深度學習中一項代表性的工作,CNN 是受人腦對圖像的理解過程啟發而提出的模型,其雛形是 1998 年 LeCun 提出的 LeNet-5 模型。如今,卷積神經網絡已被廣泛應用于計算機視覺領域。本文主要介紹卷積神經網絡中幾個基礎的運算,包括卷積、池化與全連接。
目錄
1 卷積
2 池化
3 全連接
1 卷積
? ? ? ? 卷積神經網絡中的卷積運算,通常指應用于處理圖像的二維卷積。卷積運算是卷積神經網絡(Convolution Neural Network,CNN)中不可缺少的部分,使得神經網絡具備處理圖像的能力。
????????在介紹卷積運算之前,需要了解卷積運算涉及的幾個必要的概念。
(1)卷積核。卷積核通常是一個 3 x 3,或 5 x 5 大小的矩陣,矩陣的元素表示鄰近像素值的權重。在卷積運算時,卷積核與圖像中某個小區域(也叫局部感受野)的像素值進行加權平均運算。
(2)填充。填充是指處理輸入特征圖邊界的方式。為了不丟失邊界信息,可以對輸入圖像進行邊界填充,再執行卷積操作。
(3)步長。步長指卷積核在輸入圖像上移動的像素數。步長為 1,則每次移動一個像素;步長為 2,則每次移動兩個像素;以此類推。
????????對于輸入圖像 P,使用?3 x 3 卷積核進行卷積運算,運算步驟如下:
(1)用 0 對圖像 P 的邊界進行填充,得到擴充圖像 P_padding;
?
(2)按照從上到下、從左到右的順序,在 P_padding 上移動卷積核,計算像素值的加權平均值,并按照移動的順序排列,得到輸出特征圖。
? ? ? ? TensorFlow 中使用 tf.nn.conv2d 函數進行卷積運算。
tf.nn.conv2d?用法
tf.nn.conv2d(input,filter,strides,padding,data_format='NHWC',dilations=None,name=None
)
tf.nn.conv2d 示例
import numpy as np
import tensorflow as tfx_in = np.array([[[[1], [2], [1]], [[1], [2], [1]],[[1], [2], [1]],
]])kernel_in = np.ones((1,9)).reshape(3, 3, 1, 1)x = tf.constant(x_in, dtype=tf.float32)
kernel = tf.constant(kernel_in, dtype=tf.float32)x_feature = tf.nn.conv2d(x, kernel, strides=[1,1,1,1], padding='SAME')
x_feature.numpy().reshape(3, 3)
Spyder 運行結果
?
????????一個卷積核只能生成一張特征圖像,在實際應用中,為了增強卷積層的表示能力,會使用多個不同的卷積核進行卷積運算,得到若干特征圖像。
2 池化
? ? ? ? “池化” 一詞來源于其英文 pooling,意思是 “使 ...... 集中”。在卷積神經網絡中,池化是降低特征圖像分辨率的運算,在神經網絡中起到二次提取特征的作用。
? ? ? ? 常用的池化運算有:
(1)最大池化:對局部感受野中的像素值求最大值,作為輸出特征圖像對應位置的像素值;
(2)平均池化:對局部感受野中的像素值求平均值,作為輸出特征圖像對應位置的像素值。
下圖是對輸入圖像進行 2 x 2 最大池化的輸出結果。
? ? ? ? TensorFlow 常用的池化運算如下:
(1)tf.nn.max_pool2d? 最大池化
(2)tf.nn.avg_pool2d? ?平均池化
tf.nn.max_pool2d 用法
tf.nn.max_pool2d(input,ksize,strides,padding,data_format='NHWC',name=None
)
tf.nn.max_pool2d 示例
import tensorflow as tfx = tf.constant([[[[4], [6], [1], [3] ], [[0], [9], [7], [13]], [[4], [3], [7], [10]], [[1], [0], [3], [8] ],
]])result = tf.nn.max_pool2d(x, ksize=(2,2), strides=(2,2), padding='SAME')
result.numpy().reshape(2, 2)
Spyder 運行結果
?
3 全連接
? ? ? ? 與多層感知機類似,全連接層中的每個神經元與前一網絡層中的所有神經元相連。在卷積神經網絡中,多個卷積層和池化層后連接著一個或者多個全連接層,全連接運算負責融合卷積層或池化層的局部信息。