TensorFlow被曝存嚴重bug,搭配Keras可能丟失權重,至今仍未修復
本文經AI新媒體量子位(公眾號ID:QbitAI)授權轉載,轉載請聯系出處。
最近,一位從事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依然存在。
網友:還是用PyTorch吧
剛剛,Keras創始人在Twitter上回復,這不是Keras的bug,并建議程序員使用單元測試。

對于Gupta所說的bug,有網友說,他在TensorFlow和Keras之間傳遞權重的時候,出現了類似的錯誤,從此轉而使用PyTorch。
另外還有不少網友也反映,谷歌的框架不太完善,管理方式一團糟,是在讓用戶幫他們測試TensorFlow的bug。
反觀PyTorch,說明文檔通俗易懂,最近官方還出了免費電子書,難道用PyTorch不香嗎?
你現在在使用哪種深度學習框架,你也遇到過類似的嚴重bug嗎?