Значение Bool для Tensor с более чем одним значением в Pytorch неоднозначно

Я хочу создать модель в pytorch, но не могу вычислить убыток. Всегда возвращается Булево значение Tensor с дополнительными чем одно значение неоднозначно Собственно, я запускаю пример кода, он работает.

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

Вот мой код,

################################################################################
##
##
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"])

Ошибка на Loss = CrossEntropyLoss (Pip, Train ["Label"]), Благодарю.

похожие сообщения: - stackoverflow.com/questions/52946920/… - Discussion.pytorch.org/t/… - Discussion.pytorch.org/t/… - Discussion.pytorch.org/t/…

Charlie Parker 08.08.2019 22:37
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
33
1
66 943
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

В вашем минимальном примере вы создаете объект «потеря» класса «CrossEntropyLoss». Этот объект может вычислить ваши потери как

loss(input, target)

Однако в вашем фактическом коде вы пытаетесь создать объект «Loss», передавая Pip и метки конструктору класса «CrossEntropyLoss». Вместо этого попробуйте следующее:

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

Изменить (объяснение сообщения об ошибке): Сообщение об ошибке Bool value of Tensor with more than one value is ambiguous появляется, когда вы пытаетесь преобразовать тензор в значение типа bool. Чаще всего это происходит при передаче тензора в условие если, например.

input = torch.randn(8, 5)
if input:
    some_code()

Второй аргумент конструктора класса CrossEntropyLoss ожидает логическое значение. Таким образом, в строке

Loss = CrossEntropyLoss(Pip, Train["Label"])

конструктор в какой-то момент попытается использовать переданный тензор Train["Label"] в качестве логического, что выдает указанное сообщение об ошибке.

было бы неплохо, если бы вы где-нибудь сослались на то, что на самом деле означает эта ошибка

Charlie Parker 10.09.2020 19:12

Вы не можете использовать класс CrossEntropyLoss напрямую. Вы должны создать экземпляр этого класса перед его использованием.

исходный код:

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

следует заменить на:

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

Первая фактическая потеря

L = CrossEntropyLoss()

Затем вычислите потерю

L(y_pred, y_true)

Это исправит ошибку.

Другие вопросы по теме