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