Я изменяю ожидаемый объект скалярного типа с плавающей точкой, но все еще получил Long в Pytorch - PullRequest
0 голосов
/ 13 апреля 2019

Выполнить классификацию двоичного класса.Я использую двоичную перекрестную энтропию, чтобы быть функцией потерь (nn.BCEloss ()), а единицы последнего слоя равны единице.

Перед тем, как поместить (вход, цель) в функцию потерь, я разыгрываю цель с Long до float.Только последний шаг DataLoader приходит сообщения об ошибках, и сообщение об ошибке, как показано ниже. "RuntimeError: Expected object of scalar type Float but got scalar type Long for argument #2 'target'" DataLoader (я отбрасываю последнюю партию, если размер партии не совпадает) определен в коде, я не уверен, есть ли корреляция с ошибкой.

Я пытался напечататьтип цели и входа (выход нейронной сети), а также тип обеих переменных - float.Я поставил «тип результата» и код ниже.

trainloader = torch.utils.data.DataLoader(trainset, batch_size=BATCH_SIZE,
                                          shuffle=True, drop_last=True)
loss_func = nn.BCELoss() 

# training 
for epoch in range(EPOCH):
    test_loss = 0
    train_loss = 0

    for step, (b_x, b_y) in enumerate(trainloader):        # gives batch data
        b_x = b_x.view(-1, TIME_STEP, 1)              # reshape x to (batch, time_step, input_size)
        print("step: ", step)
        b_x = b_x.to(device) 
        print("BEFORE|b_y type: ",b_y.type())
        b_y = b_y.to(device, dtype=torch.float)
        print("AFTER|b_y type: ",b_y.type())
        output = rnn(b_x)                               # rnn output
        print("output type:", output.type())
        loss = loss_func(output, b_y)  # !!!error occurs when trainloader enumerate the final step!!!                 

        train_loss = train_loss + loss

        optimizer.zero_grad()                           
        loss.backward()                                 
        optimizer.step()  
#### type result and the error message####
... 
step:  6
BEFORE|b_y type:  torch.LongTensor
AFTER|b_y type:  torch.cuda.FloatTensor
output type: torch.cuda.FloatTensor
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-18-e028fcb6b840> in <module>
     30         b_y = b_y.to(device)
     31         output = rnn(b_x)
---> 32         loss = loss_func(output, b_y)
     33         test_loss = test_loss + loss
     34         rnn.train()

~/venvs/tf1.12/lib/python3.5/site-packages/torch/nn/modules/module.py in __call__(self, *input, **kwargs)
    487             result = self._slow_forward(*input, **kwargs)
    488         else:
--> 489             result = self.forward(*input, **kwargs)
    490         for hook in self._forward_hooks.values():
    491             hook_result = hook(self, input, result)

~/venvs/tf1.12/lib/python3.5/site-packages/torch/nn/modules/loss.py in forward(self, input, target)
    502     @weak_script_method
    503     def forward(self, input, target):
--> 504         return F.binary_cross_entropy(input, target, weight=self.weight, reduction=self.reduction)
    505 
    506 

~/venvs/tf1.12/lib/python3.5/site-packages/torch/nn/functional.py in binary_cross_entropy(input, target, weight, size_average, reduce, reduction)
   2025 
   2026     return torch._C._nn.binary_cross_entropy(
-> 2027         input, target, weight, reduction_enum)
   2028 
   2029 

RuntimeError: Expected object of scalar type Float but got scalar type Long for argument #2 'target'

1 Ответ

2 голосов
/ 13 апреля 2019

Похоже, что тип корректно изменяется, поскольку вы заявляете, что наблюдаете изменение при печати типов и из Pytorch:

Возвращает Tensor с указанным устройством и (необязательно) dtype. Если dtype - это None. Предполагается, что оно равно self.dtype. Когда non_blocking, пытается преобразовать асинхронно относительно хоста, если это возможно, например, преобразование тензора ЦП с закрепленной памятью в тензор CUDA. Когда копирование установлено, новый Тензор создается, даже если Тензор уже соответствует желаемому преобразованию.

и другие методы, такие как

b_y = b_y.to(device).float()

не должно быть измеримо отличным, поскольку, опять же, .float() эквивалентно .to(..., torch.float32). и .float эквивалентно .float32. Можете ли вы проверить тип b_y непосредственно перед выдачей ошибки и отредактировать вопрос? (Я бы сделал это комментарий - но я хотел бы добавить более подробную информацию. Я постараюсь помочь, когда это будет предоставлено)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...