摘要:簡介是目前最流行的深度學習框架。代表一個數學運算,簡稱,這里面包括了深度學習模型經常需要使用的。這也是名字的由來,表示多維數組在中流動。這一步指定求解器,并設定求解器的最小化目標為損失。
簡介
TensorFlow是目前最流行的深度學習框架。我們先引用一段官網對于TensorFlow的介紹,來看一下Google對于它這個產品的定位。
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.
上文并沒有提到大紅大紫的Deep Learning,而是聚焦在一個更廣泛的科學計算應用領域。引文的關鍵詞有:
Numerical Computation:應用領域是數值計算,所以TensorFlow不僅能支持Deep Learning,還支持其他機器學習算法,甚至包括更一般的數值計算任務(如求導、積分、變換等)。
Data Flow Graph:用graph來描述一個計算任務。
Node:代表一個數學運算(mathmatical operations,簡稱ops),這里面包括了深度學習模型經常需要使用的ops。
Edge:指向node的edge代表這個node的輸入,從node引出來的edge代表這個node的輸出,輸入和輸出都是multidimensional data arrays,即多維數組,在數學上又稱之為tensor。這也是TensorFlow名字的由來,表示多維數組在graph中流動。
CPUs/GPUs:支持CPU和GPU兩種設備,支持單機和分布式計算。
TensorFlow提供多種語言的支持,其中支持最完善的是Python語言,因此本文將聚焦于Python API。
Hello World下面這段代碼來自于TensorFlow官網的Get Started,展示了TensorFlow訓練線性回歸模型的能力。
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]
下面我們來剖析一下關鍵代碼。TensorFlow的代碼往往由兩個部分組成:
A construction phase, that assembles a graph, and an execution phase that uses a session to execute ops in the graph.
Session是一個類,作用是把graph ops部署到Devices(CPUs/GPUs),并提供具體執行這些op的方法。
為什么要這么設計呢?考慮到Python運行性能較低,我們在執行numerical computing的時候,都會盡量使用非python語言編寫的代碼,比如使用NumPy這種預編譯好的C代碼來做矩陣運算。在Python內部計算環境和外部計算環境(如NumPy)切換需要花費的時間稱為overhead cost。對于一個簡單運算,比如矩陣運算,從Python環境切換到Numpy,Numpy運算得到結果,再從Numpy切回Python,這個成本,比純粹在Python內部做同類運算的成本要低很多。但是,一個復雜數值運算由多個基本運算組合而成,如果每個基本運算來一次這種環境切換,overhead cost就不可忽視了。為了減少來回的環境切換,TensorFlow的做法是,先在Python內定義好整個Graph,然后在Python外運行整個完整的Graph。因此TensorFlow的代碼結構也就對應為兩個階段了。
Build GraphW = tf.Variable(tf.random_uniform([1], -1.0, 1.0)) b = tf.Variable(tf.zeros([1]))
tf.Variable是TensorFlow的一個類,是取值可變的Tensor,構造函數的第一個參數是初始值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)是一個op,用于生成取值全是0的Constant Value Tensor。
tf.random_uniform(shape, minval=0, maxval=None, dtype=tf.float32, seed=None, name=None)是一個op,用于生成服從uniform distribution的Random Tensor。
y = W * x_data + b
y是線性回歸運算產生的Tensor。運算符*和+,等價為tf.multiple()和tf.add()這兩個TensorFlow提供的數學類ops。tf.multiple()的輸入是W和x_data;W是Variable,屬于Tensor,可以直接作為op的輸入;x_data是numpy的多維數組ndarray,TensorFlow的ops接收到ndarray的輸入時,會將其轉化為tensor。tf.multiple()的輸出是一個tensor,和b一起交給optf.add(),得到輸出結果y。
至此,線性回歸的模型已經建立好,但這只是Graph的一部分,還需要定義損失。
loss = tf.reduce_mean(tf.square(y - y_data))
loss是最小二乘法需要的目標函數,是一個Tensor,具體的op不再贅述。
optimizer = tf.train.GradientDescentOptimizer(0.5) train = optimizer.minimize(loss)
這一步指定求解器,并設定求解器的最小化目標為損失。train代表了求解器執行一次的輸出Tensor。這里我們使用了梯度下降求解器,每一步會對輸入loss求一次梯度,然后將loss里Variable類型的Tensor按照梯度更新取值。
init = tf.global_variables_initializer()
Build Graph階段的代碼,只是在Python內定義了Graph的結構,并不會真正執行。在Launch Graph階段,所有的變量要先進行初始化。每個變量可以多帶帶初始化,但這樣做有些繁瑣,所以TensorFlow提供了一個方便的函數global_variables_initializer()可以在graph中添加一個初始化所有變量的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)
在進行任何計算以前,先給Variable賦初始值。
for step in range(201): sess.run(train)
train操作對應梯度下降法的一步迭代。當step為0時,train里的variable取值為初始值,根據初始值可以計算出梯度,然后將初始值根據梯度更新為更好的取值;當step為1時,train里的variable為上一步更新的值,根據這一步的值可以計算出一個新的梯度,然后將variable的取值更新為更好的取值;以此類推,直到達到最大迭代次數。
print(step, sess.run(W), sess.run(b))
如果我們將sess.run()賦值給Python環境的變量,或者傳給Python環境的print,可以fetch執行op的輸出Tensor取值,這些取值會轉化為numpy的ndarray結構。因此,這就需要一次環境的切換,會增加overhead cost。所以我們一般會每隔一定步驟才fetch一下計算結果,以減少時間開銷。
基礎練習:線性模型TensorFlow是一個面向數值計算的通用平臺,可以方便地訓練線性模型。下面這幾篇文章采用TensorFlow完成Andrew Ng主講的Deep Learning課程練習題,提供了整套源碼。
線性回歸
多元線性回歸
邏輯回歸
進階練習1:深度學習TensorFlow雖然是面向通用的數值計算,但是對深度學習的支持是它最大的特色,也是它能夠引爆業界獲得目前這么大的流行度的主要原因。下面這幾篇文章采用TensorFlow對MNIST進行建模,涵蓋了Deep Learning中最重要的兩類模型:卷積神經網絡CNN和循環神經網絡RNN。
MNIST數據集
Softmax Regression
CNN
RNN
進階練習2:TensorBoardTensorFlow安裝時自帶了一個TensorBoard,可以對數據集進行可視化地探索分析,可以對學習過程進行可視化,可以對Graph進行可視化,對于我們分析問題和改進模型有極大的幫助。
Embeddings
Tensor與Graph可視化
部署分布式TensorFlow
讀取文件
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44272.html
摘要:七強化學習玩轉介紹了使用創建來玩游戲將連續的狀態離散化。包括輸入輸出獨熱編碼與損失函數,以及正確率的驗證。 用最白話的語言,講解機器學習、神經網絡與深度學習示例基于 TensorFlow 1.4 和 TensorFlow 2.0 實現 中文文檔 TensorFlow 2 / 2.0 官方文檔中文版 知乎專欄 歡迎關注我的知乎專欄 https://zhuanlan.zhihu.com/...
摘要:貢獻者飛龍版本最近總是有人問我,把這些資料看完一遍要用多長時間,如果你一本書一本書看的話,的確要用很長時間。為了方便大家,我就把每本書的章節拆開,再按照知識點合并,手動整理了這個知識樹。 Special Sponsors showImg(https://segmentfault.com/img/remote/1460000018907426?w=1760&h=200); 貢獻者:飛龍版...
閱讀 1113·2021-11-19 09:40
閱讀 969·2021-11-12 10:36
閱讀 1259·2021-09-22 16:04
閱讀 3105·2021-09-09 11:39
閱讀 1266·2019-08-30 10:51
閱讀 1882·2019-08-30 10:48
閱讀 1221·2019-08-29 16:30
閱讀 464·2019-08-29 12:37