您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關如何進行TensorFlow概覽分析,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
由于公司產品的變化,我需要編寫一些TensorFlow的代碼來測試我們產品的深度學習模塊。 最近也在學習TensorFlow。 所以先暫停卷積神經網(wǎng)絡部分的更新。開始寫一些tensorflow的東西。 話說白話了這么久的理論~~ 終于可以跟大家上點代碼了。 對于tensorflow,下面我都簡稱tf
這個我沒細研究,直接docker hub上找到TensorFlow的鏡像下載,然后啟動。 或者大家也可以搭建一個集成了TensorFlow的notebook
先上代碼。
import tensorflow as tf
x = tf.constant([[0.7,0.9]])
y_ = tf.constant([[1.0]])
w1 = tf.Variable(tf.random_normal([2,3], stddev=1, seed=1))
w2 = tf.Variable(tf.random_normal([3,1], stddev=1, seed=1))
b1 = tf.Variable(tf.zeros([3]))
b2 = tf.Variable(tf.zeros([1]))
a = tf.nn.relu(tf.matmul(x,w1) + b1)
y = tf.matmul(a, w2) + b2
cost = tf.nn.sigmoid_cross_entropy_with_logits(logits=y, labels=y_, name=None)
train_op = tf.train.GradientDescentOptimizer(0.01).minimize(cost)
with tf.Session() as sess:
init = tf.initialize_all_variables()
sess.run(init)
for i in range(100):
sess.run(train_op)
print(sess.run(w1))
print(sess.run(w2))
這是模擬一個最簡單的神經網(wǎng)絡的代碼。 只有一條樣本兩個特征維度(只是拿來做demo的), 隱藏層使用relu作為激活函數(shù)。有3個神經元,整個神經網(wǎng)絡的目的是做二分類,所以輸出層的激活函數(shù)是sigmoid,損失函數(shù)(成本函數(shù))也是sigmoid的損失函數(shù)。 前向傳播算法是使用矩陣乘法實現(xiàn)。 反向傳播是用tf提供的標準的梯度下降,學習率為0.01,訓練輪數(shù)為100. 沒有加正則。 我們查看經過訓練后隱藏層和輸出層的權重信息如下:
如果有同學用過類似Keras這種高度封裝API的神經網(wǎng)絡庫的話,就會發(fā)現(xiàn)tf的代碼簡直太復雜太繁瑣了。 上面只是最簡單的神經網(wǎng)絡,沒加正則沒用mini batch甚至樣本只有一個,連實現(xiàn)前向傳播都得自己寫代碼。 實際應用的話代碼會更復雜很多。 但是使用Keras可能就是幾行代碼的事,學習難度小很多。 那我們?yōu)槭裁催€要使用tf呢? 我知道的好處是tf靈活,支持分布式執(zhí)行,比如tf on k8s現(xiàn)在很火。是現(xiàn)在做深度學習平臺的不二選擇。 據(jù)我所知現(xiàn)在各大廠的深度學習平臺都是用tf弄出來的。 當然對于我來說,學習tf的目的只有一個,就是測試我們自己的深度學習平臺。
tensorflow = tensor + flow。 其中tensor是tf的數(shù)據(jù)結構,flow代表著tf的計算框架----計算圖
tensor,又名張量。在tf中所有的數(shù)據(jù)都是以張量的形式表現(xiàn)的。從功能上來看,張量是一個多維數(shù)組。比如在我們上面的demo中,我們用來模擬樣本數(shù)據(jù)的x 和對應的label y_都是tensor。但tensor在tf里的實現(xiàn)并不是直接采用數(shù)組的或其他任何已知的數(shù)據(jù)結構。 如果說類似的話,tensor的機制有點像spark中RDD的惰性計算, 在spark中我們的計算流是惰性的,在代碼執(zhí)行每一個transform的時候并不會真正的執(zhí)行,而是把計算過程記錄下來,等到執(zhí)行到action的時候才會真正的執(zhí)行。 這是惰性計算。 tensor以及tensor的計算表現(xiàn)也類似。 當我們執(zhí)行以下代碼時,并不會得到真正的結果,而是會得到一個結果的引用。
我們在tf聲明了兩個常量, a和b。 他們是tf中的tensor(張量)。 當我們執(zhí)行了一個加法操作的時候,打印出的結果并不是他們的計算結果。 而是一個tensor的結果。其中打印的第一個字段:add_35:0 表示這個節(jié)點add_35, 0 是說c這個張量是節(jié)點add_35的第一個輸出。 打印的第二個字段是shape,也就是維度。 說明這個tensor是幾乘幾的矩陣。 我們的例子中是shape=(1,2) 表明這是一個1*2的矩陣。 第三個字段是tensor的類型,我們這里是float32類型。
如果用畫圖的方式表示出來,大概就是下面這樣的
上圖中的每一個節(jié)點都是一個運算,而每一條邊代表了計算之間的依賴關系,一個運算的輸入依賴于另一個運算的輸出。 這就是tf的計算圖,也就是tensorflow中flow代表的意思。 在tf遇到真正需要執(zhí)行的那段代碼之前, 所有的計算都不會觸發(fā),取而代之的是tf在內部維護一個計算圖。 在遇到需要執(zhí)行的時候, 按照計算圖依次進行計算。
剛才我們講了tf是如何組織數(shù)據(jù)和計算圖的。 它不會真正的執(zhí)行,而是等待某個時機的到來,按照計算圖依次進行計算。 那么這個時機就是會話。 如下:
可以看到上圖中我們使用python的with as大法管理tf 的會話聲明周期。 在里面我們并沒有去管a和b,相反我們只用了一行代碼print(session.run(c)) 就打印出了計算結果。 正如我之前所說,tf會維護一個計算圖。 當我們真正的去計算c的時候。它會按照計算圖從頭計算一遍。
關于如何進行TensorFlow概覽分析就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。