Dynadot 搬瓦工 腾讯云

Pytorch 同一个网络同时拥有多个输出的写法

Sider GigsGigsCloud

Pytorch 是非常热门的神经网络计算框架,一般来说一个网络对应一个输出,如果我们需要一个网络同时输出多个 output,这在 Pytorch 也是可以做到的。输出之后,可以分别计算 Loss,然后进行 BP。

一、同一个网络输出多个结果

只需要在 forward() 部分这么写:

def forward(self, x):
    # Do your stuff here
    ...
    x1 = F.log_softmax(x) # class probabilities
    x2 = ... # bounding box calculation
    return x1, x2

然后分别计算 Loss 并训练网络:

out1, out2 = model(data)
loss1 = criterion1(out1, target1)
loss2 = criterion2(out2, target2)
loss = loss1 + loss2
loss.backward()

具体的话就根据自己的具体需求来改了。

参考:https://discuss.pytorch.org/t/a-model-with-multiple-outputs/10440/2

二、其他参考

这里还有一份另外一个同学的提问,不过暂时没人答复:https://discuss.pytorch.org/t/training-a-multiple-output-network/6968

看了下总体思想是一样的,应该没什么问题。

import torch
import torchvision
import torch.nn as nn
import numpy as np
import torch.utils.data as data
import torchvision.transforms as transforms
import torchvision.datasets as dsets
from torch.autograd import Variable
import pdb


class RegNet(nn.Module):
  def __init__(self):
    super(RegNet,self).__init__()
    self.Reg_x = nn.Linear(4,4)
    self.Reg_y = nn.Linear(4,3)
    
  def forward(self,x):
    x_x = self.Reg_x(x)
    x_y = self.Reg_y(x)
    return x_x,x_y


# Input
z = Variable(torch.ones(5,4),requires_grad=True)

# Rep Layer
Rep = nn.Linear(4,4)

# Reg Layer
Reg = RegNet()

label_x = Variable(torch.ones(5,4))
label_y = Variable(torch.zeros(5,3))

criterion = nn.MSELoss()
optimizer1 = torch.optim.SGD(Rep.parameters(), lr=0.01)
optimizer2 = torch.optim.SGD(Reg.parameters(), lr=0.01)

# train
# feed-forward
rep_out = Rep(z)
pred_x,pred_y = Reg(rep_out)

loss_x = criterion(pred_x,label_x)
loss_y = criterion(pred_y,label_y)
loss = loss_x + loss_y

loss.backward()
Dynadot Hostwinds
赞(6)
版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《Pytorch 同一个网络同时拥有多个输出的写法
文章链接:https://oldtang.com/2385.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。