Выполнить классификацию двоичного класса.Я использую двоичную перекрестную энтропию, чтобы быть функцией потерь (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'