tensorflow 學習(一)

準備轉載 幾篇文章 原文鏈接:

https://www.cnblogs.com/wanyu416/p/8954098.html

 

一、Tensorflow基本概念

  1、使用圖(graphs)來表示計算任務,用於搭建神經網絡的計算過程,但其只搭建網絡,不計算

  2、在被稱之爲會話(Session)的上下文(context)中執行圖

  3、使用張量(tensor)表示數據,用“階”表示張量的維度。關於這一點需要展開一下

             0階張量稱爲標量,表示單獨的一個數

            1階張量稱爲向量, 表示一個一維數組

            2階張量稱爲矩陣,表示一個二維數組

            ……

            張量是幾階的可以通過張量右邊的方括號數來判斷。例如 t = [ [ [    ] ] ],顯然這個爲3階。

  4、通過變量(Variable)維護狀態

  5、使用feed和fetch可以爲任意的操作賦值或者從其中獲取數據

  Tensorflow是一個編程系統,使用圖(graphs)來表示計算任務,圖(graphs)中的節點稱之爲op(operation),一個op獲得0個或者多個Tensor,執行計算,產生0個或多個Tensor,Tensor看作是一個n維的數組或列表。圖必須在會話(Session)裏被啓動。

二、tensorflow基本框架知識

1、會話

複製代碼

1 import tensorflow as tf     # 簡寫方便一點
2 
3 # 創建兩個常量(constant)
4 m1=tf.constant([[3,3]])     #一行兩列的矩陣,這裏是矩陣乘法,所以是二維數組,注意書寫格式以及矩陣乘法規則
5 m2=tf.constant([[2],[3]])   #兩行一列的矩陣
6 
7 # 創建一個矩陣乘法(matmul)的op
8 product=tf.matmul(m1,m2)
9 print(product)

複製代碼

  運行會得到顯示結果,其中MatMul爲節點名,0代表第0個輸出;shape是維度,(1,1)代表一行一列的張量,長度爲1;dtype指數據類型爲整型。

Tensor("MatMul:0", shape=(1, 1), dtype=int32)

  結果並不是想象中的是一個具體數字,而是一個Tensor,這是因爲之前提到過 圖必須在會話中運行,現在我們並未使用會話,所以只能得到一個Tensor。

  定義會話有兩種方法,一般使用第二種。

1 # method 1
2 sess=tf.Session()            # 將Session簡寫爲sess
3 result=sess.run(product)     # 調用run方法執行圖,這個觸發了三個op(操作),兩個常量的建立,矩陣的乘法
4 print(result)
5 sess.close()                 # 關閉會話
1  # method 2
2 with tf.Session() as sess:    # Session()後面的()因爲代碼提示裏沒有,所以很容易丟  
3     result=sess.run(product)
4     print(result)             # with as的這種結構會自動關閉會話

運行顯示結果爲

[[15]]

注意:Session() 經常會寫錯,大小寫問題和括號問題,都是典型錯誤,多加練習

 2、變量

  上文常量使用tf.constant()表示,變量是用tf.Variable()表示

複製代碼

 1 import tensorflow as tf
 2 
 3 x=tf.Variable([1,2])    # 定義一個變量,這裏是張量的加減法,所以一維數組即可
 4 a=tf.constant([3,3])    # 定義一個常量
 5 
 6 sub=tf.subtract(x,a)    # 增加一個減法op
 7 add=tf.add(x,sub)       # 增加一個加法op
 8 
 9 init=tf.global_variables_initializer()   # 在tensorflow中使用變量要初始化,此條語句也可以初始化多個變量,這句代碼提示沒有(),多加練習
10 
11 with tf.Session() as sess:
12     sess.run(init)                       # 變量初始化,也要放在會話中,才能執行
13     print(sess.run(sub))
14     print(sess.run(add))

複製代碼

  運行將得到結果

[-2 -1]
[-1  1]

  上述代碼展示了變量的定義和初始化,但還沒有體現變量的本質,下面一段代碼實現變量a進行5次+1的操作

        值得一提的是,在打印常量和變量時,不能像python中的直接print(a),而是也需要放在sess.run()中。

複製代碼

 1 a=tf.Variable(0,name='counter')        # 創建一個變量初始化爲0,並命名爲counter。(此段代碼中命名無作用)
 2 new_value = tf.add(a,1)                # 創建一個加法op,作用是使state加1
 3 update=tf.assign(a,new_value)          # 此句話是賦值op,在tensorflow中,賦值也需要對應的op
 4 init=tf.global_variables_initializer() # 變量初始化
 5 with tf.Session() as sess:
 6     sess.run(init)
 7     print(sess.run(a))
 8     for i in range(5):                
 9         sess.run(update)
10         print(sess.run(a))

複製代碼

  運行,顯示結果爲

0
1
2
3
4
5

 注意:初始化時,pycharm會代碼提示 tf.global_variables_initializer,但往往會把括號漏掉,需注意

            常用的op現在除了加減乘除,還多了個assign()的賦值op

 3、Fetch

  sess.run([fetch1,fetch2]) 進行多個op,注意格式

複製代碼

 1 import tensorflow as tf
 2 
 3 input1 = tf.constant(3.0)
 4 input2 = tf.constant(2.0)
 5 input3 = tf.constant(5.0)
 6 
 7 add = tf.add(input2,input3)
 8 mul = tf.multiply(input1,add)
 9 
10 with tf.Session() as sess:
11     result = sess.run([mul,add])       # 執行了兩個op,要注意格式
12     print(result)

複製代碼

  運行,結果顯示爲

[21.0, 7.0]

  這裏需要提一下tf.matmul()是用於矩陣乘法,tf.multiply是用於點乘。正如上面這段代碼的multiply

4、placeholder佔位

  定義變量時可先不輸入具體數值,先佔位,在會話中調用op時,再輸入具體值。

複製代碼

import tensorflow as tf

input1 = tf.placeholder(tf.float32)      # 使用placeholder()佔位,需要提供類型
input2 = tf.placeholder(tf.float32)
output = tf.multiply(input1,input2)

with tf.Session() as sess:
    print(sess.run(output,feed_dict={input1:8.0,input2:2.0}))  # 以字典形式輸入feed_dict

複製代碼

  運行,顯示結果爲

[ 16.]

       佔位多組數據以後再說在下一篇隨筆會提到。

 

  以上就是一些比較基本的tensorflow概念的描述和代碼實現。

    本人初學者,有錯誤歡迎指出。感謝。

發佈了60 篇原創文章 · 獲贊 33 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章