AllenNLP的commands命令中有一個fine-tune命令,可以在新的數據集上訓練模型,或者在原來的模型上繼續訓練。
fine-tune命令跳過配置文件的model部分,即網絡結構是要固定下來的,其他參數可以變。
比如可以在配置文件設置trainer的no_grad,凍結一些層,讓他們不進行參數更新,而其他層的參數正常更新。
以qanet.jsonnet爲例
- 在windows中首先要去掉//的註釋和變量,使它成爲json的格式
- 執行dry-run命令,可以打印輸出哪些層是可訓練的,哪些層是凍結的
- 修改配置文件,在trainer中添加no_grad,其中用一個List的正則表達式,定義哪些層是需要凍結的
- 執行dry-run命令,驗證是否設置成功
以下是我添加的no_grad,目的是凍結前面所有層,只訓練最後的兩個Linear。(“.”表示任意字符,“*”表示前面的字符可以重複多個,. * layer. *表示找到所有名字中帶有layer的層)
"no_grad":
[".*text_field_embedder.*", ".*layer.*", ".*matrix.*"]
dry-run得到的結果,說明設置正確。