摘要:簡(jiǎn)介是目前最流行的深度學(xué)習(xí)框架。代表一個(gè)數(shù)學(xué)運(yùn)算,簡(jiǎn)稱,這里面包括了深度學(xué)習(xí)模型經(jīng)常需要使用的。這也是名字的由來(lái),表示多維數(shù)組在中流動(dòng)。這一步指定求解器,并設(shè)定求解器的最小化目標(biāo)為損失。
簡(jiǎn)介
TensorFlow是目前最流行的深度學(xué)習(xí)框架。我們先引用一段官網(wǎng)對(duì)于TensorFlow的介紹,來(lái)看一下Google對(duì)于它這個(gè)產(chǎn)品的定位。
TensorFlow? is an open source software library for numerical computation using data flow graphs. Nodes in the graph represent mathematical operations, while the graph edges represent the multidimensional data arrays (tensors) communicated between them. The flexible architecture allows you to deploy computation to one or more CPUs or GPUs in a desktop, server, or mobile device with a single API.
上文并沒(méi)有提到大紅大紫的Deep Learning,而是聚焦在一個(gè)更廣泛的科學(xué)計(jì)算應(yīng)用領(lǐng)域。引文的關(guān)鍵詞有:
Numerical Computation:應(yīng)用領(lǐng)域是數(shù)值計(jì)算,所以TensorFlow不僅能支持Deep Learning,還支持其他機(jī)器學(xué)習(xí)算法,甚至包括更一般的數(shù)值計(jì)算任務(wù)(如求導(dǎo)、積分、變換等)。
Data Flow Graph:用graph來(lái)描述一個(gè)計(jì)算任務(wù)。
Node:代表一個(gè)數(shù)學(xué)運(yùn)算(mathmatical operations,簡(jiǎn)稱ops),這里面包括了深度學(xué)習(xí)模型經(jīng)常需要使用的ops。
Edge:指向node的edge代表這個(gè)node的輸入,從node引出來(lái)的edge代表這個(gè)node的輸出,輸入和輸出都是multidimensional data arrays,即多維數(shù)組,在數(shù)學(xué)上又稱之為tensor。這也是TensorFlow名字的由來(lái),表示多維數(shù)組在graph中流動(dòng)。
CPUs/GPUs:支持CPU和GPU兩種設(shè)備,支持單機(jī)和分布式計(jì)算。
TensorFlow提供多種語(yǔ)言的支持,其中支持最完善的是Python語(yǔ)言,因此本文將聚焦于Python API。
Hello World下面這段代碼來(lái)自于TensorFlow官網(wǎng)的Get Started,展示了TensorFlow訓(xùn)練線性回歸模型的能力。
import tensorflow as tf import numpy as np # Create 100 phony x, y data points in NumPy, y = x * 0.1 + 0.3 x_data = np.random.rand(100).astype(np.float32) y_data = x_data * 0.1 + 0.3 # Try to find values for W and b that compute y_data = W * x_data + b # (We know that W should be 0.1 and b 0.3, but TensorFlow will # figure that out for us.) W = tf.Variable(tf.random_uniform([1], -1.0, 1.0)) b = tf.Variable(tf.zeros([1])) y = W * x_data + b # Minimize the mean squared errors. loss = tf.reduce_mean(tf.square(y - y_data)) optimizer = tf.train.GradientDescentOptimizer(0.5) train = optimizer.minimize(loss) # Before starting, initialize the variables. We will "run" this first. init = tf.global_variables_initializer() # Launch the graph. sess = tf.Session() sess.run(init) # Fit the line. for step in range(201): sess.run(train) if step % 20 == 0: print(step, sess.run(W), sess.run(b)) # Learns best fit is W: [0.1], b: [0.3]
下面我們來(lái)剖析一下關(guān)鍵代碼。TensorFlow的代碼往往由兩個(gè)部分組成:
A construction phase, that assembles a graph, and an execution phase that uses a session to execute ops in the graph.
Session是一個(gè)類(lèi),作用是把graph ops部署到Devices(CPUs/GPUs),并提供具體執(zhí)行這些op的方法。
為什么要這么設(shè)計(jì)呢?考慮到Python運(yùn)行性能較低,我們?cè)趫?zhí)行numerical computing的時(shí)候,都會(huì)盡量使用非python語(yǔ)言編寫(xiě)的代碼,比如使用NumPy這種預(yù)編譯好的C代碼來(lái)做矩陣運(yùn)算。在Python內(nèi)部計(jì)算環(huán)境和外部計(jì)算環(huán)境(如NumPy)切換需要花費(fèi)的時(shí)間稱為overhead cost。對(duì)于一個(gè)簡(jiǎn)單運(yùn)算,比如矩陣運(yùn)算,從Python環(huán)境切換到Numpy,Numpy運(yùn)算得到結(jié)果,再?gòu)腘umpy切回Python,這個(gè)成本,比純粹在Python內(nèi)部做同類(lèi)運(yùn)算的成本要低很多。但是,一個(gè)復(fù)雜數(shù)值運(yùn)算由多個(gè)基本運(yùn)算組合而成,如果每個(gè)基本運(yùn)算來(lái)一次這種環(huán)境切換,overhead cost就不可忽視了。為了減少來(lái)回的環(huán)境切換,TensorFlow的做法是,先在Python內(nèi)定義好整個(gè)Graph,然后在Python外運(yùn)行整個(gè)完整的Graph。因此TensorFlow的代碼結(jié)構(gòu)也就對(duì)應(yīng)為兩個(gè)階段了。
Build GraphW = tf.Variable(tf.random_uniform([1], -1.0, 1.0)) b = tf.Variable(tf.zeros([1]))
tf.Variable是TensorFlow的一個(gè)類(lèi),是取值可變的Tensor,構(gòu)造函數(shù)的第一個(gè)參數(shù)是初始值initial_value。
initial_value: A Tensor, or Python object convertible to a Tensor, which is the initial value for the Variable.
tf.zeros(shape, dtype=tf.float32, name=None)是一個(gè)op,用于生成取值全是0的Constant Value Tensor。
tf.random_uniform(shape, minval=0, maxval=None, dtype=tf.float32, seed=None, name=None)是一個(gè)op,用于生成服從uniform distribution的Random Tensor。
y = W * x_data + b
y是線性回歸運(yùn)算產(chǎn)生的Tensor。運(yùn)算符*和+,等價(jià)為tf.multiple()和tf.add()這兩個(gè)TensorFlow提供的數(shù)學(xué)類(lèi)ops。tf.multiple()的輸入是W和x_data;W是Variable,屬于Tensor,可以直接作為op的輸入;x_data是numpy的多維數(shù)組ndarray,TensorFlow的ops接收到ndarray的輸入時(shí),會(huì)將其轉(zhuǎn)化為tensor。tf.multiple()的輸出是一個(gè)tensor,和b一起交給optf.add(),得到輸出結(jié)果y。
至此,線性回歸的模型已經(jīng)建立好,但這只是Graph的一部分,還需要定義損失。
loss = tf.reduce_mean(tf.square(y - y_data))
loss是最小二乘法需要的目標(biāo)函數(shù),是一個(gè)Tensor,具體的op不再贅述。
optimizer = tf.train.GradientDescentOptimizer(0.5) train = optimizer.minimize(loss)
這一步指定求解器,并設(shè)定求解器的最小化目標(biāo)為損失。train代表了求解器執(zhí)行一次的輸出Tensor。這里我們使用了梯度下降求解器,每一步會(huì)對(duì)輸入loss求一次梯度,然后將loss里Variable類(lèi)型的Tensor按照梯度更新取值。
init = tf.global_variables_initializer()
Build Graph階段的代碼,只是在Python內(nèi)定義了Graph的結(jié)構(gòu),并不會(huì)真正執(zhí)行。在Launch Graph階段,所有的變量要先進(jìn)行初始化。每個(gè)變量可以多帶帶初始化,但這樣做有些繁瑣,所以TensorFlow提供了一個(gè)方便的函數(shù)global_variables_initializer()可以在graph中添加一個(gè)初始化所有變量的op。
Launch GraphWhen you launch the graph, variables have to be explicitly initialized before you can run Ops that use their value. All variables are automatically collected in the graph where they are created. By default, the constructor adds the new variable to the graph collection GraphKeys.GLOBAL_VARIABLES. The convenience function global_variables() returns the contents of that collection. The most common initialization pattern is to use the convenience function global_variables_initializer() to add an Op to the graph that initializes all the variables.
sess.run(init)
在進(jìn)行任何計(jì)算以前,先給Variable賦初始值。
for step in range(201): sess.run(train)
train操作對(duì)應(yīng)梯度下降法的一步迭代。當(dāng)step為0時(shí),train里的variable取值為初始值,根據(jù)初始值可以計(jì)算出梯度,然后將初始值根據(jù)梯度更新為更好的取值;當(dāng)step為1時(shí),train里的variable為上一步更新的值,根據(jù)這一步的值可以計(jì)算出一個(gè)新的梯度,然后將variable的取值更新為更好的取值;以此類(lèi)推,直到達(dá)到最大迭代次數(shù)。
print(step, sess.run(W), sess.run(b))
如果我們將sess.run()賦值給Python環(huán)境的變量,或者傳給Python環(huán)境的print,可以fetch執(zhí)行op的輸出Tensor取值,這些取值會(huì)轉(zhuǎn)化為numpy的ndarray結(jié)構(gòu)。因此,這就需要一次環(huán)境的切換,會(huì)增加overhead cost。所以我們一般會(huì)每隔一定步驟才fetch一下計(jì)算結(jié)果,以減少時(shí)間開(kāi)銷(xiāo)。
基礎(chǔ)練習(xí):線性模型TensorFlow是一個(gè)面向數(shù)值計(jì)算的通用平臺(tái),可以方便地訓(xùn)練線性模型。下面這幾篇文章采用TensorFlow完成Andrew Ng主講的Deep Learning課程練習(xí)題,提供了整套源碼。
線性回歸
多元線性回歸
邏輯回歸
進(jìn)階練習(xí)1:深度學(xué)習(xí)TensorFlow雖然是面向通用的數(shù)值計(jì)算,但是對(duì)深度學(xué)習(xí)的支持是它最大的特色,也是它能夠引爆業(yè)界獲得目前這么大的流行度的主要原因。下面這幾篇文章采用TensorFlow對(duì)MNIST進(jìn)行建模,涵蓋了Deep Learning中最重要的兩類(lèi)模型:卷積神經(jīng)網(wǎng)絡(luò)CNN和循環(huán)神經(jīng)網(wǎng)絡(luò)RNN。
MNIST數(shù)據(jù)集
Softmax Regression
CNN
RNN
進(jìn)階練習(xí)2:TensorBoardTensorFlow安裝時(shí)自帶了一個(gè)TensorBoard,可以對(duì)數(shù)據(jù)集進(jìn)行可視化地探索分析,可以對(duì)學(xué)習(xí)過(guò)程進(jìn)行可視化,可以對(duì)Graph進(jìn)行可視化,對(duì)于我們分析問(wèn)題和改進(jìn)模型有極大的幫助。
Embeddings
Tensor與Graph可視化
部署分布式TensorFlow
讀取文件
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/44272.html
摘要:七強(qiáng)化學(xué)習(xí)玩轉(zhuǎn)介紹了使用創(chuàng)建來(lái)玩游戲?qū)⑦B續(xù)的狀態(tài)離散化。包括輸入輸出獨(dú)熱編碼與損失函數(shù),以及正確率的驗(yàn)證。 用最白話的語(yǔ)言,講解機(jī)器學(xué)習(xí)、神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí)示例基于 TensorFlow 1.4 和 TensorFlow 2.0 實(shí)現(xiàn) 中文文檔 TensorFlow 2 / 2.0 官方文檔中文版 知乎專欄 歡迎關(guān)注我的知乎專欄 https://zhuanlan.zhihu.com/...
摘要:貢獻(xiàn)者飛龍版本最近總是有人問(wèn)我,把這些資料看完一遍要用多長(zhǎng)時(shí)間,如果你一本書(shū)一本書(shū)看的話,的確要用很長(zhǎng)時(shí)間。為了方便大家,我就把每本書(shū)的章節(jié)拆開(kāi),再按照知識(shí)點(diǎn)合并,手動(dòng)整理了這個(gè)知識(shí)樹(shù)。 Special Sponsors showImg(https://segmentfault.com/img/remote/1460000018907426?w=1760&h=200); 貢獻(xiàn)者:飛龍版...
閱讀 1128·2021-11-19 09:40
閱讀 975·2021-11-12 10:36
閱讀 1271·2021-09-22 16:04
閱讀 3114·2021-09-09 11:39
閱讀 1273·2019-08-30 10:51
閱讀 1891·2019-08-30 10:48
閱讀 1230·2019-08-29 16:30
閱讀 475·2019-08-29 12:37