1樓:xaipxan
我猜你的意思應該是net1 net2兩個網路,如何同時反向傳播是吧。
對於這個問題,我自己做過簡陋的實驗。x=
torch
.rand(2
,3)net1=nn
.Linear(3
,3)net2=nn
.Linear(3
,3)a
=net1(x
)b=net2(a
)tgt
=torch
.rand(2
,3)loss_fun
=torch.nn
.MSELoss
()opt1
=torch
.optim
.Adam
(net1
.parameters
(),0.002
)opt2
=torch
.optim
.Adam
(net2
.parameters
(),0.002
)foriin
range
(100
):tmp
=net1(x
)output
=net2
(tmp
)loss
=loss_fun
(output
,tgt
)net1
.zero_grad
()net2
.zero_grad
()loss
.backward
()opt1
.step
()opt2
.step
('EPOCH:
{},loss={}'
.format(i
,loss
))aa
=net1(x
)bb=net2(aa
)print(a
)print(aa
)print(b
)print(bb
)先建立兩個網路net1和net2,把net1的輸出再輸入net2 。
目的是用訓練之前的net1輸出a 和 net2輸出b對比訓練後的net1輸出aa和net2輸出bb。
訓練中是net1用opt1(adam)優化,net2用opt2(adam)優化。
結果是a和aa,b和bb都不一樣。說明權重得到了訓練或者說發生了改變。
之後再用乙個net把net1和net2封裝進去。
xx = torch.rand(2, 3)
class net(nn.Module):
def __init__(selfsuper().__initself.n1 = nn.Linear(3, 3self.n2 = nn.Linear(3, 3)
def forward(self, xxoutput = self.n1(xxprint(outputoutput = self.n2(outputreturn output
n = net()
tgt = torch.rand(2, 3)
loss_fun = torch.nn.MSELoss()
opt_n = torch.optim.Adam(n.parameters(), 0.002)
for i in range(100):
outout = n(xx)
loss = loss_fun(outout, tgt)
n.zero_grad()
loss.backward()
opt_n.step()
print('EPOCH:{},loss={}'.format(i, loss))
目的跟之前的一樣。
在net的forward的部分螢幕列印出net1的輸出,方便觀察每次輸出的矩陣跟之前的一樣否。
跟之前的不同的是這次只需要優化net乙個的就可以了。
分割線就像encoder-decoder網路一樣,有些人是各自寫完class encoder和class decoder後把他們裝進class net中。這樣只需要優化net的引數即可。
有些人喜歡用兩個opt各自優化encoder和decoder的引數。
效果一樣。
pytorch怎麼同時讓兩個dataloader打亂的順序是相同的?
氕氘氚氘化鋰氫 本人用過的粗暴方案。使用numpy先對資料集進行隨機化,然後再使用torch shuffle False載入資料集。缺點就是每次epoch的資料都是一樣的。 Wet sand 既然都一起拿出 dataloader 的,何不寫進同個 dataset,套同個 dataloader,get...
兩個月訓練能進校隊嗎
何嘉俊 我覺得是可以的,當然你得刻苦訓練,習得更多的技術,能穩定的得分。你這身材真好呀,感覺內線會被你搞的翻山覆水。比賽越來越多,打的越多,我想你能發揮的更好。加油吧,少年。 DeathRiderL 總結了一下,目前高三,想進大學打校隊,基本規則能摸清,但是在學校起步較晚,學校也不重視,身體素質方面...
兩個月的拉布拉多怎樣訓練?
貓狗賣的小哥哥 二個月的拉布拉多講真的,有點類似於小孩子一二歲,你教太多他也不懂,一般狗狗的教育年齡在6個月左右,現在你最好有點耐心過了這段時間。 我沒有拖拖拖延症 小狗長牙階段,它咬你的手痛了你就大聲慘叫,並說no,然後用狗的下嘴唇包裹住它的牙慢慢加重力度,等到它感覺不舒服的時候放開,時間長了,它...