tensorflow學習函數筆記

函數一

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:卷積時在圖像每一維的步長,這是一個一維的向量[ 1, strides, strides, 1],長度4。第一位和最後一位固定必須是1

第四個參數padding:string類型的量,只能是"SAME","VALID"其中之一,表示的是卷積的形式,是否考慮邊界。"SAME"是考慮邊界,不足的時候用0去填充周圍,"VALID"則不考慮。這個值決定了不同的卷積方式(後面會介紹)

第五個參數:use_cudnn_on_gpu:bool類型,是否使用cudnn加速,默認爲true

結果返回一個Tensor,這個輸出,就是我們常說的feature map,shape仍然是[batch, height, width, channels]這種形式。

code

import tensorflow as tf
# case 1
# 輸入是1張 3*3 大小的圖片,圖像通道數是5,卷積核是 1*1 大小,數量是1
# 步長是[1,1,1,1]最後得到一個 3*3 的feature map
# 1張圖最後輸出就是一個 shape爲[1,3,3,1] 的張量
input = tf.Variable(tf.random_normal([1,3,3,5]))
filter = tf.Variable(tf.random_normal([1,1,5,1]))
op1 = tf.nn.conv2d(input, filter, strides=[1,1,1,1], padding='SAME')


# case 2
# 輸入是1張 3*3 大小的圖片,圖像通道數是5,卷積核是 2*2 大小,數量是1
# 步長是[1,1,1,1]最後得到一個 3*3 的feature map
# 1張圖最後輸出就是一個 shape爲[1,3,3,1] 的張量 
input = tf.Variable(tf.random_normal([1,3,3,5]))
filter = tf.Variable(tf.random_normal([2,2,5,1]))
op2 = tf.nn.conv2d(input, filter, strides=[1,1,1,1], padding='SAME')

# case 3  
# 輸入是1張 3*3 大小的圖片,圖像通道數是5,卷積核是 3*3 大小,數量是1
# 步長是[1,1,1,1]最後得到一個 1*1 的feature map (不考慮邊界)
# 1張圖最後輸出就是一個 shape爲[1,1,1,1] 的張量
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
# 輸入是1張 5*5 大小的圖片,圖像通道數是5,卷積核是 3*3 大小,數量是1
# 步長是[1,1,1,1]最後得到一個 3*3 的feature map (不考慮邊界)
# 1張圖最後輸出就是一個 shape爲[1,3,3,1] 的張量
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  
# 輸入是1張 5*5 大小的圖片,圖像通道數是5,卷積核是 3*3 大小,數量是1
# 步長是[1,1,1,1]最後得到一個 5*5 的feature map (考慮邊界)
# 1張圖最後輸出就是一個 shape爲[1,5,5,1] 的張量
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 
# 輸入是1張 5*5 大小的圖片,圖像通道數是5,卷積核是 3*3 大小,數量是7
# 步長是[1,1,1,1]最後得到一個 5*5 的feature map (考慮邊界)
# 1張圖最後輸出就是一個 shape爲[1,5,5,7] 的張量
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  
# 輸入是1張 5*5 大小的圖片,圖像通道數是5,卷積核是 3*3 大小,數量是7
# 步長是[1,2,2,1]最後得到7個 3*3 的feature map (考慮邊界)
# 1張圖最後輸出就是一個 shape爲[1,3,3,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  
# 輸入是10 張 5*5 大小的圖片,圖像通道數是5,卷積核是 3*3 大小,數量是7
# 步長是[1,2,2,1]最後每張圖得到7個 3*3 的feature map (考慮邊界)
# 10張圖最後輸出就是一個 shape爲[10,3,3,7] 的張量
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.initialize_all_variables() 
with tf.Session() as sess:
    sess.run(init)
    print('*' * 20 + ' op1 ' + '*' * 20)
    print(sess.run(op1))
    print('*' * 20 + ' op2 ' + '*' * 20)
    print(sess.run(op2))
    print('*' * 20 + ' op3 ' + '*' * 20)
    print(sess.run(op3))
    print('*' * 20 + ' op4 ' + '*' * 20)
    print(sess.run(op4))
    print('*' * 20 + ' op5 ' + '*' * 20)
    print(sess.run(op5))
    print('*' * 20 + ' op6 ' + '*' * 20)
    print(sess.run(op6))
    print('*' * 20 + ' op7 ' + '*' * 20)
    print(sess.run(op7))
    print('*' * 20 + ' op8 ' + '*' * 20)
    print(sess.run(op8))

函數二

tf.get_variable(name,  shape, initializer): name就是變量的名稱,shape是變量的維度,initializer是變量初始化的方式,初始化的方式有以下幾種:

tf.constant_initializer:常量初始化函數

tf.random_normal_initializer:正態分佈

tf.truncated_normal_initializer:截取的正態分佈

tf.random_uniform_initializer:均勻分佈

tf.zeros_initializer:全部是0

tf.ones_initializer:全是1

tf.uniform_unit_scaling_initializer:滿足均勻分佈,但不影響輸出數量級的隨機值

code

import tensorflow as tf;
import numpy as np;
import matplotlib.pyplot as p
a1 = tf.get_variable(name='a1', shape=[2,3], initializer=tf.random_normal_initializer(mean=0, stddev=1))
a2 = tf.get_variable(name='a2', shape=[1], initializer=tf.constant_initializer(1))
a3 = tf.get_variable(name='a3', shape=[2,3], initializer=tf.ones_initializer())
with tf.Session() as sess:
	sess.run(tf.initialize_all_variables())
	print sess.run(a1)
	print sess.run(a2)
	print sess.run(a3)

函數三

tf.nn.bias_add():一個叫bias的向量加到一個叫value的矩陣上,是向量與矩陣的每一行進行相加,得到的結果和value矩陣大小相同。 code

import tensorflow as tf
a=tf.constant([[1,1],[2,2],[3,3]],dtype=tf.float32)
b=tf.constant([1,-1],dtype=tf.float32)
c=tf.constant([1],dtype=tf.float32)
with tf.Session() as sess:
    print('bias_add:')
    print(sess.run(tf.nn.bias_add(a, b)))

函數四

tf.nn.relu(features, name = None):這個函數的作用是計算激活函數 relu,即 max(features, 0)。即將矩陣中每行的非大於0的置0。 code

import tensorflow as tf
a = tf.constant([-1.0, 2.0,1.0])
with tf.Session() as sess:
    b = tf.nn.relu(a)
    print(sess.run(b))

函數五

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]這種形式

函數六

tf.nn.lrn(input,depth_radius=None,bias=None,alpha=None,beta=None,name=None):局部響應歸一化,想了解原理的點這個 參考鏈接1 參考鏈接2

函數七

tf.matmul() 和tf.multiply() 的區別 鏈接

函數八

  • tf.argmax()和tf.arg_max()功能類似:
分爲tf.argmax(array, 1)和tf.argmax(array, 0)兩種,其中前者返回每行的最大數的下標,後者表示每列的最大值的下表
例如:
test = np.array([[1, 2, 3], [2, 3, 4], [5, 4, 3], [8, 7, 2]])
np.argmax(test, 0)   #輸出:array([3, 3, 1]
np.argmax(test, 1)   #輸出:array([2, 2, 0, 0]

函數九

  • reduce_sum應該理解爲壓縮求和,用於降維
x=[[1, 1, 1]
[1, 1, 1]]
#求和

tf.reduce_sum(x) ==> 6

#按列求和
tf.reduce_sum(x, 0) ==> [2, 2, 2]
#按行求和
tf.reduce_sum(x, 1) ==> [3, 3]
#按照行的維度求和
tf.reduce_sum(x, 1, keep_dims=True) ==> [[3], [3]]
#行列求和
tf.reduce_sum(x, [0, 1]) ==> 6

函數十

tf.nn.sparse_softmax_cross_entropy_with_logits(): 參考鏈接1 參考鏈接2

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章