這篇文章將為大家詳細(xì)講解有關(guān)在API中使用自定義層導(dǎo)致trainable_variables中的權(quán)重?zé)o法更新該怎么解決,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
創(chuàng)新互聯(lián)專(zhuān)注為客戶(hù)提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、翁牛特網(wǎng)絡(luò)推廣、微信小程序開(kāi)發(fā)、翁牛特網(wǎng)絡(luò)營(yíng)銷(xiāo)、翁牛特企業(yè)策劃、翁牛特品牌公關(guān)、搜索引擎seo、人物專(zhuān)訪(fǎng)、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供翁牛特建站搭建服務(wù),24小時(shí)服務(wù)熱線(xiàn):18982081108,官方網(wǎng)址:www.cdcxhl.com
一位從事NLP工程師Gupta發(fā)現(xiàn)了TensorFlow存在的一個(gè)嚴(yán)重bug:
每個(gè)在自定義層中使用Keras函數(shù)式API的用戶(hù)都要注意了!使用用Keras的Functional API創(chuàng)建的權(quán)重,可能會(huì)丟失。
這一話(huà)題在Reddit機(jī)器學(xué)習(xí)板塊上被熱議,引起不少TensorFlow用戶(hù)共鳴。
具體來(lái)說(shuō),就是在API中使用自定義層,會(huì)導(dǎo)致trainable_variables中的權(quán)重?zé)o法更新。而且這些權(quán)重也不會(huì)放入non_trainable_variables中。
也就是說(shuō),原本需要訓(xùn)練的權(quán)重現(xiàn)在被凍結(jié)了。
讓這位工程師感到不滿(mǎn)的是,他大約一個(gè)月前在GitHub中把這個(gè)bug報(bào)告給谷歌,結(jié)果谷歌官方到現(xiàn)在還沒(méi)有修復(fù)。
解決辦法
如何檢驗(yàn)自己的代碼是否會(huì)出現(xiàn)類(lèi)似問(wèn)題呢?請(qǐng)調(diào)用model.trainable_variables來(lái)檢測(cè)自己的模型:
for i, var in enumerate(model.trainable_variables):
print(model.trainable_variables[i].name)
看看你所有的可變權(quán)重是否正確,如果權(quán)重缺失或者未發(fā)生變化,說(shuō)明你也中招了。
Gupta還自己用Transformer庫(kù)創(chuàng)建模型的bug在Colab筆記本中復(fù)現(xiàn)了,有興趣的讀者可以前去觀看。
https://colab.research.google.com/gist/Santosh-Gupta/40c54e5b76e3f522fa78da6a248b6826/missingtrainablevarsinference_var.ipynb
對(duì)此問(wèn)題,Gupta給出的一種解決方法是:改為使用Keras子類(lèi)創(chuàng)建模型。改用此方法后,所有的權(quán)重都將出現(xiàn)在trainable_variables中。
為了絕對(duì)確保用函數(shù)式API和子類(lèi)方法創(chuàng)建的模型完全相同,Gupta在每個(gè)Colab筆記本底部使用相同的輸入對(duì)它們進(jìn)行了推理,模型的輸出完全相同。
但是,使用函數(shù)式API模型進(jìn)行訓(xùn)練會(huì)將許多權(quán)重視為凍結(jié),而且這些權(quán)重也沒(méi)有出現(xiàn)在non_trainable_variables中,因此無(wú)法為這些權(quán)重解凍。
為了檢查谷歌最近是否修復(fù)了該漏洞,Gupta還安裝了Nightly版的TF 2.3.0-rc1,保持框架處于最新?tīng)顟B(tài),但如今bug依然存在。
關(guān)于在API中使用自定義層導(dǎo)致trainable_variables中的權(quán)重?zé)o法更新該怎么解決就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。