2017-09-23 79 views

回答

2

如果您有多個網絡(從多個對象繼承nn.Module),您必須這樣做,原因很簡單:構建torch.nn.optim.Optimizer對象時,它將需要優化的參數作爲參數。在你的情況下:

encoder_optimizer = optim.Adam(encoder.parameters(), lr=learning_rate) 
decoder_optimizer = optim.Adam(decoder.parameters(), lr=learning_rate) 

這也給你自由地改變參數作爲學習率獨立。如果你不需要,你可以創建一個新的類從nn.Module繼承和含兩個網絡,編碼器和解碼器或創建一組參數來給優化爲解釋here

nets = [encoder, decoder] 
parameters = set() 
for net in nets: 
    parameters |= set(net.parameters()) 

其中|是在這種情況下集合的聯合運算符。

+0

感謝您的回答。那麼這是否意味着如果我們只有從'nn.Module'繼承的編碼器和解碼器類,簡單地將編碼器的隱藏流傳送到解碼器(例如'enc_out,enc_hidden = encoder(x); dec_out =解碼器(y,enc_hidden)')並且只使用一個'optimizer'在這種情況下不起作用? – Edityouprofile

+0

@displayname我不太明白你想要做什麼。你能否詳細說明你的問題 – McLawrence

+0

抱歉,遲到的回覆,我認爲你提到的兩種方法是標準的方法來做到這一點。 – Edityouprofile

相關問題