Tensorflow介紹

我在90年代有很好的樂趣寫神經網絡軟件,我急於嘗試使用Tensorflow創建一些。

谷歌的機器智能框架現在是新的熱門。當Tensorflow在覆盆子PI上安裝時,使用它變得非常容易。在短時間內,我製作了一個在二進製文件中計算的神經網絡。所以我以為我會通過我到目前為止學到的東西。希望這使得任何想要嘗試它的人,或者對於只需要對神經網絡有所了解的人來說,它更容易。

什麼是tensorflow?

要引用Tensorflow網站,Tensorflow是一個“使用數據流圖的數字計算開源軟件庫”。 “數據流圖”是什麼意思?好吧,這是真棒的部分。但在我們可以回答之前,我們需要談談一個簡單的神經網絡的結構。

二進制計數器神經網絡
神經網絡的基礎知識

簡單的神經網絡具有一些輸入單元,輸入到達。它也有隱藏的單位,所謂的,因為從用戶的角度來看,他們就是隱藏的。並且有輸出單元,我們從中獲得結果。關閉側面也是偏置單元,這些單元在那裡有助於控制隱藏和輸出單元發出的值。連接所有這些單元是一堆權重,這只是數字,每個單位都與兩個單位相關聯。

我們將智能灌輸到這個神經網絡的方式是為所有這些權重分配值。這就是培訓神經網絡的所作的,找到那些權重的合適值。一旦培訓,在我們的示例中,我們將分別將輸入單元設置為0,0和0,TensorFlow將與之間的所有內容進行任何內容,輸出單元將神奇地包含二進制數字0,0和分別為1。如果你錯過了,它知道二元000後的下一個數字是001.對於001,它應該吐出010,所以最多111,其中它會吐出000.一旦那些重量適當地設置,它’LL知道如何計算。

二進制計數器神經網絡與矩陣
“運行”神經網絡的一步是通過其輸入單元的值將每個權重的值乘以,然後將結果存儲在相關聯的隱藏單元中。

我們可以重繪單位和權重用作為陣列,或者在Python中所謂的列表。來自數學立場,他們是矩陣。我們只重新繪製了圖中的一部分。將輸入矩陣乘以權重矩陣涉及簡單的矩陣乘法,從而產生五個元素隱藏矩陣/列表/數組。

從矩陣到張量

在Tensorflow中,這些列表稱為Tensors。並且矩陣乘法步驟稱為操作,或者程序員中的操作,如果您計劃讀取TensorFlow文檔,則必須習慣使用。進一步拍攝,整個神經網絡是一個張量的集合和操作的操作。完全彌補了一個圖表。

二進制櫃檯的完整圖表

二層擴張

這裡顯示的是快照所採取的Tensorboard,一種用於可視化圖形的工具,以及在訓練期間和之後檢查張量值。張量是線條,寫在線上是張量的尺寸。連接張量是所有操作系統,儘管可以雙擊您所看到的一些東西,以便在第二個快照中為Dialls1所做的更詳細信息,以便更詳細地展開。

在非常底部是x,我們為佔位符op提供的名稱,允許我們為輸入張量提供值。從它到左側的線路是輸入張量。繼續遵循這一點,您會找到Matmul OP,該OP與該輸入張量和扭矩一起乘法,這是導致Matmul OP的另一行。這種張量代表了重量。

所有這一切只是為了讓您感受到一個圖表及其張力和何種行為,讓您更好地了解我們的意思是Tensorflow是“使用數據流圖的數字計算的軟件庫”。但為什麼我們想創建這些圖表?

為什麼創建圖表?

目前穩定的API是Python一種解釋語言的API。神經網絡是計算密集型的,並且大量可以有數千甚至數百萬的重量。通過解釋每一步的計算將永遠存在。

因此,我們改為創建由張量和操作組成的圖表,描述了神經網絡的佈局,所有數學操作,甚至變量的初始值。只有在我們創建此圖之後,我們才會將其傳遞給Tensorflow調用會話。這被稱為延遲執行。會話使用非常有效的代碼運行圖形。不僅如此,而且許多操作(例如矩陣乘法)都是可以在支持的GPU(圖形處理單元)上完成的操作,並且會話將為您執行此操作。此外,tensorflow是built能夠在多台機器和/或GPU上分發處理。給它完整的圖形允許它做到這一點。

創建二進制計數器圖

這是我們二進制計數器神經網絡的代碼。您可以在此GitHub頁面上找到完整的源代碼。請注意,它有用於保存與Tensorboard一起使用的信息中的其他代碼。

我們將從代碼開始,以創建Tensors和Ops的圖形。

導入Tensorflow作為TF
sess = tf.interactivessession()

num_inputs = 3.
num_hidden = 5
num_outputs = 3.

我們首先導入TensorFlow模塊,創建一個稍後使用的會話,並使我們的代碼更加理解,我們創建了一些包含我們網絡中單位數的變量。

X = TF.PlaceHloveer(tf.float32,shape = [none,num_inputs],name =’x’)
y_ = tf.placeholder(tf.float32,shape = [none,num_outputs],name =’y_’)

然後我們為我們的輸入和輸出單位創建佔位符。佔位符是一個tensorflow op,用於稍後將提供價值的東西。 x和y_現在是一個新圖表中的張量,每個都有一個與之關聯的佔位符。

您可能想知道為什麼我們將形狀定義為[無,num_inputs]和[none,num_outputs],二維列表,以及為什麼第一維度為何?在上面的神經網絡概述中,看起來我們會一次給它一個輸入並訓練它以產生給定的輸出。它更有效,但是如果我們一次給它多個輸入/輸出對,則為批次出現。第一維度用於每批中的輸入/輸出對的數量。我們不會知道批次有多少批次,直到我們稍後再給出。事實上,我們正​​在使用相同的圖表進行培訓,測試和實際使用,因此批處理大小並不總是相同的。因此,我們現在使用Python佔位符對象無論是第一個維度的大小。

w_fc1 = tf.trungated_normal([num_inputs,num_hidden],平均值= 0.5,stddev = 0.707)
w_fc1 = tf.variable(w_fc1,name =’w_fc1’)

b_fc1 = tf.trungated_normal([num_hidden],平均值= 0.5,stddev = 0.707)
b_fc1 = tf.variable(b_fc1,name =’b_fc1’)

h_fc1 = tf.nn.relu(tf.matmul(x,w_fc1)+ b_fc1)

接下來是創建一個神經網絡圖之一:權重W_FC1,偏置B_FC1和隱藏單元H_FC1。 “FC”是“完全連接”的慣例,因為權重將每個輸入單元連接到每個隱藏的單元。

tf.trungated_normal結果在稍後將歸一代的OPS和TCORS分配給所有權重。

在這種情況下,將變量操作有一個初始化,隨機數,並保持多個運行的數據。他們也很方便地將神經網絡保存到文件,一旦培訓,您想要做的事情。

您可以使用Matmul OP看到我們將在哪裡進行矩陣乘法。我們還插入一個添加OP,它將增加偏置權重。 Relu Op執行我們所謂的激活功能。矩陣乘法和添加是線性操作。有一個非常有限數量的神經網絡可以使用即可使用的線性操作學習。激活功能提供了一些非線性。在Relu激活函數的情況下,它將任何少於零到零的任何值,並且所有其他值都保持不變。相信與否,這樣做會開闢一個可以學習的其他世界的世界。

w_fc2 = tf.trungated_normal([num_hidden,num_outputs],平均值= 0.5,stddev = 0.707)
w_fc2 = tf.variable(w_fc2,name =’w_fc2’)

b_fc2 = tf.trungated_normal([num_outputs],平均值= 0.5,stddev = 0.707)
b_fc2 = tf.variable(b_fc2,name =’b_fc2’)

y = tf.matmul(h_fc1,w_fc2)+ b_fc2

第2層的權重和偏置被設置為與層相同,但輸出層不同。我們再次執行矩陣乘法,這次乘以權重和隱藏單元,然後添加偏置權重。我們向下一點代碼留下了激活函數。

結果= tf.sigmoid(y,name =’結果’)

cross_entropy = tf.reduce_mean(
tf.nn.sigmoid_cross_entropy_with_logits(logits = y,labels = y_))

Sigmoid是另一個激活功能,如在上面遇到的Relu,那裡提供了非線性。我部分使用SIGMOID部分是因為SIGMOID方程導致0到1之間的值,非常適合我們的二進制計數器示例。我也使用它,因為它對輸出單元的輸出有很大的值很好。在我們的情況下,要表示二進制編號111,所有輸出單元都可以具有大值。在進行圖像分類時,我們需要一些完全不同的東西,我們只需要一個輸出單元以大值射擊。例如,如果圖像包含長頸鹿,我們希望表示表示長頸鹿的輸出單元具有大值。像Softmax這樣的東西將是圖像分類的好選擇。

在密切檢查時,看起來有一些重複。我們似乎是兩次插入秒數。我們實際上是創造了兩個不同的,並行的outputs在這裡。在中立網絡訓練期間將使用Cross_entropy Tensor。當我們以後為其創造的任何目的運行我們訓練有素的神經網絡時,將使用卷大卷,以便在我們的案例中娛樂。我不知道這是做到這一點的最佳方式,但這是我想出的方式。

train_step = tf.train.rmspropoptimizer(0.25,momentum = 0.5).minimize(cross_entropy)

我們添加到我們的圖表的最後一塊是培訓。這是將根據培訓數據調整所有權重的OP或OPS。請記住,我們仍然只是在這裡創建一個圖表。當我們運行圖表時,實際培訓將發生。

有一些優化器選擇。我選擇tf.train.rmspropoptimizer,因為,與sigmoid一樣,對於所有輸出值都可以很大的情況很好。用於將圖像分類為映像分類時,tf.train.gradientDestoptimizer可能會更好。

培訓和使用二進制計數器

創建了圖表,是時候進行培訓了。一旦培訓,我們就可以使用它。

InputVals = [[0,0,0],[0,0,1],[0,1,0],[0,1,1],[1,0,0],[1,0,1]那
[1,1,0],[1,1,1]]]
targetVals = [[0,0,1],[0,1,0],[0,1,1],[1,0,0],[1,0,1],[1,1,0]那
[1,1,1],[0,0,0]]]

首先,我們有一些培訓數據:Inputvals和目標。 InputpVals包含輸入,並且對於每個inally,每個目標都有一個目標值。對於輸入值[0],我們具有[0,0,0],並且預期輸出是目標值[0],其是[0,0,1]等。

如果do_training == 1:
sess.run(tf.global_variables_initializer())

對於I系列(10001):
如果i%100 == 0:
train_error = cross_entropy.eval(feed_dict = {x:inputvals,y_:targetvals})
打印(“步驟%d,訓練錯誤%g”%(i,train_error))
如果train_error <0.0005: 休息 sess.run(train_step,feed_dict = {x:inputvals,y_:targetvals}) 如果save_traine == 1: 打印(“將神經網絡保存到%s。*”%(save_file)) Saver = tf.train.saver() Saver.Save(Sess,save_file) DO_TRAINTAIN和SAVE_TROAMET可以硬編碼,並為每個使用更改,或者可以使用命令行參數設置。 我們首先通過所有這些變量操作,並讓他們初始化他們的張量。 然後,高達10001次,我們將圖形從底部到the train_step tensor運行,我們添加到我們的圖表中的最後一件事。我們將InputeVals和TargetVals傳遞給Train_Step的Op或OPS,我們使用RMSPropoptimizer添加。這是調整所有權重的步驟,使得給定的輸入將導致接近相應的目標輸出的東西。如果目標輸出和實際輸出之間的錯誤更快得足夠小,則我們會突破循環。 如果您有數千個輸入/輸出成對,那麼您可以一次為其提供它們的子集,我們稍前發言的批次。但在這裡,我們只有八個,所以我們每次都給所有這些。 如果我們想要,我們也可以將網絡保存到文件中。一旦它訓練良好,我們不需要再次訓練它。 否則:#如果我們沒有訓練,那麼我們必須從文件加載 打印(“從%s”%(save_file)加載神經網絡)) Saver = tf.train.saver() Saver.restore(Sess,save_file) #注意:還原兩個加載並初始化變量 如果我們沒有訓練它,那麼我們將從文件中加載訓練的網絡。該文件僅包含具有變量操作的Tensors的值。它不包含圖形的結構。因此,即使運行已經訓練的圖表,我們仍然需要代碼來創建圖表。有一種方法可以使用metagraphs從文件中保存和加載圖表,但我們在這裡沒有這樣做。 打印('\ ncounting以:0 0 0'開始) res = sess.run(結果,feed_dict = {x:[[0,0,0]]}) 打印('%g%g%g'%(res [0] [0],res [0] [1],Res [0] [2]))

Leave a Reply

Your email address will not be published. Required fields are marked *