1. 程式人生 > >tensorflow學習筆記一之tensorflow實現卷積部分常用函式

tensorflow學習筆記一之tensorflow實現卷積部分常用函式

1. Z1=tf.nn.conv2d(X,W1, strides = [1,1,1,1], padding = 'SAME')

tf.nn.conv2d(input,filter,strides, padding, use_cudnn_on_gpu=None, name=None)

TensorFlow裡面實現卷積的函式。

第一個引數input:指需要做卷積的輸入影象,它要求是一個Tensor,具有[batch, in_height, in_width,in_channels]這樣的shape,具體含義是[訓練時一個batch的圖片數量, 圖片高度, 圖片寬度, 影象通道數],注意這是一個4維的Tensor,要求型別為float32和float64其中之一

第二個引數filter:相當於CNN中的卷積核,它要求是一個Tensor,具有[filter_height, filter_width,in_channels,out_channels]這樣的shape,具體含義是[卷積核的高度,卷積核的寬度,影象通道數,卷積核個數],要求型別與引數input相同,有一個地方需要注意,第三維in_channels,就是引數input的第四維

第三個引數strides:卷積時在影象每一維的步長,這是一個一維的向量,長度4

第四個引數padding:string型別的量,只能是"SAME","VALID"其中之一,這個值決定了不同的卷積方式,Valid: 用過濾器在輸入的矩陣中按步長移動時候,會把最後的不足部分的列和行拋棄;Same: 先在輸入矩陣上下各加個值為0的行,在左右各加個個值為0的列,也就是用0把原先的矩陣包裹一層,然後在移動的時候如果輸入矩陣的列或者行長度不夠,就用0來補齊。

第五個引數:use_cudnn_on_gpu:bool型別,是否使用cudnn加速,預設為true

結果返回一個Tensor,這個輸出,就是我們常說的feature map,shape仍然是[batch,height, width, channels]這種形式。

2. A1 = tf.nn.relu(Z1) 是tensorflow中的relu函式

3.   P1 =tf.nn.max_pool(A1, ksize = [1,8,8,1], strides = [1,8,8,1], padding = 'SAME')

max pooling是CNN當中的最大值池化操作.

第一個引數value:需要池化的輸入,一般池化層接在卷積層後面,所以輸入通常是feature map,依然是[batch, height, width, channels]這樣的shape

第二個引數ksize:池化視窗的大小,取一個四維向量,一般是[1, height, width, 1],因為我們不想在batch和channels上做池化,所以這兩個維度設為了1

第三個引數strides:和卷積類似,視窗在每一個維度上滑動的步長,一般也是[1, stride,stride, 1]

第四個引數padding:和卷積類似,可以取'VALID' 或者'SAME'

返回一個Tensor,型別不變,shape仍然是[batch, height, width, channels]這種形式

4.   #CONV2D: filters W2, stride 1, padding 'SAME'
 Z2 = tf.nn.conv2d(P1,W2, strides = [1,1,1,1], padding = 'SAME')
 # RELU
 A2 = tf.nn.relu(Z2)
 # MAXPOOL: window 4x4, stride 4, padding 'SAME'
 P2 = tf.nn.max_pool(A2, ksize = [1,4,4,1], strides = [1,4,4,1], padding ='SAME')

5.    #FLATTEN
 P2 = tf.contrib.layers.flatten(P2)實現對張量P2的FLATTEN

6.    #FULLY-CONNECTED without non-linear activation function (not not call softmax).
 # 6 neurons in output layer. Hint: one of the arguments should be"activation_fn=None" 
 Z3 = tf.contrib.layers.fully_connected(inputs=P2,num_outputs=6,activation_fn=None)
 全連線層,每個輸入輸出存在連線。CNN最後一層常是全連線層。TensorFlow全連線層格式,tf.matmul(features,weight)+bias。輸入張量與輸出層每個神經元連線。其中inputs是輸入張量,num_outputs是輸出元素的個數,activation_fn是啟用函式,可以選擇tf.nn.relu等。

7.  tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = Z3, labels =Y))

tf.nn.softmax 計算通過 softmax 層的向前傳播。你使用它評估模型的過程中,當你計算模型輸出的概率。tf.nn.softmax_cross_entropy_with_logits 計算 softmax 層的成本。它只用於訓練。比數是規範化的日誌概率輸出模型 (輸出 softmax 正常化應用於他們之前的值)。

第一個引數logits:就是神經網路最後一層的輸出,如果有batch的話,它的大小就是[batchsize,num_classes],單樣本的話,大小就是num_classes

第二個引數labels:實際的標籤,大小同上

具體的執行流程大概分為兩步:

第一步是先對網路最後一層的輸出做一個softmax,這一步通常是求取輸出屬於某一類的概率

第二步是softmax的輸出向量[Y1,Y2,Y3...]和樣本的實際標籤做一個交叉熵

注:這個函式內部自動計算softmax,然後再計算交叉熵代價函式,也就是說logits必須是沒有經過tf.nn.softmax函式處理的資料,否則導致訓練結果有問題。建議程式設計序時使用這個函式,而不必自己編寫交叉熵代價函式。

8.  nms_indices = tf.image.non_max_suppression(boxes,scores,max_boxes,iou_threshold= 0.5)

實現極大值抑制non max suppression,其中boxes是不同boxes的座標,scores是不同boxes預測的分數,max_boxes是保留的最大box的個數。

iou_threshold是一個閾值,去掉大於這個閾值的所有boxes。