您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關在API中使用自定義層導致trainable_variables中的權重無法更新該怎么解決,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
一位從事NLP工程師Gupta發現了TensorFlow存在的一個嚴重bug:
每個在自定義層中使用Keras函數式API的用戶都要注意了!使用用Keras的Functional API創建的權重,可能會丟失。
這一話題在Reddit機器學習板塊上被熱議,引起不少TensorFlow用戶共鳴。
具體來說,就是在API中使用自定義層,會導致trainable_variables中的權重無法更新。而且這些權重也不會放入non_trainable_variables中。
也就是說,原本需要訓練的權重現在被凍結了。
讓這位工程師感到不滿的是,他大約一個月前在GitHub中把這個bug報告給谷歌,結果谷歌官方到現在還沒有修復。
解決辦法
如何檢驗自己的代碼是否會出現類似問題呢?請調用model.trainable_variables來檢測自己的模型:
for i, var in enumerate(model.trainable_variables):
print(model.trainable_variables[i].name)
看看你所有的可變權重是否正確,如果權重缺失或者未發生變化,說明你也中招了。
Gupta還自己用Transformer庫創建模型的bug在Colab筆記本中復現了,有興趣的讀者可以前去觀看。
https://colab.research.google.com/gist/Santosh-Gupta/40c54e5b76e3f522fa78da6a248b6826/missingtrainablevarsinference_var.ipynb
對此問題,Gupta給出的一種解決方法是:改為使用Keras子類創建模型。改用此方法后,所有的權重都將出現在trainable_variables中。
為了絕對確保用函數式API和子類方法創建的模型完全相同,Gupta在每個Colab筆記本底部使用相同的輸入對它們進行了推理,模型的輸出完全相同。
但是,使用函數式API模型進行訓練會將許多權重視為凍結,而且這些權重也沒有出現在non_trainable_variables中,因此無法為這些權重解凍。
為了檢查谷歌最近是否修復了該漏洞,Gupta還安裝了Nightly版的TF 2.3.0-rc1,保持框架處于最新狀態,但如今bug依然存在。
關于在API中使用自定義層導致trainable_variables中的權重無法更新該怎么解決就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。