您好,登錄后才能下訂單哦!
TensorFlow 是一個采用數據流圖(data flow graphs),用于數值計算的開源軟件庫。節點(Nodes)在圖中表示數學操作,圖中的線(edges)則表示在節點間相互聯系的多維數據數組,即張量(tensor)。它靈活的架構讓你可以在多種平臺上展開計算,例如臺式計算機中的一個或多個CPU(或GPU),服務器,移動設備等等。TensorFlow 最初由Google大腦小組(隸屬于Google機器智能研究機構)的研究員和工程師們開發出來,用于機器學習和深度神經網絡方面的研究,但這個系統的通用性使其也可廣泛用于其他計算領域。
當前TensorFlow最新的開源版本是r0.9。
數據流圖用“結點”(nodes)和“線”(edges)的有向圖來描述數學計算。“節點” 一般用來表示施加的數學操作,但也可以表示數據輸入(feed in)的起點/輸出(push out)的終點,或者是讀取/寫入持久變量(persistent variable)的終點。“線”表示“節點”之間的輸入/輸出關系。這些數據“線”可以輸運“size可動態調整”的多維數據數組,即“張量”(tensor)。張量從圖中流過的直觀圖像是這個工具取名為“Tensorflow”的原因。一旦輸入端的所有張量準備好,節點將被分配到各種計算設備完成異步并行地執行運算。
TensorFlow 不是一個嚴格的“神經網絡”庫。只要可以將計算表示為一個數據流圖,就可以使用Tensorflow來構建圖,描寫驅動計算的內部循環。Tensorflow提供了有用的工具來幫助你組裝“子圖”(常用于神經網絡),當然用戶也可以自己在Tensorflow基礎上寫自己的“上層庫”。定義順手好用的新復合操作和寫一個python函數一樣容易,而且也不用擔心性能損耗。當然萬一發現找不到想要的底層數據操作,也可以自己寫一點c++代碼來豐富底層的操作。
Tensorflow 可以在CPU和GPU上運行,比如說可以運行在臺式機、服務器、手機移動設備等等。想要在沒有特殊硬件的前提下,在你的筆記本上跑一下機器學習的新想法?Tensorflow也可以辦到。準備將你的訓練模型在多個CPU上規模化運算,又不想修改代碼?Tensorflow也可以辦到。想要將你的訓練好的模型作為產品的一部分用到手機app里?Tensorflow可以辦到這點。你改變主意了,想要將你的模型作為云端服務運行在自己的服務器上,或者運行在Docker容器里?Tensorfow也能辦到。
過去如果要將科研中的機器學習想法用到產品中,需要大量的代碼重寫工作。那樣的日子一去不復返了!在Google,科學家用Tensorflow嘗試新的算法,產品團隊則用Tensorflow來訓練和使用計算模型,并直接提供給在線用戶。使用Tensorflow可以讓應用型研究者將想法迅速運用到產品中,也可以讓學術×××者更直接地彼此分享代碼,從而提高科研產出率。
基于梯度的機器學習算法會受益于Tensorflow自動求微分的能力。作為Tensorflow用戶,你只需要定義預測模型的結構,將這個結構和目標函數(objective function)結合在一起,并添加數據,Tensorflow將自動為你計算相關的微分導數。計算某個變量相對于其他變量的導數僅僅是通過擴展你的圖來完成的,所以你能一直清楚看到究竟在發生什么。
Tensorflow 有一個合理的c++使用界面,也有一個易用的python使用界面來構建和執行你的graphs。你可以直接寫python/c++程序,也可以用交互式的ipython界面來用Tensorflow嘗試些想法,它可以幫你將筆記、代碼、可視化等有條理地歸置好。當然這僅僅是個起點——Tensorflow鼓勵創造自己最喜歡的語言界面,比如Go,Java,Lua,Javascript,或者是R。
目前開源的版本暫時只看到對于python/C++的支持,并且python的API比C++的還是要更成熟易用。社區已經有針對Java和Ruby的支持。
比如說你有一個具有32個CPU內核、4個GPU顯卡的工作站,想要將你工作站的計算潛能全發揮出來?由于Tensorflow 給予了線程、隊列、異步操作等以最佳的支持,Tensorflow 讓你可以將你手邊硬件的計算潛能全部發揮出來。你可以自由地將Tensorflow圖中的計算元素分配到不同設備上,Tensorflow可以幫你管理好這些不同副本。
超過100項線上產品在使用TensorFlow;
Google數據科學家和工程師都在使用TensorFlow;
Google用TensorFlow構建下一代的智能應用;
TensorFlow已經被Google開源,并部署到Google Cloud上;
TensorFlow支持二進制包和源碼包等多種安裝方式,支持在Linux、Mac OS X、Ubuntu等多個平臺上進行安裝,并且可以運行在docker之上,官網上有比較詳細的安裝文檔。
TensorFlow最簡單的安裝方式是通過pip進行安裝,如果條件不允許(例如無外網的條件下),需要通過源碼進行安裝,TensorFlow的源碼編譯依賴Python 2.7版本,以及Bazel進行編譯。
整體來說TensorFlow的安裝過程還是比較簡單的。
一塊可以用來運算并且擁有自己的地址空間的硬件,比如GPU和CPU。
Tensor 的一個方法,返回 Tensor 的值。觸發任意一個圖計算都需要計算出這個值。只能在一個已經啟動的會話的圖中才能調用該 Tensor 值。
TensorFlow 的一個概念:把一個 Tensor 直接連接到一個會話圖表中的任意節點。feed 不是在構建圖(graph)的時候創建,而是在觸發圖的執行操作時去申請。一個 feed 臨時替代一個帶有 Tensor 值的節點。把feed數據作為run( )方法和eval( )方法的參數來初始化運算。方法運行結束后,替換的 feed 就會消失,而最初的節點定義仍然還在。可以通過tf.placeholder( )把特定的節點指定為 feed 節點來創建它們。
TensorFlow中的一個概念:為了取回運算操作的輸出結果。取回的申請發生在觸發執行圖操作的時候,而不是發生在建立圖的時候。如果要取回一個或多個節點(node)的 Tensor 值,可以通過在 Session 對象上調用run( )方法并將待取回節點(node)的列表作為參數來執行圖表(graph)。
把運算任務描述成一個直接的無環圖形(DAG),圖表中的節點(node)代表必須要實現的一些操作。圖中的邊代表數據或者可控的依賴。GratheDef 是系統中描述一個圖表的協議(api),它由一個 NodeDefs 集合組成。一個GraphDef可以轉化成一個更容易操作的圖表對象。
在 Python API 中,TensorFlow 僅僅在第一維上對 Tensor 有所體現。如果一個 Tensor 有k維,那么一個 IndexedSlices 實例在邏輯上代表一個沿著這個 Tensor 第一維的(k-1)維切片的集合。切片的索引被連續儲存在一個單獨的一維向量中,而對應的切片則被拼接成一個單獨的k維 Tensor。如果 sparsity 不是受限于第一維空間,請用 SparseTensor。
圖中的一個元素。 把啟動一個特定操作的方式稱為特定運算圖表的一個節點,包括任何用來配置這個操作的屬性的值。對于那些多形態的操作,這些屬性包括能完全決定這個節點(Node)簽名的充分信息。
在 TensorFlow 的運行時中,它是一種類似 add 或 matmul 或 concat的運算。可以用how to add an op中的方法來向運行時添加新的操作。
在 Python 的API中,它是圖中的一個節點。在tf.Operation類中列舉出了這些操作。一個操作(Operation)的 type 屬性決定這個節點(node)的操作類型,比如add和matmul。
在一個運行的圖中執行某種操作的行為。要求圖必須運行在會話中。
在 Python 的 API 中,它是 Session 類的一個方法tf.Session.run。可以通過 Tensors 來訂閱或獲取run( )操作。
在C++的API中,它是tensorflow::Session類 的一個方法。
啟動圖的第一步是創建一個 Session 對象。Session 提供在圖中執行操作的一些方法。
在 Python API中,使用tf.Session。
在 C++ 的API中,tensorflow::Session是用來創建一個圖并運行操作的類。
Tensor 的維度和它們的大小。
在一個已經啟動的圖中,它表示流動在節點(node)之間的 Tensor 的屬性。一些操作對 shape 有比較強的要求,如果沒有 Shape 屬性則會報告錯誤。
在 Python API中,用創建圖的 API 來說明 Tensor 的 Shape 屬性。Tensor 的Shape 屬性要么只有部分已知,要么全部未知。詳見tf.TensroShape
在C++中,Shape 類用來表示 Tensor 的維度。tensorflow::TensorShape。
在 Python API 中,它用來表示在 TensorFlow 中稀疏散落在任意地方的 Tensor 。SparseTensor 以字典-值格式來儲存那些沿著索引的非空值。換言之,m個非空值,就包含一個長度為m的值向量和一個由m列索引(indices)組成的矩陣。為了提升效率,SparseTensor 需要將 indice(索引)按維度的增加來按序存儲,比如行主序。如果稀疏值僅沿著第一維度,就用 IndexedSlices。
Tensor是一種特定的多維數組。比如,一個浮點型的四維數組表示一小批由[batch,height,width,channel]組成的圖片。
在一個運行的圖(graph)中,它是一種流動在節點(node)之間的數據。 在 Python 中,Tensor 類表示添加到圖的操作中的輸入和輸出,見tf.Tensor,這樣的類不持有數據。
在C++中,Tensor是方法Session::Run( )的返回值,見tensorflow::Tensor,這樣的 Tensor 持有數據。
TensorFlow 和 Numpy在描述N維數據方面是非常相似的,不同的是TensorFlow除了能定義N維數組,還能創建N維數組的方程,并能自動計算求導,做更多的事情。
對比兩者之間的區別:
可見在tensorflow中許多基礎的N-array操作都是類似的,這讓很多接觸過numpy進行數據分析的人員都能很自然的上手tensorflow。
以下借助TensorFlow我實現了一個簡單的單變量線性回歸程序:
import tensorflow as tf import numpy as np import matplotlib.pyplot as plt # 定義輸入數據 X_data = np.linspace(-1, 1, 100) noise = np.random.normal(0, 0.5, 100) y_data = 5 * X_data + noise # Plot 輸入數據 fig = plt.figure() ax = fig.add_subplot(1, 1, 1) ax.scatter(X_data, y_data) plt.ion() plt.show() # 定義數據大小 n_samples = 100 # 轉換成向量 X_data = np.reshape(X_data, (n_samples, 1)) y_data = np.reshape(y_data, (n_samples, 1)) # 定義占位符 X = tf.placeholder(tf.float32, shape=(None, 1)) y = tf.placeholder(tf.float32, shape=(None, 1)) # 定義學習的變量 W = tf.get_variable("weight", (1, 1), initializer=tf.random_normal_initializer()) b = tf.get_variable("bais", (1,), initializer=tf.constant_initializer(0.0)) y_pred = tf.matmul(X, W) + b loss = tf.reduce_mean(tf.reduce_sum(tf.square(y - y_pred))) # 梯度下降 # 定義優化函數 opt = tf.train.GradientDescentOptimizer(0.001) operation = opt.minimize(loss) with tf.Session() as sess: # 初始化變量 sess.run(tf.initialize_all_variables()) lines = None for i in range(50): _, loss_val = sess.run([operation, loss], feed_dict={X: X_data, y: y_data}) if i % 5 == 0: if lines: ax.lines.remove(lines[0]) prediction_value = sess.run(y_pred, feed_dict={X: X_data}) lines = ax.plot(X_data, prediction_value, 'r-', lw=5) plt.pause(0.1) plt.pause(5)
通過簡單的定義目標函數和選擇優化算法,就可以開始訓練我的模型了。
結果我并沒有親手實現梯度下降算法,就達到了訓練樣本的目的。開發人員可以只關注模型本身,剩下的事情 TensorFlow 幫你搞定的妥妥的!這只是小試牛刀,TensorFlow 可以訓練更加復雜的模型:循環神經網絡,卷積神經網絡,遞歸神經網絡等等。
TensorFlow 提供了一個內置的可視化工具叫做 TensorBoard。有了 TensorBoard 可以更方便 TensorFlow 程序的理解、調試與優化。你可以用 TensorBoard 來展現你的 TensorFlow 圖像,繪制圖像生成的定量指標圖以及附加數據。
通過簡單的改寫,我就可以在上面的例子中使用TensorBoard了:
import tensorflow as tf import numpy as np # 定義輸入數據 X_data = np.linspace(-1, 1, 100) noise = np.random.normal(0, 0.5, 100) y_data = 5 * X_data + noise # 定義數據大小 n_samples = 100 # 轉換成向量 X_data = np.reshape(X_data, (n_samples, 1)) y_data = np.reshape(y_data, (n_samples, 1)) with tf.name_scope("input"): # 定義占位符 X = tf.placeholder(tf.float32, shape=(None, 1)) y = tf.placeholder(tf.float32, shape=(None, 1)) # 定義學習的變量 with tf.name_scope("linear-regression"): with tf.name_scope("Weight"): W = tf.get_variable("weight", (1, 1), initializer=tf.random_normal_initializer()) with tf.name_scope("bais"): b = tf.get_variable("bais", (1,), initializer=tf.constant_initializer(0.0)) with tf.name_scope("prediction"): y_pred = tf.add(tf.matmul(X, W), b) with tf.name_scope("loss"): loss = tf.reduce_mean(tf.reduce_sum(tf.square(y - y_pred))) tf.scalar_summary("loss", loss) # 梯度下降 # 定義優化函數 with tf.name_scope("train"): opt = tf.train.GradientDescentOptimizer(0.001) operation = opt.minimize(loss) with tf.Session() as sess: merged = tf.merge_all_summaries() writer = tf.train.SummaryWriter("logs/", sess.graph) # 初始化變量 sess.run(tf.initialize_all_variables()) for i in range(50): _, loss_val = sess.run([operation, loss], feed_dict={X: X_data, y: y_data}) if i % 5 == 0: result = sess.run(merged, feed_dict={X: X_data, y: y_data}) writer.add_summary(result, i)
再次執行上面的代碼,會在logs/
子目錄下生成一個日志文件。通過在打開 TensorBoard 的時候指定日志目錄加載這個日志文件,我們就可以通過瀏覽器訪問 TensorBoard 了。
tensorboard --logdir=logs
通過 TensorBoard 我們可查看定義的模型:
同時我們也可以通過 TensorBoard 觀察我們定義的損失量loss
有沒有按照預期的收斂,收斂的過程如何:
TensorBoard 是一個很好用的工具,官網文檔有關于 TensorBoard 更為詳盡的描述。
TensorFlow 作為一款機器學習的庫,提供了類似 Numpy 數據結構,支持python
,C++
等多種語言,可以在cpu或者gpu上運行,安裝簡單,上手容易,社區活躍,文檔目前還不夠豐富,好在通俗易懂,但是目前的示例還比較少(特別是python
以外的示例)。
神經網絡和深度學習入門教程;
Jeff Dean 介紹 TensorFlow(視頻);
TensorFlow WhitePaper(PDF下載);
Google官方Blog宣布TensorFlow開源;
TensorFlow 簡化版接口 Scikit Flow;
TensorFlow 使用樣例;
TensorFlow 與 mxnet, caffe 對比 @chenrudan;
https://www.tensorflow.org/(官方文檔);
http://www.tensorfly.cn/(中文社區);
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。