TensorFlow基礎筆記(11) conv2D函數


 

#鏈接: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))

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM