1. 程式人生 > >tf.nn.conv2d 和tf.contrib.slim.conv2d的區別

tf.nn.conv2d 和tf.contrib.slim.conv2d的區別

有程式碼用到卷積層是tf.nn.conv2d 或者tf.contrib,slim.conv2d. 這兩個函式呼叫的卷積層是否一致,檢視原始碼如下:

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

input:需要做卷積的輸入影象,它要求是一個Tensor,具有[batch_size, 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相同,

strides:為卷積時在影象每一維的步長那個,這時一個一維的向量,長度為4, 對應的是在input的4個維度上的步長。

padding:是string型別的變數,只能是“SAME”, “VALID”其中之一,這個值決定了不同的卷積方式, SAME代表卷積核可以停留影象邊緣。

而對於tf.contrib.slim.conv2d,其函式定義如下:

convolution(inputs, 
        num_outputs,
        kernel_size),
        stride=1,
        padding = 'SAME',
        data_format=None,
        rate = 1,
        activation_fn=nn.relu,
        normalizer_fn = None,
        normalizer_params=None,
        weights_initializer = initializer.xavier_initializer(),
        weights_regularizer = None,
        biases_initializer=init_ops.zeros_initializer(),
        biases_regularizer = None,
        reuse = None,
        variables_collections=None,
        outputs_collections=None,
        trainable=True, 
        scope=None):

inputs同樣是指需要做卷積的輸入影象
num_outputs指定卷積核的個數(就是filter的個數)
kernel_size用於指定卷積核的維度(卷積核的寬度,卷積核的高度)
stride為卷積時在影象每一維的步長
padding為padding的方式選擇,VALID或者SAME
data_format是用於指定輸入的input的格式
rate這個引數不是太理解,而且tf.nn.conv2d中也沒有,對於使用atrous convolution的膨脹率(不是太懂這個atrous convolution)
activation_fn用於啟用函式的指定,預設的為ReLU函式
normalizer_fn用於指定正則化函式
normalizer_params用於指定正則化函式的引數
weights_initializer用於指定權重的初始化程式
weights_regularizer為權重可選的正則化程式
biases_initializer用於指定biase的初始化程式
biases_regularizer: biases可選的正則化程式
reuse指定是否共享層或者和變數
variable_collections指定所有變數的集合列表或者字典
outputs_collections指定輸出被新增的集合
trainable:卷積層的引數是否可被訓練
scope:共享變數所指的variable_scope

 

 

為了緩解重複這些程式碼, TF-Slim在更抽象的神經網路層的層面上提供了大量方便使用的操作符, 比如,將上面的程式碼和TF-Slim響應的程式碼呼叫進行比較: