第一節,基本用法
推薦播客:我的Tensorflow學習之路
http://wiki.jikexueyuan.com/project/tensorflow-zh/get_started/basic_usage.html
項目代碼: https://github.com/yongyehuang/Tensorflow-Tutorial
一 TensorFlow安裝
TensorFlow是谷歌基於DistBelief進行研發的第二代人工智能學習系統,其命名來源於本身的運行原理。Tsnsor(張量)意味著N維數組,Flow(流)意味著
基於數據流圖的計算,TensorFlow為張量從流圖的一端流動到另一端的計算過程。TensorFlow是將復雜的數據結構傳輸至人工神經網絡中進行分析和處理
過程的系統。
下載和安裝:https://blog.csdn.net/darlingwood2013/article/details/60322258
本文是將tensorflow在原生windows系統上安裝, 采用anocanda的安裝方式, 安裝的是cpu版本(我的顯卡不支持CUDA)
1.按照官網的指示:
pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow-1.0.0-cp35-cp35m-win_x86_64.whl
2 上一步安裝顯示我的平臺不支持,嘗試使用 conda install tensorflow安裝
這裏安裝成功了,我是AMD的卡,可能對應的安裝不一樣!
3.確認tensorflow安裝成功: 錯誤嘗試:直接在cmd裏面鍵入python,然後鍵入import tensorflow as tf
顯然到此我們已經安裝成功了,參考tensorflow官方文檔,請上英文官網,中文社區似乎沒有更新windows上的安裝
二 基本使用
使用TensorFlow,你必須明白TensorFlow:
- 使用圖(graph)來表示計算任務
- 在被稱之為會話(Session)的上下文(context)中執行圖
- 使用tensor表示數據
- 通過變量(Variable)維護狀態
- 使用feed和fetch可以為任意的操作(arbitrary operation)賦值或者從中獲取數據
1.綜述
TensorFlow是一個編程系統,使用圖來表示計算任務,圖中的節點被稱作op(operation的縮寫),一個op獲得0個或者多個Tensor,執行計算,產生0個或
者多個Tensor,每個tensor是一個類型的多維數組。例如,你可以將一小組圖像集表示為一個四維浮點數數字,這四個維度分別是[batch,height,width,channels]。
一個TensorFlow圖描述了計算的過程,為了進行計算,圖必須在會話裏啟動,會話將圖的op分發到諸如CPU或者GPU的設備上,同事提供執行op的方
法,這些方法執行後,將產生的tensor返回,在python語言中,返回的tensor是numpy array對象,在C或者C++語言中,返回的tensor是tensorflow:Tensor
實例。
2.計算圖
TensorFlow 程序通常被組織成一個構建階段和一個執行階段. 在構建階段, op 的執行步驟被描述成一個圖, 在執行階段, 使用會話執行執行圖中的 op.
例如, 通常在構建階段創建一個圖來表示訓練神經網絡, 然後在執行階段反復執行圖中的訓練 op.
TensorFlow 支持 C, C++, Python 編程語言. 目前, TensorFlow 的 Python 庫更加易用, 它提供了大量的輔助函數來簡化構建圖的工作, 這些函數尚未被
C 和 C++ 庫支持。三種語言的會話庫 (session libraries) 是一致的。
3.構建圖
構建圖的第一步, 是創建源 op (source op), 源 op 不需要任何輸入, 例如 常量 (Constant),
源 op 的輸出被傳遞給其它 op 做運算。
Python 庫中, op 構造器的返回值代表被構造出的 op 的輸出, 這些返回值可以傳遞給其它 op 構造器作為輸入。
TensorFlow Python 庫有一個默認圖 (default graph), op 構造器可以為其增加節點. 這個默認圖對 許多程序來說已經足夠用了. 閱讀 Graph 類 文檔 來
了解如何管理多個圖。
4.示例程序
# -*- coding: utf-8 -*- """ Created on Sat Mar 31 16:54:02 2018 @author: Administrator """ #TensorFlow第一節 import tensorflow as tf ‘‘‘ 構建階段:op 的執行步驟被描述成一個圖 ‘‘‘ #創建一個常量op,產生一個1 x 2矩陣,這個op被稱做一個節點,加到默認圖中,構造器的返回值代表常量op的輸出 matrix1 = tf.constant([[3.,3.]]) #創建另一個常量op。產生一個2 x 1的矩陣 matrix2 = tf.constant([[2.],[2.]]) #創建一個矩陣乘法 matmul op,把matrix1和matrix2作為輸入 product = tf.matmul(matrix1,matrix2) ‘‘‘ 默認圖現在有三個節點,兩個常量 constant() op和一個 matmul() op,wile真正進行矩陣相乘運算,並得到矩陣 乘法的結果,你必須載會話中啟動這個圖 ‘‘‘ ‘‘‘ 執行階段:使用會話執行執行圖中的 op. ‘‘‘ #構造階段完成後,才能啟動圖,啟動圖的第一步是創建一個Session對象,如果無任何創建函數,會話構造器將啟動默認圖 sess = tf.Session() ‘‘‘ 調用sess的run()方法來執行矩陣乘法op,傳入product作為該方法的參數,上面提到,product代表矩陣乘法op的輸出 #傳入它是向方法表明,我們希望取回矩陣乘法op的輸出 整個執行過程是自動化的,會話負責傳遞op所需的全部輸入,op通常是並發執行的 函數調用run(product)觸發了圖中三個op的執行 返回值result是一個numpy.ndarray對象 ‘‘‘ result = sess.run(product) print(result) #[[ 12.]] #任務完畢,關閉會話,Session對象在使用完畢後需要關閉以釋放資源,除了顯示調用close()外,也可以使用with代碼塊 sess.close() ‘‘‘ 在實現上, TensorFlow 將圖形定義轉換成分布式執行的操作, 以充分利用可用的計算資源(如 CPU 或 GPU). 一般你不需要顯式指定使用 CPU 還是 GPU, TensorFlow 能自動檢測. 如果檢測到 GPU, TensorFlow 會盡 可能地利用找到的第一個 GPU 來執行操作. 如果機器上有超過一個可用的 GPU, 除第一個外的其它 GPU 默認是不參與計算的. 為了讓 TensorFlow 使用 這些 GPU, 你必須將 op 明確指派給它們執行. with...Device 語句用來指派特定的 CPU 或 GPU 執行操作: ‘‘‘ ‘‘‘ 設備用字符串進行標識. 目前支持的設備包括: "/cpu:0": 機器的 CPU. "/gpu:0": 機器的第一個 GPU, 如果有的話. "/gpu:1": 機器的第二個 GPU, 以此類推. ‘‘‘ with tf.Session() as sess: with tf.device("/cpu:0"): print(sess.run(product)) #[[ 12.]] ‘‘‘ 交互式使用 文檔中的python實例使用一個會話Seesion來啟動圖,並調用Session.run()方法執行操作 為了方便使用諸如IPython之類的Python交互環境,可以使用InteractiveSession替代Session類,使用Tensor.eval() 和Operation.run()方法來代替Session.run(),這樣可以避免使用一個變量來持有會話 ‘‘‘ #進入一個交互式TensorFlow會話 sess = tf.InteractiveSession() x = tf.Variable([1.0,2.0]) a = tf.constant([3.0,3.0]) #使用初始化器 initinalizer op的run()初始化x x.initializer.run() #增加一個減去sub op,從 x 減去 a,運行減去op,輸出結果 sub = tf.subtract(x,a) print(sub.eval()) #[-2. -1.]
5.Tensor
TensorFlow程序使用tensor數據結構來代表所有的數據,計算圖中,操作間傳遞的數據都是tensor,你可以把TensorFlow tensor看做一個n維的數組
或者列表。一個tensor包含一個靜態類型rank,和一個shape。具體參見Rank, Shape, 和 Type.。
6.變量
Variables 變量維護圖執行過程中的狀態信息. 下面的例子演示了如何使用變量實現一個簡單的計數器.
#創建一個變量,初始化為標量0 state = tf.Variable(0,name = ‘counter‘) #創建一個op,其作用是使state增1 one = tf.constant(1) new_value = tf.add(state,one) ‘‘‘ assign()操作室圖所描述的表達式的一部分,正如add()操作一樣,所以在調用run()執行表達式之前,它並不會 正則執行賦值操作 通常會將一個統計模型中的參數表示為一組變量. 例如, 你可以將一個神經網絡的權重作為某個變量存儲在一個 tensor 中. 在訓練過程中, 通過重復運行訓練圖, 更新這個 tensor. ‘‘‘ update = tf.assign(state,new_value) #啟動圖後,變量必須先經過‘初始化‘ op #首先必須增加一個 ‘初始化‘ op 到圖中 init_op = tf.global_variables_initializer() #啟動圖,運行op with tf.Session() as sess: sess.run(init_op) #打印state初始值 print(sess.run(state)) #0 #運行op,更新state,並打印 for _ in range(3): sess.run(update) print(sess.run(state)) #1 2 3
7.Fetch
為了取回操作中的輸出內容,可以在使用Seesion對象的run()調用執行圖時,傳入一些tensor,這些tensor會幫助你取回結果,在之前的例子裏,我們
只取回了單個節點state,但是你可以取回多個tensor。
in1 = tf.constant(1.0) in2 = tf.constant(2.0) in3 = tf.constant(3.0) intermed = tf.add(in1,in2) mul = tf.multiply(in2,in3) #需要獲取多個tensor,在op的一次運行中一起獲得。 with tf.Session() as sess: re = sess.run([intermed,mul]) print(re) #[3.0, 6.0]
8.Feed
上述示例在計算圖中引入了 tensor, 以常量或變量的形式存儲. TensorFlow 還提供了 feed 機制, 該機制 可以臨時替代圖中的任意操作中的 tensor
可以對圖中任何操作提交補丁, 直接插入一個 tensor。
feed 使用一個 tensor 值臨時替換一個操作的輸出結果. 你可以提供 feed 數據作為 run()
調用的參數. feed 只在調用它的方法內有效, 方法結束,
feed 就會消失. 最常見的用例是將某些特殊的操作指定為 "feed" 操作, 標記的方法是使用 tf.placeholder() 為這些操作創建占位符。
input1 = tf.placeholder(tf.float32) input2 = tf.placeholder(tf.float32) output = tf.multiply(input1, input2) #使用7替代input1,2替代input2,feed操作相當於設置一個占位符 with tf.Session() as sess: print(sess.run([output], feed_dict={input1:[7.], input2:[2.]})) #[array([ 14.], dtype=float32)]
三 案例
在使用TensorFlow的時候,需要註意以下幾點;
1.就是 Session() 和 InteractiveSession() 的用法。後者用 Tensor.eval() 和 Operation.run() 來替代了 Session.run(). 其中更多的是用 Tensor.eval(),
所有的表達式都可以看作是 Tensor.
2.另外,tf的表達式中所有的變量或者是常量都應該是 tf 的類型。
3.只要是聲明了變量,就得用 sess.run(tf.global_variables_initializer()) 或者 x.initializer.run() 方法來初始化才能用。
例一
通過本例熟悉機器學習的一個流程
1.準備數據
2.構造模型(主要是設置目標函數)
3.求解模型(不需要考慮反向傳播問題)
第一節,基本用法