簡體   English   中英

Tensorflow:它如何訓練模型?

[英]Tensorflow: how it trains the model?

在 Tensorflow 上工作,第一步是構建數據圖並使用會話來運行它。 而在我的實踐中,比如MNIST 教程 它首先定義了損失函數和優化器,代碼如下(之前定義了 MLP 模型):

cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1])) #define cross entropy error function

loss = tf.reduce_mean(cross_entropy, name='xentropy_mean') #define loss

optimizer = tf.train.GradientDescentOptimizer(learning_rate) #define optimizer

global_step = tf.Variable(0, name='global_step', trainable=False) #learning rate

train_op = optimizer.minimize(loss, global_step=global_step) #train operation in the graph

訓練過程:

train_step =tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)


for i in range(1000):
  batch_xs, batch_ys = mnist.train.next_batch(100)
  sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

這就是 Tensorflow 在這種情況下進行訓練的方式。 但我的問題是,Tensorflow 如何知道它需要訓練和更新的權重? 我的意思是,在訓練代碼,我們只通過輸出ycross_entropy ,但對於optimizerloss ,我們沒有通過直接左右結構的任何信息。 此外,我們使用字典將批量數據饋送到train_step ,但train_step沒有直接使用數據。 Tensorflow 如何知道在哪里使用這些數據作為輸入?

對於我的問題,我認為可能所有這些變量或常量都存儲在Tensor 中 tf.matmul()等操作應該是Tensorflow 操作類的“子類”(我還沒有檢查代碼)。 Tensorflow 可能有某種機制來識別張量( tf.Variable()tf.constant() )和操作( tf.mul()tf.div() ...)之間的關系。 我想,它可以檢查tf.xxxx()的超類以找出它是張量還是操作。 這個假設提出了我的第二個問題我是否應該盡可能使用 Tensorflow 的 'tf.xxx' 函數來確保 tensorflow 可以構建正確的數據流圖,即使有時它比普通的 Python 方法更復雜,或者 Numpy 比 Tensorflow 更好地支持某些函數?

我的最后一個問題是:Tensorflow 和 C++ 之間有什么聯系嗎? 我聽說有人說 Tensorflow 比普通 Python 更快,因為它使用 C 或 C++ 作為后端。 是否有任何轉換機制可以將 Tensorflow Python 代碼轉換為 C/C++?

如果有人可以分享一些使用 Tensorflow 編碼的調試習慣,我也會很優雅,因為目前我只是設置了一些終端(Ubuntu)來測試我的代碼的每個部分/功能。

使用以下方法定義損失時,您確實會將有關結構的信息傳遞給Tensorflow:

loss = tf.reduce_mean(cross_entropy, name='xentropy_mean')

請注意,使用Tensorflow可以構建操作圖,並且您在代碼中使用的每個操作都是圖中的一個節點。

定義loss您將傳遞存儲在cross_entropy的操作,該操作取決於y_y y_是輸入的占位符,而yy = tf.nn.softmax(tf.matmul(x, W) + b) 看到我要去哪里? 運算loss包含建立模型和輸入模型所需的所有信息,因為它取決於運算cross_entropy ,運算cross_entropy取決於y_y ,后者取決於輸入x和模型權重W

所以當你打電話

sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

當您運行train_step ,Tensorflow完全知道應該計算哪些操作,並且它確切知道要通過feed_dict傳遞的數據在操作圖中的feed_dict

至於Tensorflow如何知道應該訓練哪些變量,答案很簡單。 它訓練操作圖中可訓練的任何tf.Variable() 請注意,當您定義global_step時,如何將trainable=False設置trainable=False因為您不想使用該變量來計算梯度。

像其他任何機器學習神經網絡一樣,Tensorflow也使用反向傳播。 只要您知道非常基本的演算,就很容易知道這是如何工作的。

如果您知道神經網絡是如何工作的,請跳過這一部分:

神經網絡通過使所有輸入具有初始層來工作。 我們通過簡單的操作來計算下一層。 對於第二層中的每個神經元,我們有一個偏差和權重的數量(該數量是上一層中神經元的數量,您將看到原因)。 我們首先將每個權重乘以上一層中的相應神經元。 然后我們增加了神經元的偏見。(還有擠壓功能,但您不必知道),這一過程在每一層和每一層都繼續進行。

機器學習部分:

我們唯一需要改變的就是權重和偏見。 這就是微積分的來源。 損失函數或損失函數是告訴我們輸出與期望輸出的差距的函數。 我們希望它盡可能低,換句話說,就是最小值(在這種情況下,它是局部的,而不是全局的,但是所有局部的最小值都非常相似)。要求出最小值,我們需要計算一個特定的偏差或重量會增加或減少成本(衍生產品)。 我們改變了權重或偏見,以減少損失。 我們對每個權重和偏差進行數百次操作,直到損失接近於0,這意味着輸出是所需的輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM