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響應的程式碼呼叫進行比較: