![](/img/trans.png)
[英]How to stop CUDA from re-initializing for every subprocess which trains a keras model?
[英]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 如何知道它需要訓練和更新的權重? 我的意思是,在訓練代碼,我們只通過輸出y
至cross_entropy
,但對於optimizer
或loss
,我們沒有通過直接左右結構的任何信息。 此外,我們使用字典將批量數據饋送到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_
是輸入的占位符,而y
是y = 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.