1. 程式人生 > >使用tensorflow構建CNN用到的函式詳解

使用tensorflow構建CNN用到的函式詳解

tf.truncated_normal(shape, stddev=0.1)
tf.constant(0.1, shape=shape)
tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')
tf.nn.max_pool(x, ksize=[1, 2, 2, 1],strides=[1, 2, 2, 1], padding='SAME')
tf.truncated_normal(shape, mean, stddev) :shape表示生成張量的維度,mean是均值,stddev是標準差。這個函式產生正太分佈,均值和標準差自己設定。
initial = tf.truncated_normal ( shape, stddev=0.1 )  # 正態分佈,標準差為 0.1,預設最大為 1,最小為 -1,均值為 0
initial = tf.constant ( 0.1, shape=shape )   # 建立一個結構為 shape 矩陣也可以說是陣列 shape 宣告其行列,初始化所有值為 0.1  

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

  • input: A Tensor. type必須是以下幾種型別之一: half, float32, float64.
  • filter: A Tensor. type和input必須相同
  • strides: A list of ints.一維,長度4, 在input上切片取樣時,每個方向上的滑窗步長,必須和format指定的維度同階
  • padding: A string from: “SAME”, “VALID”. padding 演算法的型別
  • use_cudnn_on_gpu: An optional bool. Defaults to True.
  • data_format: An optional string from: “NHWC”, “NCHW”, 預設為”NHWC”。 
    指定輸入輸出資料格式,預設格式為”NHWC”, 資料按這樣的順序儲存: 
    [batch, in_height, in_width, in_channels] 
    也可以用這種方式:”NCHW”, 資料按這樣的順序儲存: 
    [batch, in_channels, in_height, in_width]
  • name: 操作名,可選.
tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME') # 卷積遍歷各方向步數為 1,SAME:邊緣外自動補 0,遍歷相乘 
tf.nn.max_pool(x, ksize=[1, 2, 2, 1],strides=[1, 2, 2, 1], padding='SAME')
# 池化卷積結果(conv2d)池化層採用kernel大小為 2*2,步數也為2,周圍補0,取最大值。資料量縮小了4倍 

tf.nn.max_pool(value, ksize, strides, padding, name=None)

引數是四個,和卷積很類似:

第一個引數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]這種形式

x_image 又把 xs reshape 成了 28*28*1 的形狀,因為是灰色圖片,所以通道是 1. 作為訓練時的 input,-1 代表圖片數量不定。
x_image = tf.reshape(x, [-1,28,28,1])