【Tensorflow_DL_Note4】Tensorflow中的常量、變數和資料型別的結構

馬衛飛發表於2018-04-17

一 Tensorflow資料模型---張量

       Tensorflow用【張量:Tensor】這種資料結構來表示所有的資料,我們可以將一個張量想象成一個n維的陣列或列表。而一個張量有一個【靜態型別】和【動態型別】的【維數】,Tensor可以在圖中的節點Node之間流通。

      因此,基於這種特殊的資料和處理方式,Tensorflow中的資料型別也會因此而隨之改變,常規的資料型別並不適合Tensorflow框架的使用。Tensorflow本身定義了一套特殊的函式,能夠根據需要將不同的量設定成所需要的形式。

二 Tensor:張量的概念

       從Tensorflow的名字就可以看出Tensor:張量在Tensorflow這個【程式設計系統】中是一個非常重要的概念。在Tensorflow的程式中,所有的資料都是通過Tensor的形式來表示。

      【1】從功能上看,Tensor可以被簡單的理解為【多維陣列】,其中零階Tensor表示標量scalar,也就是一個數;一階張量為向量(vector),也就是一個一維陣列;n階Tensor可以理解為一個n維陣列。但是,Tensor在Tensorflow中的實現,並不是直接採用陣列的形式,它只是對Tensorflow運算結果的【引用,C++中的引用,也就是說,這個Tensor對應的並不是一個真正的記憶體  空間,而是另一個記憶體空間的別名,稍微有點類似指標的意思】。也就是說,Tensorflow在張量Tensor中,並沒有儲存真正的資料,因為Tensor是一個引用,而不是一個變數,系統並沒有為Tensor開闢真正可以儲存資料的記憶體空間。Tensor儲存的是如何得到這些資料的計算過程。還是以【向量加法】為例,當執行程式碼的時候,並不會得到加法的結果,而會得到對結果的一個引用。

#coding=UTF-8
#========================================================================================================
#檔案說明:
#       Tensorflow的【常量】、【變數】和【資料型別】
#開發環境:
#       Win10+Tensorflow+OpenCv_python3.4+PyCharm5.0.3+Python3.5
#時間地點:
#       陝西師範大學.文津樓  2018.4.17
#作    者:
#       馬衛飛
#========================================================================================================
import tensorflow as tf
a = tf.constant([1.0,2.0],name="a")
b = tf.constant([2.0,3.0],name="b")

result = tf.add(a,b,name="add")
print(result)

三 Tensorflow中的常量、變數和佔位符

1 Tensorflow中的[常量]的建立-----tf.constant()

#========================================================================================================
#【1】首先是,對Tensorflow包的匯入
#【2】這裡將Tensorflow包匯入到系統,這樣便可以使得在後續的程式設計過程中,直接使用現成的Tensorflow包,為了便於使用,將其重
#    新命名為tf
import tensorflow as tf
#【1】Tensorflow中【常量】的【建立方法】如下所示,其中‘Hello Tensrflow’是常量的初始值;tf.string是常量型別,在平時編
#     寫的過程中可以省略
hello = tf.constant('Hello Tensorflow!',dtype=tf.string)
#【2】這裡建立了一個以【常數】為底的初始值,省略了tf.int的常量型別
a     = tf.constant(1)

2 Tensorflow中的[變數]的建立-----tf.Variable()

    在深度學習框架Tensorflow中,變數(tf.Variable)的作用就是【儲存】和【更新】神經網路的【引數】。和其他程式語言類似,Tensorflow中的Variabel也需要指定初始化值。因為,在神經網路中,給引數賦予初始值最為常見,所以,一般也使用隨機數給Tensorflow中的變數初始化。

    首先,我們看一下Tensorflow中變數的建立,此塊,我們是呼叫了Tensorflow中變數的宣告函式tf.Variable()來建立的變數,如下所示:

#========================================================================================================
#檔案說明:
#       Tensorflow中【變數】的建立
#========================================================================================================
import tensorflow as tf
a = tf.variable(1.0,dtype=tf.float32)
b = tf.Variable(1.0,dtype=tf.float32)

    然後,我們看一下,神經網路中,引數的定義和引數的初始化方法,如下所示:

#========================================================================================================
#模組說明:
#       【1】此塊也是呼叫了Tensorflow中【變數的宣告函式】tf.Variable,在宣告函式中,給出了初始化這個變數的方法。
#       【2】Tensorflow中,變數的初始化值可以設定成【隨機數】、【常數】或者是通過其他變數的初始值計算得到的。
#       【3】在下面的程式中,tf.random_normal([2,3],stddev=2)函式會產生一個2*3的矩陣,矩陣中的元素是均值為0,標準
#           差為2的隨機數
#       【4】tf.random_normal函式可以通過引數mean來指定平均值,在沒有指定時,預設為0.通過滿足【正態分佈】的【隨機數】
#           來初始化神經網路中的引數是一個非常常用的方法。
#       【5】除了正太分佈的隨機數,Tensorflow還提供了一些其他的隨機數生成器。
#              [1]tf.random_normal-----------正太分佈----------平均值、標準差、取值型別
#              [2]tf.random_uniform----------平均分佈----------最小,最大取值,取值型別
#              [3]tf.random_gamma------------Gamma分佈---------形狀引數alpha、尺度引數beta、取值型別
#========================================================================================================
import tensorflow as tf
weights = tf.Variable(tf.random_normal([2,3],stddev=2))
#========================================================================================================
#       【6】Tensorflow也支援通過【常數】來初始化一個變數。下面給出了Tensorflow中常數/常量的生成函式,如下所示:
#              [1]tf.zeros---------產生全0的陣列--------tf.zeros([2,3],int32)
#              [2]tf.ones----------產生全1的陣列--------tf.ones([2,3],int32)
#              [3]tf.fill----------產生一個全部為指定數字的陣列----tf.fill([2,3],9)
#              [4]tf.constant------產生一個給定值得常量
#       【7】在神經網路中,偏置項bias通常會使用【常數】來設定初始化,下面給出一個程式碼的樣例:
#========================================================================================================
biases = tf.Variable(tf.zeros([3]))
#========================================================================================================
#       【8】這段程式碼將會生成一個初始值全為0,且長度為3的變數
#       【9】除了使用【隨機數】和【常數】,Tensorflow也支援通過其他的變數來初始化新的變數。如下程式碼所示:
#========================================================================================================
w2 = tf.Variable(weights.initialized_value())          #[1]使用weights變數的值初始化w2,但必須藉助這個函式才可以
w3 = tf.Variable(weights.initialized_value()*2.0)
#========================================================================================================
#       【10】在上面的程式碼中,w2的初始值被設定成了與weights變數相同;w3的初始值被設定成了weights的兩倍
#       【11】在Tensorflow中,一個變數的值在被使用之前,這個變數的初始化過程需要被明確的呼叫
#========================================================================================================

3 Tensorflow中的[佔位符]的建立-----tf.placeholder

#========================================================================================================
#檔案說明:
#       Tensorflow中【佔位符】
#詳細說明:
#       【1】除了一般框架中常見的【資料常量】和【資料變數】外,Tensorflow還存在另外一種特殊的【資料型別】,【佔位符】,
#           placeholder;因為Tensorflow特殊的【資料計算】和【處理形式】,圖進行計算的時候,可以從外界傳入數值。而
#           Tensorflow並不能直接對傳入的資料進行處理,因此,使用placeholder保留一個資料的位置,之後可以在Tensorflow
#           會話執行的時候進行賦值。
#       【2】tf.placeholder是佔位符的函式,其中的引數是傳入的資料型別,這裡可以看到,當定義一個引數是tf.float32時,
#           傳入的引數也必須是float32型別,如果傳入其他型別的引數,系統就會報錯。
#       【3】如下面的程式所示,input1和input2是2個int型別的佔位符,此時,資料並不能直接發生改變,而是在會話進行的過程
#           中,不停的填入資料集中進行資料的處理。
#       【4】這塊有個和有意思的例子,我們可以將這一過程想象成馬克沁重機槍,機槍平時裡面不儲存彈藥,只有在開火的時候,才
#           源源不斷的維機槍送入子彈。
#       【5】同理,佔位符placeholder平時只是作為一個空的Tensor在Tensorflow的圖中構成一個邊,只有當圖完全啟動後,才
#           有真實的資料被填入和計算。
#Tensorflow中幾種常用的函式:
#       【1】tf.add(x,y,name=None)              求和
#       【2】tf.sub(x,y,name=None)              減法
#       【3】tf.mul(x,y,name=None)              乘法
#       【4】tf.div(x,y,name=None)              除法
#       【5】tf.mod(x,y,name=None)              求模
#       【6】tf.abs(x,name=None)                求絕對值
#       【7】tf.neg(x,name=None)                求負
#========================================================================================================
import tensorflow as tf

input1 = tf.placeholder(tf.int32)
input2 = tf.placeholder(tf.int32)

output = tf.add(input1,input2)

sess   = tf.Session()

print(sess.run(output,feed_dict={input1:[1],input2:[2]}))

相關文章