1. 程式人生 > >TensorFlow函式中的shape引數介紹、feature map大小的計算方法

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中的所有神經元使用同一個權值。這與全連線相比,減少了大量引數。