TensorFlow函式中的shape引數介紹、feature map大小的計算方法
TensorFlow函式中的shape引數介紹:
TensorFlow用張量這種資料結構來表示所有的資料。你可以把一個張量想象成一個n維的陣列或列表。一個張量有一個靜態型別和動態型別的維數,張量可以在圖中的節點之間流通。
tensorflow中張量(tensor)的屬性有維數(階)、形狀和資料型別。用shape表示生成張量的維度。
張量的維數又叫張量的階,是張量維數的一個數量描述。但是張量的階和矩陣的階並不是同一個概念。
如下分別表示0維、1維、2維和3維的張量:
1 #維度為0的標量 [1,2,3] #維度為1,一維向量 [[1,2],[3,4]] #維度為2, 二維矩陣 [[[1,2],[3,4]],[[1,2],[3,4]]] #維度為3,3維空間矩陣
簡單來說有幾層方括號就是幾維張量。
張量的形狀(shape)以 [D0, D1, … Dn-1] 的形式表示,D0 到Dn 是任意的正整數。
如:
shape [2,3] 表示為陣列的意思是第一維有兩個元素,第二維有三個元素,[2,3]表示一個2行3列的矩陣,如: [[1,2,3],[4,5,6]]。
在shape的方括號中有多少個數字,就代表這個張量是多少維的張量。
shape的第一個元素要看張量最外層方括號中有幾個元素(被最外邊的中括號裡邊的內中括號括起來的所有資料算作一個元素)被逗號隔開,有n1個則這個張量就是n1維的,形狀的第一個元素就是n1。shape的第2、3、4...n個元素依次類推,分別看第n個方括號中有幾個元素即可。
如:
1 # 形狀為[]
[1,2,3] # 形狀為[3]
[[1,2],[3,4]] # 形狀為[2,2]
[[[1,2],[3,4]],[[1,2],[3,4]]] # 形狀為[2,2,2]
除了維度shape,張量還有一個數據型別屬性。
你可以為一個張量指定下列資料型別中的任意一個型別:
資料型別 | Python 型別 | 描述 |
---|---|---|
DT_FLOAT |
tf.float32 |
32 位浮點數. |
DT_DOUBLE |
tf.float64 |
64 位浮點數. |
DT_INT64 |
tf.int64 |
64 位有符號整型. |
DT_INT32 |
tf.int32 |
32 位有符號整型. |
DT_INT16 |
tf.int16 |
16 位有符號整型. |
DT_INT8 |
tf.int8 |
8 位有符號整型. |
DT_UINT8 |
tf.uint8 |
8 位無符號整型. |
DT_STRING |
tf.string |
可變長度的位元組陣列.每一個張量元素都是一個位元組陣列. |
DT_BOOL |
tf.bool |
布林型. |
DT_COMPLEX64 |
tf.complex64 |
由兩個32位浮點陣列成的複數:實數和虛數. |
DT_QINT32 |
tf.qint32 |
用於量化Ops的32位有符號整型. |
DT_QINT8 |
tf.qint8 |
用於量化Ops的8位有符號整型. |
DT_QUINT8 |
tf.quint8 |
用於量化Ops的8位無符號整型. |
feature map大小的計算方法:
在每個卷積層中,資料都是以三維形式存在的。你可以把它看成許多個二維圖片疊在一起,其中每一個稱為一個feature map。在輸入層,如果是灰度圖片,那就只有一個feature map;如果是彩色圖片,一般就是3個feature map(紅綠藍)。層與層之間會有若干個卷積核(kernel),上一層和每個feature map跟每個卷積核做卷積,都會產生下一層的一個feature map。
feature map大小的計算舉例:
假設INPUT為32*32,使用6個kernel size為5*5的filter,stride = 1,pading=0。
卷積後得到feature maps邊長的計算公式為:
output_h =(originalSize_h+padding*2-kernelSize_h)/stride +1
即卷積層的feature map的邊長為:conv1_h=(32-5)/1 + 1 = 28,卷積層的feature maps尺寸為28*28。
神經元個數為:(32-5+1) * (32 -5 +1) = 28 * 28 個。
32-5是卷積核可以滑過並得到一次計算結果的次數(因為步幅是1),+1是卷積核放在最開始的位置上還沒開始滑動時的一次計算結果。
卷積層之後是pooling層,也叫下采樣層或子取樣層(subsampling)。它是利用影象區域性相關性的原理,對影象進行子抽樣,這樣在保留有用資訊的同時可以減少資料處理量。pooling層不會減少feature maps的數量,只會縮減其尺寸。常用的pooling方法有兩種,一種是取最大值,一種是取平均值。
pooling過程的計算公式:
假如pooling的步長是2,filter大小是2X2,pooling方法為取最大值,conv1_h為卷積層的feature maps邊長。
pooling後feature maps邊長的計算公式為:
pool1_h = (conv1_h - kernelSize_h)/stride +1
即pooling層後的feature map的邊長為(28-2)/2+1=14,pooling後的feature map尺寸為14*14。
feature map和神經元的關係:
單個卷積核情況下:
神經元是前一層的wx+b到下一層的計算過程,這一層的連線數也就是有多少個 wx+b的連線(一個卷積核有多個w只有一個bias),一個feature map 是多個(比如M個)神經元計算的結果彙總。
多個卷積核情況下:
同一層可以有多個(比如N個)卷積核,每個卷積核對應(卷積的結果是)一個feature map ,也就是這一層有N個feature map, 那這一層共有 N*M個神經元。(如果每個fm的神經元個數不一樣,則累加每個fm的神經元個數)
可訓練引數個數與神經元的個數無關,只與卷積核的大小及卷積核的個數相關,還有通道數(即高度)。
神經元個數除了與卷積核大小和個數有關,還與步長相關。步長越大,神經元個數越小。
feature map的每個點都是一個神經元的輸出,所以神經元個數 = 特徵圖大小。
CNN中的權值共享就是同一個Feature Map中的神經元權值共享,該Feature Map中的所有神經元使用同一個權值。這與全連線相比,減少了大量引數。