RuntimeError: "nll_loss_forward_reduce_cuda_kernel_2d_index" not implemented for 'Int'
今天有空,把之前遇到的问题总结一下。
问题Traceback详情
Traceback (most recent call last):
File "E:/MyWorkspace/EEG/Pytorch/Train.py", line 79, in <module>
opti='Adam')
File "E:\MyWorkspace\EEG\Pytorch\Utils.py", line 133, in TrainTest_Model
validation_loss, validation_acc = Test_Model(net, testloader, criterion,True)
File "E:\MyWorkspace\EEG\EEGLearn-Pytorch\Utils.py", line 82, in Test_Model
loss = criterion(outputs, labels.cuda())
File "D:\coson\anaconda3\envs\pytorch\lib\site-packages\torch\nn\modules\module.py", line 1130, in _call_impl
return forward_call(*input, **kwargs)
File "D:\coson\anaconda3\envs\pytorch\lib\site-packages\torch\nn\modules\loss.py", line 1166, in forward
label_smoothing=self.label_smoothing)
File "D:\coson\anaconda3\envs\pytorch\lib\site-packages\torch\nn\functional.py", line 3014, in cross_entropy
return torch._C._nn.cross_entropy_loss(input, target, weight, _Reduction.get_enum(reduction), ignore_index, label_smoothing)
RuntimeError: "nll_loss_forward_reduce_cuda_kernel_2d_index" not implemented for 'Int'
Process finished with exit code 1
关键错误在criterion(outputs, labels.cuda())
,在本工程中criterion运行时给的值CrossEntropyLoss类实例,即: criterion = nn.CrossEntropyLoss()
,因此该错误是在loss计算的时候发生的,原因就是类型不匹配,那个参数类的类型不匹配呢?(其实就是labels类型不匹配,手动给的参数中,我这labels是int32即Int,所以很好判定,但如果不知道,怎么办,接着往下看)
看到torch\nn\modules\loss.py的1166行,即label_smoothing=self.label_smoothing
,该1166行是函数调用部分代码,完整代码如下:
def forward(self, input: Tensor, target: Tensor) -> Tensor:
return F.cross_entropy(input, target, weight=self.weight,
ignore_index=self.ignore_index, reduction=self.reduction,
label_smoothing=self.label_smoothing)
打开cross_entropy
定义头,看到如下:
def cross_entropy(
input: Tensor,
target: Tensor,
weight: Optional[Tensor] = None,
size_average: Optional[bool] = None,
ignore_index: int = -100,
reduce: Optional[bool] = None,
reduction: str = "mean",
label_smoothing: float = 0.0,
) -> Tensor:
我们传入的参数对应cross_entropy
的input
和target
,定义中没有指出input和target数值类型,到底是哪个参数不匹配,接着在cross_entropy
函数往下看,发现其调用了C函数,芭比Q了,
torch._C._nn.cross_entropy_loss(input, target, weight, _Reduction.get_enum(reduction), ignore_index, label_smoothing)
看不到这个C函数的底层实现,如何办,看看官方给函数说明和例子吧,峰回路转,发现在cross_entropy
函数说明中有以下例子:
input = torch.randn(3, 5, requires_grad=True)
target = torch.randint(5, (3,), dtype=torch.int64)
loss = F.cross_entropy(input, target)
loss.backward()
官方给的target用的int64,即long类型
所以可以断定`criterion(outputs, labels.cuda())`中的labels参数类型造成。
由上,我们可以对labels参数类型做转为:
```python
labels.long().cuda()
criterion(outputs, labels.long().cuda())
修改后,代码正常运行。
我们为大型强子对撞机运行II中的成对产生的壁虎和胶合糖的横截面提供了最新的预测。 首先,我们使用NNPDF3.0NLO全局分析更新基于NLO + NLL子截面的计算。 这项研究包括对来自高阶,PDF和强耦合的理论不确定性的全面描述。 然后,我们探索使用NLO + NLL阈值恢复来计算最近的NNPDF3.0 PDF的含义。 我们发现,由阈值改进的PDF导致的结果偏移在基于NLO PDF的计算的总理论不确定性范围内。 但是,我们还观察到,NLO + NLL横截面的中心值以定性和定量方式进行了修改,说明了使用阈值改进的PDF和恢复的部分截面的相关性和影响。 基于NNPDF3.0NLO的更新的NLO + NLL横截面以NLL-fast格式公开提供,并且应该是解释运行II中对超对称粒子的解释的重要成分。
main.py:主文件,设置超参数,执行训练,保存模型检查点等
BNN.py:异方差神经网络的类定义
gaussian_nll_loss_class.py:高斯负对数似然损失
anchor_loss.py:锚点丢失
RMSE.py:均方根误差损失
训练单个神经网络
python main.py(默认值:种子= 0,开始时期= 0)
python main.py -s 42(使用种子= 42播种训练过程)
python main.py -s 42 -c 1000(从预先保存为epoch = 1000的模型开始训练过程)
可以通过唯一地播种该合奏的每个成员并运行'python main.py -s(seed)'来训练一个合奏。
python 3.6.8
pytorch 1.
运行pytorch在计算cross_entropy的loss遇到报错
RuntimeError: "nll_loss_forward_reduce_cuda_kernel_2d_index" not implemented for 'Int'`
原因是pytorch自带的损失计算函数不支持原本的标签1,2,3,4…,n,需要转换成网络需要的one_hot编码才行
具体代码如下
one_hot = torch.zeros(np.array(batch_size, num_class, device=tor
Traceback (most recent call last):
File "/home/hgx/pycharm-2020.1.3/plugins/python/helpers/pydev/_pydevd_bundle/pydevd_exec2.py", line 3, in Exec
exec(exp, global_vars, lo
Traceback (most recent call last):
File "D:\nlp\zhinengyunwei\wh_lstm_pytorch.py", line 213, in <module>
loss = loss_func(torch.squeeze(output), target)
File "D:\ProgramData\Anaconda3\lib\site-packages\torch\nn\modules\module.py", line 1102,
在模型调试阶段,如果定位不出具体的错误,建议将模型放在CPU上进行调试,这样荣誉i做9分类,在CPU上调试时,报的错误是
从报错的信息可以看出,是计算损失函数时出错了,但是在GPU上进行调试时,根本不容易定位到具体错误,如下:
从这个报错来看,非专业人士几乎看不懂从报错来看,是标签超出了界限,作9分类,我的标签是从1开始的,所以会报错,将标签改为从0开始就解决问题了...
解决RuntimeError: _thnn_mse_loss_forward is not implemented for type torch.cuda.LongTensor和scatter_方法
在PyTorch中遇到了如标题的问题,网上大多数给的是类型不匹配问题,在stackoverflow找到了问题的答案,这里出现的问题是因为loss需要one-hot类型的数据,而我们使用的是类别标签。
什么是one-hot?
一个例子解释什么是one-hot,对于5分类问题,我们使用[0,0,1,0,0]来表示这个实例是属于第三个类别的,等价于类别标签[2](从0对类别编码)。关于one-hot的好...
报错显示:
RuntimeError: cuda runtime error (710) : device-side assert triggered at C:/cb/pytorch_1000000000000/work/aten/src\THC/generic/THCTensorMath.cu:29
用gpu运行不能显示出真正的错误原因,把模型和数据放在cpu上运行显示:
return torch._C._nn.cross_entropy_loss(input, target, weight, _Re
RuntimeError: "nll_loss_forward_reduce_cuda_kernel_2d_index" not implemented for 'Int'
这个错误通常是由于数据类型不匹配导致的。在 PyTorch 中,`nll_loss` 函数的输入参数通常是浮点数类型的张量,而不是整数类型的张量。
你可以尝试将输入张量转换为浮点数类型,例如使用 `.float()` 方法将整数类型的张量转换为浮点数类型的张量:
```python
import torch
# 创建一个整数类型的张量
x = torch.tensor([1, 2, 3], dtype=torch.int)
# 将整数类型的张量转换为浮点数类型的张量
x = x.float()
# 使用 nll_loss 函数对张量进行计算
loss = torch.nn.functional.nll_loss(x, ...)
如果你仍然遇到问题,请提供更多的上下文和代码,以便更好地帮助你解决问题。
Initialization of bean failed; nested exception is org.springframework.aop.framework.AopConfigExcept
RuntimeError: “nll_loss_forward_reduce_cuda_kernel_2d_index“ not implemented for ‘Int‘
静春525:
UnsupportedFileSystemSchemeException: Could not find a file system implementation for scheme ‘s3‘
YY_pdd:
Nelder Mead SIMPLEX Algorithm
C++攻程狮:
pyflink提交执行报错ImportError: No module named pyflink
weixin_39135658: