一、TensorFlow™是一個基於數據流編程(dataflow programming)的符號數學系統,被廣泛應用於各類機器學習(machine learning)算法的編程實現,其前身是谷歌的神經網絡算法庫DistBelief。
TensorFlow: 神經網絡(深度) 圖像:卷積神經網絡 自然語言處理:循環神經網絡 特點: 引入各種計算設備(CPU/GPU/TPU),以及能夠很好的運行在移動端。 合理的C++使用界面,易用的Python使用界面來構造個執行你的graphs,可以直接寫Python/C++程序 采用數據流圖(data flow graphs),用於數值計算的開源庫,能夠靈活的組裝圖,執行圖 谷歌支持,希望成為通用語言 前后端系統: 前端系統:定義程序圖的機構 后端系統:運算圖結構 會話: 1、運算圖的結構 2、分配資源計算 3、掌握資源(變量的資源,隊列,線程)
二、前面我們已經介紹了TensorFlow在人工智能領域所能做的事情了,下面會主要介紹TensorFlow的一些常用概念。
1)張量(tensor):
tensor(張量): 一個類型化的N維數組 三部分: 名字、形狀、數據類型 階:和數組的維度類似 屬性: graph:張量的默認圖 op:張量的操作名 name:張量的字符串描述 shape:張量的形狀 動態形狀和靜態形狀: 動態形狀:(動態形狀,創建一個新的張量並且數據量大小不變) 一種描述原始張量在執行過程中的一種形狀(動態變化) tf.reshape(和numpy類似),創建一個具有不同形態的新張量 靜態形狀:(靜態形狀,一旦張量固定,不能再次設置靜態形狀,不能誇維度修改) 創建一個張量,初始的形狀 tf.get_shape():獲取靜態形狀 tf.set_shape():更新對象的靜態形狀。通常用於不能推斷的情況下 張量操作: 固定值張量: tf.zeros(shape, dtype, name) tf.ones() tf.constant() 隨機張量:(正太分布) tf.random_normal(shape, mean, stddev, dtype, seed, name) mean: 平均值 stddev: 標准差 類型變換: tf.cast(x, dtype, name) 形狀變換: tf.reshape() tf.get_shape() tf.set_shape() 切片與擴展: tf.concat(values, axis, name) google提供的數據運算: 地址:https://tensorflow.google.cn/api_docs/python/tf/math
2)變量(Variable):
變量: 也是一種op,是一種特殊的張量,能夠進行儲存持久化,它的值就是張量,默認被訓練 tf.Variable(initial_value, name, trainable) 注: 1、變量op能夠持久化保存,普通張量不行 2、當定義一個變量op的時候,一定要在會話中取運行初始化 3、name參數:在tensortboard使用的時候展示名字,可以讓相同op名字進行區分
3)數據流圖(Graph):
數據流圖:
tensor:張量(numpy中的數組,ndarray類型然后封裝為tensor),簡而言之,就是數組
operation(op):專門運算的操作節點,所有操作都是一個op
圖:你的這個程序架構
會話:運算程序的圖
這里介紹了上面張量和變量的OP解釋。
4)會話(Session):
構建tf.Graph時將節點和邊緣對象加入圖中不會觸發計算,圖構建完成后將計算部分分流給tf.Session實現計算。
tf.Session擁有物理資源,通常與Python的with代碼塊中使用,在離開代碼塊后釋放資源 。在不使用with代碼塊的情況下創建tf.Session,應在完成會話時明確調用tf.Session.close結束進程。
調用Session.run創建的中間張量會在調用結束時或結束之前釋放。tf.Session.run是運行節點對象和評估張量的主要方式,tf.Session.run需要指定fetch並提供供給數據(feed)字典,用戶也可以指定其它選項以監督會話的運行。
5)可視化(tensorboard):
可視化tensorboard: 通過讀取TensorFlow事件文件來運行 tf.summary.FileWriter(path, graph) 讀取(cmd中執行):tensorboard --logdir "path"
三、簡單的例子
import tensorflow as tf a = tf.constant(5.0) b = tf.constant(4.0) sum = tf.add(a, b) # 默認的這張圖,相當於一塊內存 graph = tf.get_default_graph() print(graph) # 只能運行一個圖 with tf.Session() as sess: print(sess.run(sum)) # 圖的創建 # 創建一張圖包含了一組op和tensor,上下文環境 # op:只要使用tensorflow的api定義的函數都是op # tensor:指數數據 g = tf.Graph() with g.as_default(): c = tf.constant(12.0) # 有重載機制(默認給運算符重載成op類型) d = c + 1.0 print(g) # 可以在會話中指定運行 # config: # log_device_placement: 查看運行設備信息 with tf.Session(graph=g, config=tf.ConfigProto(log_device_placement=True)) as sess: print(sess.run(c)) # eval:只有在會話上下文才可以使用 print(d.eval()) # 占位符 plt = tf.placeholder(tf.float32, [None, 3]) print(plt) # 靜態形狀,一旦張量固定,不能再次設置靜態形狀,不能誇維度修改 plt.set_shape([2, 3]) print(plt) # 動態形狀,創建一個新的張量並且數據量大小不變 plt_reshape = tf.reshape(plt, [3,2]) print(plt_reshape) print(sess.run(plt, feed_dict={plt: [[1,2,3], [4,5,6]]})) print("*" * 20) print(d.graph) print("-" * 20) print(d.op) print("-" * 20) print(d.name) print("-" * 20) # 形狀表示維度大小,如果是()表示0維,?代表不確定 print(d.shape) print("*" * 20) # 變量 e = tf.constant(1.0, name="e") f = tf.constant(2.0, name="f") g = tf.add(e, f, name="g") var = tf.Variable(tf.random_normal([2,3], mean=0, stddev=1), name="var") print(e) print(var) # 初始化所有變量的op init_op = tf.global_variables_initializer() with tf.Session() as sess: # 必須初始化op,才可運行 sess.run(init_op) # tensorboard 寫入 tf.summary.FileWriter("tmp/summary/test", graph=sess.graph) print(sess.run([g, var]))
結果
<tensorflow.python.framework.ops.Graph object at 0x0000020B45A05B38> 9.0 <tensorflow.python.framework.ops.Graph object at 0x0000020B58472940> Device mapping: no known devices. add: (Add): /job:localhost/replica:0/task:0/cpu:0 add/y: (Const): /job:localhost/replica:0/task:0/cpu:0 Const: (Const): /job:localhost/replica:0/task:0/cpu:0 12.0 13.0 Tensor("Placeholder:0", shape=(?, 3), dtype=float32) Tensor("Placeholder:0", shape=(2, 3), dtype=float32) Tensor("Reshape:0", shape=(3, 2), dtype=float32) [[1. 2. 3.] [4. 5. 6.]] ******************** <tensorflow.python.framework.ops.Graph object at 0x0000020B58472940> -------------------- name: "add" op: "Add" input: "Const" input: "add/y" attr { key: "T" value { type: DT_FLOAT } } -------------------- add:0 -------------------- () ******************** Tensor("e:0", shape=(), dtype=float32) Tensor("var/read:0", shape=(2, 3), dtype=float32) [3.0, array([[-0.24931028, 0.10012802, -0.8845826 ], [-0.08898215, -0.87531203, -0.5762032 ]], dtype=float32)]
四、TensorFlow總體上面還是非常靈活的,采用數據流圖的方式,提前配置好關系圖,在通過數據傳入的方式來進行下一步的運算。
通過會話的方式來進行資源等的控制,減少人為的造成的問題。
總體而言,TensorFlow的靈活度以及適用性還是很不錯的。