我想實現一個嵌入層。嵌入將使用預先訓練的手套嵌入進行初始化。對於可以在手套中找到的詞語,它將被固定。對於那些沒有戴手套的話,它會隨機初始化,並且可以訓練。我如何做tensorflow?我知道整個張量都有一個tf.stop_gradient,對於這種情況,有沒有任何stop_gradient api?或者,有沒有解決這個問題的方法?任何建議表示讚賞如何在張量流中停止張量的某些輸入的梯度
2
A
回答
8
這樣的想法是使用mask
並tf.stop_gradient
開裂這樣的問題:
res_matrix = tf.stop_gradient(mask_h*E) + mask*E
,
其中在基質mask
中,1表示到我想申請梯度條目,0表示對哪個條目我不想應用漸變(將漸變設置爲0),mask_h
是mask
的反轉(1翻轉爲0,0翻轉爲1)。然後我們可以從res_matrix
中獲取。這裏是測試代碼:
import tensorflow as tf
import numpy as np
def entry_stop_gradients(target, mask):
mask_h = tf.abs(mask-1)
return tf.stop_gradient(mask_h * target) + mask * target
mask = np.array([1., 0, 1, 1, 0, 0, 1, 1, 0, 1])
mask_h = np.abs(mask-1)
emb = tf.constant(np.ones([10, 5]))
matrix = entry_stop_gradients(emb, tf.expand_dims(mask,1))
parm = np.random.randn(5, 1)
t_parm = tf.constant(parm)
loss = tf.reduce_sum(tf.matmul(matrix, t_parm))
grad1 = tf.gradients(loss, emb)
grad2 = tf.gradients(loss, matrix)
print matrix
with tf.Session() as sess:
print sess.run(loss)
print sess.run([grad1, grad2])
1
我建議你有兩個不同的張量來保存你的數據:一個tf.constant爲你的預訓練數據,一個tf.Variable爲你的新數據進行訓練,然後你可以混合既有級聯又有張量連接操作。
由於tf.constant無法訓練,因此您不必擔心停止漸變。
1
我不太瞭解單詞嵌入,但我對您的問題的理解是,您有一個變量v
,並且您只想訓練它的某些(已知)條目。您可以通過使用「掩模」(即與v
相同形狀的恆定張量對可訓練條目的值爲1,否則爲0)來實現此目的。
v = your_variable()
loss = your_loss() #some loss that uses v
mask = your_mask_as_explained_above()
opt = tf.train.GradientDescentOptimizer(learning_rate=0.1)
# Get list (length 1 in our example) of (gradient, variable)-pairs from the optimizer and extract the gradient w.r.t. v
grads_and_vars = opt.compute_gradients(loss, [v])
v_grad = grads_and_vars[0][0]
# Multiply the gradient with the mask before feeding it back to the optimizer
sgd_step = opt.apply_gradients([(v, v_grad*mask)])
根據您的問題的複雜性,這可能不是一個有效的解決方案,不過,因爲全梯度w.r.t.在每個步驟中計算v
。在優化器更新中,應用根本不是。
如果您對opt.compute_gradients
和opt.apply_gradients
不熟悉,請在docs中解釋。
+0
感謝您的回覆,我認爲您的解決方案將起作用。我剛剛提出了另一個想法,我已經在下面發佈了它。 –
相關問題
- 1. 在張量流中爲張量子集停止梯度
- 2. 如何在張量流中停止LSTMStateTuple的梯度
- 3. 如何將張量列表作爲張量流圖的輸入?
- 4. 如何累積張量流中的梯度?
- 5. 如何可視化張量流中的BPTT梯度
- 6. 在張量流中可訓練和停止梯度有什麼區別
- 7. 批量輸入到張量流中的某一層
- 8. 停止張量流和明確的克
- 9. 如何在張量流中添加更多輸入張量的通道?
- 10. 如何在張量流的某些層中取消BP?
- 11. 張量流中LSTM的多元輸入
- 12. PIL圖像張量張量,張量流
- 13. 張量流中每個示例的未聚集的梯度/梯度
- 14. 比較張量(張量流)
- 15. 如何對張量流中的所有變量進行梯度下降
- 16. 改變張量流中的張量的尺度
- 17. 如何在張量流中改變三維張量的尺寸?
- 18. 在張量流中,如何將張量的行重置爲零?
- 19. 如何在張量流中製作張量柱的直方圖
- 20. 如何在張量流中使用張量的動態形狀
- 21. 如何用Tensorflow張量中的某些值替換其他張量的值?
- 22. 如何實現張量流中的早期停止
- 23. 張量流圖中的梯度是否計算錯誤?
- 24. 張量流中幾個梯度的計算
- 25. 在張量流中沒有提供梯度(mean_squared_error)
- 26. 如何解釋張量流中的張量圖?
- 27. 如何計算張量流中張量的形狀
- 28. 張量如何在CIFAR10教程中保存張量流?
- 29. 如何在張量流中實現RGB圖像張量?
- 30. 如何在張量流中調整張量?
這樣我就不得不做很多預處理。這會讓我的代碼看起來有點難看。我會嘗試使用收集並與stop_gradient一起分散,看看是否會起作用。真的希望有一個功能來支持這一點。謝謝。 –