TensorFlow 是一款用于數(shù)值計算的強大的開源軟件庫,特別適用于大規(guī)模機器學習的微調(diào)。 它的基本原理很簡單:首先在 Python 中定義要執(zhí)行的計算圖(例如圖 9-1),然后 TensorFlow 使用該圖并使用優(yōu)化的 C++ 代碼高效運行該圖。
最重要的是,Tensorflow 可以將圖分解為多個塊并在多個 CPU 或 GPU 上并行運行(如圖 9-2 所示)。 TensorFlow 還支持分布式計算,因此您可以在數(shù)百臺服務器上分割計算,從而在合理的時間內(nèi)在龐大的訓練集上訓練龐大的神經(jīng)網(wǎng)絡(請參閱第 12 章)。 TensorFlow 可以訓練一個擁有數(shù)百萬個參數(shù)的網(wǎng)絡,訓練集由數(shù)十億個具有數(shù)百萬個特征的實例組成。 這應該不會讓您吃驚,因為 TensorFlow 是 由Google 大腦團隊開發(fā)的,它支持谷歌的大量服務,例如 Google Cloud Speech,Google Photos 和 Google Search。
當 TensorFlow 于 2015 年 11 月開放源代碼時,已有許多深度學習的流行開源庫(表 9-1 列出了一些),公平地說,大部分 TensorFlow 的功能已經(jīng)存在于一個庫或另一個庫中。 盡管如此,TensorFlow 的整潔設計,可擴展性,靈活性和出色的文檔(更不用說谷歌的名字)迅速將其推向了榜首。 簡而言之,TensorFlow 的設計靈活性,可擴展性和生產(chǎn)就緒性,現(xiàn)有框架可以說只有其中三種可用。 這里有一些 TensorFlow 的亮點:
它不僅在 Windows,Linux 和 MacOS 上運行,而且在移動設備上運行,包括 iOS 和 Android。
它提供了一個非常簡單的 Python API,名為 TF.Learn2(tensorflow.con trib.learn),與 Scikit-Learn 兼容。正如你將會看到的,你可以用幾行代碼來訓練不同類型的神經(jīng)網(wǎng)絡。之前是一個名為 Scikit Flow(或 Skow)的獨立項目。
它還提供了另一個簡單的稱為 TF-slim(tensorflow.contrib.slim)的 API 來簡化構建,訓練和求出神經(jīng)網(wǎng)絡。
其他幾個高級 API 已經(jīng)在 TensorFlow 之上獨立構建,如Keras或Pretty Tensor。
它的主要 Python API 提供了更多的靈活性(以更高復雜度為代價)來創(chuàng)建各種計算,包括任何你能想到的神經(jīng)網(wǎng)絡結構。
它包括許多 ML 操作的高效 C ++ 實現(xiàn),特別是構建神經(jīng)網(wǎng)絡所需的 C++ 實現(xiàn)。還有一個 C++ API 來定義您自己的高性能操作。
它提供了幾個高級優(yōu)化節(jié)點來搜索最小化損失函數(shù)的參數(shù)。由于 TensorFlow 自動處理計算您定義的函數(shù)的梯度,因此這些非常易于使用。這稱為自動分解(或autodi)。
它還附帶一個名為 TensorBoard 的強大可視化工具,可讓您瀏覽計算圖表,查看學習曲線等。
Google 還推出了云服務來運行 TensorFlow 表。
最后,它擁有一支充滿熱情和樂于助人的開發(fā)團隊,以及一個不斷成長的社區(qū),致力于改善它。它是 GitHub 上最受歡迎的開源項目之一,并且越來越多的優(yōu)秀項目正在構建之上(例如,查看https://www.tensorflow.org/或https://github.com/jtoy/awesome-tensorflow)。 要問技術問題,您應該使用http://stackoverflow.com/并用tensorflow標記您的問題。您可以通過 GitHub 提交錯誤和功能請求。有關一般討論,請加入Google 小組。
在本章中,我們將介紹 TensorFlow 的基礎知識,從安裝到創(chuàng)建,運行,保存和可視化簡單的計算圖。 在構建第一個神經(jīng)網(wǎng)絡之前掌握這些基礎知識很重要(我們將在下一章中介紹)。
安裝
讓我們開始吧!假設您按照第 2 章中的安裝說明安裝了 Jupyter 和 Scikit-Learn,您可以簡單地使用pip來安裝 TensorFlow。 如果你使用virtualenv創(chuàng)建了一個獨立的環(huán)境,你首先需要激活它:
$ cd $ML_PATH #Your ML working directory(e.g., $HOME/ml)$ source env/bin/activate
下一步,安裝 Tensorflow。
$ pip3 install --upgrade tensorflow
對于 GPU 支持,你需要安裝tensorflow-gpu而不是tensorflow。具體請參見 12 章內(nèi)容。
為了測試您的安裝,請輸入一下命令。其輸出應該是您安裝的 Tensorflow 的版本號。
$ python -c 'import tensorflow; print(tensorflow.__version__)'1.0.0
創(chuàng)造第一個圖譜,然后運行它
import tensorflow as tf x = tf.Variable(3, name="x") y = tf.Variable(4, name="y") f = x*x*y + y + 2
這就是它的一切! 最重要的是要知道這個代碼實際上并不執(zhí)行任何計算,即使它看起來像(尤其是最后一行)。 它只是創(chuàng)建一個計算圖譜。 事實上,變量都沒有初始化.要求出此圖,您需要打開一個 TensorFlow 會話并使用它初始化變量并求出f。TensorFlow 會話負責處理在諸如 CPU 和 GPU 之類的設備上的操作并運行它們,并且它保留所有變量值。以下代碼創(chuàng)建一個會話,初始化變量,并求出f,然后關閉會話(釋放資源):
# way1 sess = tf.Session() sess.run(x.initializer) sess.run(y.initializer) result = sess.run(f) print(result) sess.close()
不得不每次重復sess.run() 有點麻煩,但幸運的是有一個更好的方法:
# way2 with tf.Session() as sess: x.initializer.run() y.initializer.run() result = f.eval() print(result)
在with塊中,會話被設置為默認會話。 調(diào)用x.initializer.run()等效于調(diào)用tf.get_default_session().run(x.initial),f.eval()等效于調(diào)用tf.get_default_session().run(f)。 這使得代碼更容易閱讀。 此外,會話在塊的末尾自動關閉。
你可以使用global_variables_initializer()函數(shù),而不是手動初始化每個變量。 請注意,它實際上沒有立即執(zhí)行初始化,而是在圖譜中創(chuàng)建一個當程序運行時所有變量都會初始化的節(jié)點:
# way3 # init = tf.global_variables_initializer() # with tf.Session() as sess: # init.run() # result = f.eval() # print(result)
在 Jupyter 內(nèi)部或在 Python shell 中,您可能更喜歡創(chuàng)建一個InteractiveSession。 與常規(guī)會話的唯一區(qū)別是,當創(chuàng)建InteractiveSession時,它將自動將其自身設置為默認會話,因此您不需要使用模塊(但是您需要在完成后手動關閉會話):
# way4 init = tf.global_variables_initializer() sess = tf.InteractiveSession() init.run() result = f.eval() print(result) sess.close()
TensorFlow 程序通常分為兩部分:第一部分構建計算圖譜(這稱為構造階段),第二部分運行它(這是執(zhí)行階段)。 建設階段通常構建一個表示 ML 模型的計算圖譜,然后對其進行訓練,計算。 執(zhí)行階段通常運行循環(huán),重復地求出訓練步驟(例如,每個小批次),逐漸改進模型參數(shù)。
管理圖譜
您創(chuàng)建的任何節(jié)點都會自動添加到默認圖形中:
>>> x1 = tf.Variable(1) >>> x1.graph is tf.get_default_graph() True
在大多數(shù)情況下,這是很好的,但有時您可能需要管理多個獨立圖形。 您可以通過創(chuàng)建一個新的圖形并暫時將其設置為一個塊中的默認圖形,如下所示:
>>> graph = tf.Graph() >>> with graph.as_default(): ... x2 = tf.Variable(2) ... >>> x2.graph is graph True >>> x2.graph is tf.get_default_graph() False
在 Jupyter(或 Python shell)中,通常在實驗時多次運行相同的命令。 因此,您可能會收到包含許多重復節(jié)點的默認圖形。 一個解決方案是重新啟動 Jupyter 內(nèi)核(或 Python shell),但是一個更方便的解決方案是通過運行tf.reset_default_graph()來重置默認圖。
節(jié)點值的生命周期
求出節(jié)點時,TensorFlow 會自動確定所依賴的節(jié)點集,并首先求出這些節(jié)點。 例如,考慮以下代碼:
# w = tf.constant(3) # x = w + 2 # y = x + 5 # z = x * 3 # with tf.Session() as sess: # print(y.eval()) # print(z.eval())
首先,這個代碼定義了一個非常簡單的圖。然后,它啟動一個會話并運行圖來求出y:TensorFlow 自動檢測到y(tǒng)取決于x,它取決于w,所以它首先求出w,然后x,然后y,并返回y的值。最后,代碼運行圖來求出z。同樣,TensorFlow 檢測到它必須首先求出w和x。重要的是要注意,它不會復用以前的w和x的求出結果。簡而言之,前面的代碼求出w和x兩次。所有節(jié)點值都在圖運行之間刪除,除了變量值,由會話跨圖形運行維護(隊列和讀者也保持一些狀態(tài))。變量在其初始化程序運行時啟動其生命周期,并且在會話關閉時結束。如果要有效地求出y和z,而不像之前的代碼那樣求出w和x兩次,那么您必須要求 TensorFlow 在一個圖形運行中求出y和z,如下面的代碼所示:
# with tf.Session() as sess: # y_val, z_val = sess.run([y, z]) # print(y_val) # 10 # print(z_val) # 15
在單進程 TensorFlow 中,多個會話不共享任何狀態(tài),即使它們復用同一個圖(每個會話都有自己的每個變量的副本)。 在分布式 TensorFlow 中,變量狀態(tài)存儲在服務器上,而不是在會話中,因此多個會話可以共享相同的變量。
-
機器學習
+關注
關注
66文章
8406瀏覽量
132558 -
python
+關注
關注
56文章
4792瀏覽量
84627 -
tensorflow
+關注
關注
13文章
329瀏覽量
60527
原文標題:【翻譯】Sklearn 與 TensorFlow 機器學習實用指南 —— 第9章 (上)啟動并運行TensorFlow
文章出處:【微信號:AI_shequ,微信公眾號:人工智能愛好者社區(qū)】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論