web-dev-qa-db-fra.com

La valeur booléenne du tenseur avec plusieurs valeurs est ambiguë dans Pytorch

Je veux créer un modèle en pytorch, mais je ne peux pas calculer la perte. Il retourne toujours la valeur booléenne de Tensor avec plus d'une valeur est ambiguë En fait, je lance un exemple de code, ça marche.

loss = CrossEntropyLoss()
input = torch.randn(8, 5)
input
target = torch.empty(8,dtype=torch.long).random_(5)
target
output = loss(input, target)

Voici mon code,

################################################################################
##
##
import torch
from torch.nn import Conv2d, MaxPool2d, Linear, CrossEntropyLoss, MultiLabelSoftMarginLoss
from torch.nn.functional import relu, conv2d, max_pool2d, linear, softmax
from torch.optim import adadelta
##
##
##  Train
Train = {}
Train["Image"]    = torch.Rand(2000, 3, 76, 76)
Train["Variable"] = torch.Rand(2000, 6)
Train["Label"] = torch.empty(2000, dtype=torch.long).random_(2)
##
##
##  Valid
Valid = {}
Valid["Image"]    = torch.Rand(150, 3, 76, 76)
Valid["Variable"] = torch.Rand(150, 6)
Valid["Label"]    = torch.empty(150, dtype=torch.long).random_(2)
################################################################################
##
##
##  Model
ImageTerm    = Train["Image"]
VariableTerm = Train["Variable"]
Pip = Conv2d(in_channels=3, out_channels=32, kernel_size=(3,3), stride=1, padding=0)(ImageTerm)
Pip = MaxPool2d(kernel_size=(2,2), stride=None, padding=0)(Pip)
Pip = Conv2d(in_channels=32, out_channels=64, kernel_size=(3,3), stride=1, padding=0)(Pip)
Pip = MaxPool2d(kernel_size=(2,2), stride=None, padding=0)(Pip)
Pip = Pip.view(2000, -1)
Pip = torch.cat([Pip, VariableTerm], 1)
Pip = Linear(in_features=18502, out_features=1000 , bias=True)(Pip)
Pip = Linear(in_features=1000, out_features=2 , bias=True)(Pip)
##
##
##  Loss
Loss = CrossEntropyLoss(Pip, Train["Label"])

L'erreur est sur Perte = CrossEntropyLoss (Pip, Train ["Label"]), merci.

11
Greg

Dans votre exemple minimal, vous créez un objet "perte" de la classe "CrossEntropyLoss". Cet objet est capable de calculer votre perte comme

loss(input, target)

Cependant, dans votre code actuel, vous essayez de créer l'objet "Perte" tout en transmettant Pip et les étiquettes au constructeur de classe "CrossEntropyLoss". Au lieu de cela, essayez ce qui suit:

loss = CrossEntropyLoss()
loss(Pip, Train["Label"])
11
randomwalker