python - pytorch“log_softmax_lastdim_kernel_impl”未为“torch.LongTensor”实现
问题描述
我正在尝试使用我自己的数据集根据https://github.com/bentrevett/pytorch-sentiment-analysis/blob/master/5%20-%20Multi-class%20Sentiment%20Analysis.ipynb对文本进行分类。我的数据集是一个 csv 的句子和一个与之相关的类。有6个不同的类:
sent class
'the fox is brown' animal
'the house is big' object
'one water is drinkable' water
...
运行时:
N_EPOCHS = 5
best_valid_loss = float('inf')
for epoch in range(N_EPOCHS):
start_time = time.time()
print(start_time)
train_loss, train_acc = train(model, train_iterator, optimizer, criterion)
print(train_loss.type())
print(train_acc.type())
valid_loss, valid_acc = evaluate(model, valid_iterator, criterion)
end_time = time.time()
epoch_mins, epoch_secs = epoch_time(start_time, end_time)
if valid_loss < best_valid_loss:
best_valid_loss = valid_loss
torch.save(model.state_dict(), 'tut5-model.pt')
print(f'Epoch: {epoch+1:02} | Epoch Time: {epoch_mins}m {epoch_secs}s')
print(f'\tTrain Loss: {train_loss:.3f} | Train Acc: {train_acc*100:.2f}%')
print(f'\t Val. Loss: {valid_loss:.3f} | Val. Acc: {valid_acc*100:.2f}%')
,我收到以下错误
RuntimeError: "log_softmax_lastdim_kernel_impl" not implemented for 'torch.LongTensor'
指向:
<ipython-input-38-9c6cff70d2aa> in train(model, iterator, optimizer, criterion)
14 print('pred'+ predictions.type())
15 #batch.label = batch.label.type(torch.LongTensor)
---> 16 loss = criterion(predictions.long(), batch.label)**
此处发布的解决方案https://github.com/pytorch/pytorch/issues/14224建议我需要使用 long/int。
我必须.long()
在行添加**
才能修复这个早期的错误:
RuntimeError: Expected object of scalar type Long but got scalar type Float for argument #2 'target'
具体的代码行是:
def train(model, iterator, optimizer, criterion):
epoch_loss = 0
epoch_acc = 0
model.train()
for batch in iterator:
optimizer.zero_grad()
predictions = model(batch.text)
print('pred'+ predictions.type())
#batch.label = batch.label.type(torch.LongTensor)
loss = criterion(predictions.long(), batch.label)**
acc = categorical_accuracy(predictions, batch.label)
loss.backward()
optimizer.step()
epoch_loss += loss.item()
epoch_acc += acc.item()
return epoch_loss / len(iterator), epoch_acc / len(iterator)
注意,**原来是loss = criterion(predictions, batch.label)
还有其他解决此问题的建议吗?
解决方案
criterion
torch.nn.CrossEntropyLoss()
在你的notebook中定义。如文档中所述CrossEntropyLoss
,它期望模型为每个“K”类返回的概率值和地面实况标签的相应值作为输入。现在,概率值是浮点张量,而真值标签应该是表示类的长张量(类不能是浮点数,例如 2.3 不能表示类)。因此:
loss = criterion(predictions, batch.label.long())
应该管用。
推荐阅读
- facebook-share - facebook分享按钮不显示图像
- jquery - 将 json 对象传递给 restController 时出现 400(错误请求)
- maven - 从命令提示符执行时找不到类和 SurefireBooterForkException
- c - 在c中生成随机素数的程序?
- stm32 - USART 与 STM32F373VCt6
- c++ - 双链表混淆
- npm-install - “运行 `npm audit` 以获取更多详细信息” 警告
- c# - 中毒队列的到期日期
- python - 删除熊猫数据框上的索引和列
- java - 从 CustomListViewAdapter 获取和设置全局变量