我正在使用 Keras 功能 API 創建一個模型。
層架構如下:
n = tf.keras.layers.Dense(1)(input)
for i in tf.range(n):
output = tf.keras.layers.Dense(4)(input)
然后我連接輸出并回傳形狀為 [1, None, 4] 的張量,其中 [1] 是批量維度,[None] 是 n,而 [4] 是第二個密集層的輸出。
我的損失函式涉及比較預期輸出的形狀,并比較輸出。
loss = tf.convert_to_tensor(abs(tf.shape(logits)[1] - tf.shape(expected)[1])) * 100.
在自定義訓練回圈上運行此程式時,出現錯誤
ValueError: No gradients provided for any variable: (['while/dense/kernel:0',
'while/dense/bias:0', 'while/while/dense_1/kernel:0', 'while/while/dense_1/bias:0'],).
Provided `grads_and_vars` is ((None, <tf.Variable 'while/dense/kernel:0' shape=(786432, 1)
uj5u.com熱心網友回復:
形狀是不可微的,你不能用基于梯度的學習來做這樣的事情。像這樣的問題需要使用更強大的工具來解決,例如強化學習,將 n 視為一個動作,并為此獲得策略梯度。
要記住的一條經驗法則是,您不能真正通過離散物件進行反向傳播。您需要生成浮點數,因為漸變需要平滑函式。在您的情況下,n 應該是一個整數(浮點上的回圈是什么意思?)所以這應該是您的第一個警告信號。另一個是形狀本身,它也是一個整數。目標可以是離散的,但不能是預測。請注意,即使在分類中我們不輸出類,我們也會輸出概率,因為概率是平滑的。
您可以通過假設 N 的最大數量來構建模型,并將其更像是您直接監督 N 的分類,并使用某種形式的掩碼來保留所有結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/508264.html
上一篇:如何使用串列在維恩圖中實作?
