【问题标题】:Pytorch BCELoss not accepting listsPytorch BCELoss 不接受列表
【发布时间】:2020-03-21 10:27:11
【问题描述】:

我的 convLSTM 模型返回一个隐藏状态列表(总共 17 个,大小为 (1,3,128,128)),我的目标是一个包含 17 个图像的列表(所有张量大小:(3,128,128) 调用损失函数时,出现以下错误:

文件“/Users/xyz/opt/anaconda3/envs/matrix/lib/python3.7/site->packages/torch/nn/modules/loss.py”,第 498 行,向前 return F.binary_cross_entropy(输入,目标,权重=self.weight,>reduction=self.reduction) 文件“/Users/xyz/opt/anaconda3/envs/matrix/lib/python3.7/site->packages/torch/nn/functional.py”,第 2052 行,位于 binary_cross_entropy 如果 target.size() != input.size(): AttributeError: 'list' 对象没有属性 'size'

部分训练循环:

    hc = model.init_hidden(batch_size=1)
    for batch_idx, (data, target) in enumerate(train_loader):
        optimizer.zero_grad()
        # Set target, images 2 to 18
        target = data[1:]
        if gpu:
            data = data.cuda()
            target = target.cuda()
            hc.cuda()
        # Get outputs of LSTM
        output = model(data, hc)
        # Calculate loss
        loss = criterion(output, target)
        loss.backward()
        optimizer.step()

我原以为会出现尺寸不匹配错误,但结果却出现了这个错误。我该如何解决这个问题?

【问题讨论】:

    标签: pytorch loss-function


    【解决方案1】:

    target 需要是张量,而不是张量列表。

    示例

        >>> m = nn.Sigmoid()
        >>> loss = nn.BCELoss()
        >>> input = torch.randn(3, requires_grad=True)
        >>> target = torch.empty(3).random_(2) #This is a tensor, not a list
        >>> output = loss(m(input), target)
        >>> output.backward()
    

    看看torch.nn.modules.losstorch.nn中的BCELoss

    【讨论】:

    • 我试过这样做:target = torch.tensor(data[1:] 我得到了同样的错误。然后我尝试做output = torch.tensor(output) 现在我得到以下错误:ValueError:只有一个元素张量可以转换为 Python 标量
    • 您必须连接张量列表以创建张量。请参考torch.cat
    【解决方案2】:

    您好,我使用torch.stack 解决了这个问题。可以使用torch.cat,但想要一个带有张量列表的张量传递给损失函数以匹配目标格式,因此使用torch.stack

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-16
      • 1970-01-01
      • 2017-09-20
      • 2019-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多