pytorch训练多分支网络

一个多分支输出网络(一个Encoder,多个Decoder)

我们期望每个分支的损失L_i分别对各自的参数进行优化,而共享参数部分采用各分支损失之和Sum(L_i)进行优化。

 在pytorch中是默认支持这种操作的,也就是我们可以分别计算出各分支的loss,然后直接把他们相加即可。(参考上面pytorch论坛的资料)

但是需要注意的是:但是如果您想要为您的损失按顺序向后调用,您可能想要在.backward()调用中指定retain_graph=True,否则中间变量将被清除。

 如果分别对每个损失调用backward(),不加retain_grath=True肯定会遇到这个错误(pytorch会自动报错)。更简单的方法是将损失相加。这两种方法是等价的,因为多个向后调用的梯度将被累加。

 

方式一:

1
2
3
4
5
6
7
8
9
10
11
12
optimizer = optim.SGD(params=my_params_list, lr=....)
 
loss_func = nn.CrossEntropyLoss()
 
loss1 = loss_func(y1, target1)
loss2 = loss_func(y2. target2)
 
loss = loss1 + loss2
 
optimizer.zero_grad()
loss.backward()
optimizer.step()

方式二:

1
2
3
4
5
6
7
8
9
10
11
12
13
optimizer = optim.SGD(params=my_params_list, lr=....)
 
loss_func = nn.CrossEntropyLoss()
 
loss1 = loss_func(y1, target1)
loss2 = loss_func(y2. target2)
 
optimizer.zero_grad()
 
loss1.backward(retain_graph=True)
loss2.backward()
 
optimizer.step()

建议采用方式一进行计算,第一个是优雅和正确的。

 

 

1
2
3
4
5
6
7
8
9
10
11
## you can simply do:
 
o1, o2 = mm(input)
o = o1 + o2
# loss
 
## Or you can do
 
l1 = loss(o1, target)
l2 = loss2(o2, target2)
torch.autograd.backward([l1, l2])

 

如果想不同的分支采用不同的优化器:

1
2
3
4
5
6
7
8
opt1 = optim.Adam(branch_1.parameters(), ...)
opt2 = optim.SGD(branch_2.parameters(), ...)
...
...
loss = 2*loss_1 + 3 *loss_2
loss.backward()
opt1.step()
opt2.step()

 

 

参考:

How to train multi-branch output network?

pytorch辅助损失函数反向传播的疑问?

 

posted on   那抹阳光1994  阅读(8418)  评论(2编辑  收藏  举报

编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示