#鏈接:http://www.jianshu.com/p/a70c1d931395 import tensorflow as tf import tensorflow.contrib.slim as slim # tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None) # 除去name參數用以指定該操作的name,與方法有關的一共五個參數: # # 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”其中之一,這個值決定了不同的卷積方式(后面會介紹) # SAME 表示輸出的out_height, out_width與輸入的in_height, in_width相同 # VALID 表示輸出的圖像大小小於輸入圖像大小,輸出的大小計算公式如下: # out_height = round((in_height - floor(filter_height / 2) * 2) / strides_height) floor表示下取整 round表示四舍五入 # use_cudnn_on_gpu: # bool類型,是否使用cudnn加速,默認為true #而對於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=initializers.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 input = tf.Variable(tf.round(10 * tf.random_normal([1, 6, 6, 1]))) filter = tf.Variable(tf.round(5 * tf.random_normal([3, 3, 1, 1]))) #op2 = tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding='VALID') conv_SAME = tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding='SAME') conv_VALID = tf.nn.conv2d(input, filter, strides=[1, 2, 2, 1], padding='VALID') slim_conv2d_SAME = slim.conv2d(input, 1, [3, 3], [1, 1], weights_initializer=tf.ones_initializer, padding='SAME') slim_conv2d_VALID = slim.conv2d(input, 1, [3, 3], [2, 2], weights_initializer=tf.ones_initializer, padding='VALID') with tf.Session() as sess: sess.run(tf.global_variables_initializer()) conv_SAME_value, conv_VALID_value, slim_conv2d_SAME_value, slim_conv2d_VALID_value = \ sess.run([conv_SAME, conv_VALID, slim_conv2d_SAME, slim_conv2d_VALID]) print(conv_SAME_value.shape) print(conv_VALID_value.shape) print(slim_conv2d_SAME_value.shape) print(slim_conv2d_VALID_value.shape) input = tf.Variable(tf.round(10 * tf.random_normal([1, 7, 7, 1]))) filter = tf.Variable(tf.round(5 * tf.random_normal([3, 3, 1, 1]))) #op2 = tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding='VALID') conv_SAME = tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding='SAME') conv_VALID = tf.nn.conv2d(input, filter, strides=[1, 2, 2, 1], padding='VALID') slim_conv2d_SAME = slim.conv2d(input, 1, [3, 3], [1, 1], weights_initializer=tf.ones_initializer, padding='SAME') slim_conv2d_VALID = slim.conv2d(input, 1, [3, 3], [2, 2], weights_initializer=tf.ones_initializer, padding='VALID') with tf.Session() as sess: sess.run(tf.global_variables_initializer()) conv_SAME_value, conv_VALID_value, slim_conv2d_SAME_value, slim_conv2d_VALID_value = \ sess.run([conv_SAME, conv_VALID, slim_conv2d_SAME, slim_conv2d_VALID]) print(conv_SAME_value.shape) print(conv_VALID_value.shape) print(slim_conv2d_SAME_value.shape) print(slim_conv2d_VALID_value.shape) #輸出 # (1, 6, 6, 1) # (1, 2, 2, 1) # (1, 6, 6, 1) # (1, 2, 2, 1) # (1, 7, 7, 1) # (1, 3, 3, 1) # (1, 7, 7, 1) # (1, 3, 3, 1)
#coding=utf-8 #http://blog.csdn.net/mao_xiao_feng/article/details/78004522 # tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None) # 除去name參數用以指定該操作的name,與方法有關的一共五個參數: # # 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”其中之一,這個值決定了不同的卷積方式(后面會介紹) # # use_cudnn_on_gpu: # bool類型,是否使用cudnn加速,默認為true import tensorflow as tf #case 2 input = tf.Variable(tf.round(10 * tf.random_normal([1,3,3,2]))) filter = tf.Variable(tf.round(5 * tf.random_normal([1,1,2,1]))) op2 = tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding='VALID') #對於filter,多個輸入通道,變成一個輸入通道,是對各個通道上的卷積值進行相加 # case 2 # input: [[[[-14. -11.] # [ 2. 2.] # [ 25. 18.]] # # [[ 8. 13.] # [ -7. -7.] # [ 11. 6.]] # # [[ -1. 8.] # [ 18. 10.] # [ -2. 19.]]]] #轉換:輸入為3*3的2通道數據 #通道1: #[-14 2 25], #[8 -7 11], #[-1 18 -2] #通道2: #[-11 2 18], #[13 -7 6], #[8 10 19] # filter: [[[[-3.] # [ 2.]]]] # conv [[[[ 20.] # [ -2.] # [-39.]] # # [[ 2.] # [ 7.] # [-21.]] # # [[ 19.] # [-34.] # [ 44.]]]] #conv轉換 #[20 -2 -39], #[2 -7 -21], #[9 -34 44] #計算過程 #[-14 2 25], #[8 -7 11], * [-3] + #[-1 18 -2] #[-11 2 18], #[13 -7 6], * [2] #[8 10 19] #result #[20 -2 -39], #[2 -7 -21], #[9 -34 44] # #case 3 # input = tf.Variable(tf.random_normal([1,3,3,5])) # filter = tf.Variable(tf.random_normal([3,3,5,1])) # op3 = tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding='VALID') # #case 4 # input = tf.Variable(tf.random_normal([1,5,5,5])) # filter = tf.Variable(tf.random_normal([3,3,5,1])) # # op4 = tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding='VALID') # #case 5 # input = tf.Variable(tf.random_normal([1,5,5,5])) # filter = tf.Variable(tf.random_normal([3,3,5,1])) # # op5 = tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding='SAME') # #case 6 # input = tf.Variable(tf.random_normal([1,5,5,5])) # filter = tf.Variable(tf.random_normal([3,3,5,7])) # # op6 = tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding='SAME') # #case 7 # input = tf.Variable(tf.random_normal([1,5,5,5])) # filter = tf.Variable(tf.random_normal([3,3,5,7])) # # op7 = tf.nn.conv2d(input, filter, strides=[1, 2, 2, 1], padding='SAME') # #case 8 # input = tf.Variable(tf.random_normal([10,5,5,5])) # filter = tf.Variable(tf.random_normal([3,3,5,7])) # # op8 = tf.nn.conv2d(input, filter, strides=[1, 2, 2, 1], padding='SAME') init = tf.global_variables_initializer() with tf.Session() as sess: sess.run(init) print("case 2") print("input: ", sess.run(input)) print("filter: ", sess.run(filter)) print("conv ", sess.run(op2)) # print("case 3") # print(sess.run(op3)) # print("case 4") # print(sess.run(op4)) # print("case 5") # print(sess.run(op5)) # print("case 6") # print(sess.run(op6)) # print("case 7") # print(sess.run(op7)) # print("case 8") # print(sess.run(op8))