【已解决】RuntimeError: “nll_loss_forward_reduce_cuda_kernel_2d_index“ not implemented for ‘Float‘

前情描述

        这次要讲的问题很是有含金量,一是打破了之前固有的不要改库函数的思想,二是提供了一个分析问题的解决途径。

问题描述

        这次的问题在之前几篇有意无意的提起过,但因为当时没有很好的解决办法,所以这块就没有展开去说,问题是什么呢?在用配置文件noise.yaml、content.yaml、unrelated.yaml、frontier_stitching.yaml来进行训练模型加水印时报错RuntimeError: "nll_loss_forward_reduce_cuda_kernel_2d_index" not implemented for 'Float',这个在网上并没有找到解决办法,有的也只是RuntimeError: "nll_loss_forward_reduce_cuda_kernel_2d_index" not implemented for 'int',也就是说之前因为int类型不兼容出了问题,那这个float报错的原因是什么呢?

原因分析及解决

        仔细分析会发现,在RuntimeError: "nll_loss_forward_reduce_cuda_kernel_2d_index" not implemented for 'int'的解决办法中提到的是应该输入float或者double而不是int,所以在输入int的时候会出现这个问题,但是呢我这里边输入的就是float啊,为什么会报这种错误呢?这个原因想了很久我都没有想明白。经过各种打印输出也很能确定的是:我的输入类型就是float:

        那就奇了怪了,他需要的是float,我输入的也是float,但是却一直报错RuntimeError: "nll_loss_forward_reduce_cuda_kernel_2d_index" not implemented for 'Float'。

        于是不得不求助大佬,上来就说是类型的问题,当然这个我是知道的,就是犯迷糊,那为什么我给了他想要的,程序不给我我想要的呢?

        只见大佬一个操作,解决了我的疑问:

         原来导致问题的一直是问题本身,因为这本来就是一个误解的问题,我没想到啊万万没想到啊,输入的另外一个参数时需要long而不是float,这不是大水冲了龙王庙吗?代码本身是个多参数,能看到的形式只有一个包装后的

        所以这个封装的就很深,能想到的一个解决办法就是直接在torch包里进行修改target.dtype,这是个很大胆的行为,因为之前还真没改过torch包本身的东西,修改的话可能会导致其他引用的包出现问题,这是不可避免的。所以需要谨慎一些。

        知道了这个原因只需要把torch包的给改掉就行了:也就是进行强制类型转换

target=target.type(torch.long)

         这个时候再运行的话就会报另外一个错误:no module named torch,因为这里平白引入了这个torch嘛,所以在最开头或者是引用的位置要执行下面操作:

import torch

        不用担心是在torch的包下还import torch可不可行,答案是肯定的,因为python模块的引用嘛。做完这些,程序就可以运行了,很瓦塞。

延伸阅读

        使用pyhon时必然会用到各种各样的库,特别是有些流行的库,不得不用,但又不能很好的满足我们的需求,这时就需要对库进行修改,那么如何修改呢?

        最好的方式是不直接修改库代码,而是在我们的项目中新建一个自己的类去继承这个库,然后修改需要修改的方法去覆盖原有的方法,不然会影响所有使用这个库的项目。
Python雕虫小技:修改库 - 知乎使用pyhon时必然会用到各种各样的库,特别是有些流行的库,不得不用,但又不能很好的满足我们的需求,这时就需要对库进行修改,那么如何修改呢? 最好的方式是不直接修改库代码,而是在我们的项目中新建一个自己的…icon-default.png?t=N7T8https://zhuanlan.zhihu.com/p/485263605#:~:text=%E4%BD%BF%E7%94%A8pyhon%E6%97%B6%E5%BF%85%E7%84%B6%E4%BC%9A%E7%94%A8%E5%88%B0%E5%90%84%E7%A7%8D%E5%90%84%E6%A0%B7%E7%9A%84%E5%BA%93%EF%BC%8C%E7%89%B9%E5%88%AB%E6%98%AF%E6%9C%89%E4%BA%9B%E6%B5%81%E8%A1%8C%E7%9A%84%E5%BA%93%EF%BC%8C%E4%B8%8D%E5%BE%97%E4%B8%8D%E7%94%A8%EF%BC%8C%E4%BD%86%E5%8F%88%E4%B8%8D%E8%83%BD%E5%BE%88%E5%A5%BD%E7%9A%84%E6%BB%A1%E8%B6%B3%E6%88%91%E4%BB%AC%E7%9A%84%E9%9C%80%E6%B1%82%EF%BC%8C%E8%BF%99%E6%97%B6%E5%B0%B1%E9%9C%80%E8%A6%81%E5%AF%B9%E5%BA%93%E8%BF%9B%E8%A1%8C%E4%BF%AE%E6%94%B9%EF%BC%8C%E9%82%A3%E4%B9%88%E5%A6%82%E4%BD%95%E4%BF%AE%E6%94%B9%E5%91%A2%EF%BC%9F,%E6%9C%80%E5%A5%BD%E7%9A%84%E6%96%B9%E5%BC%8F%E6%98%AF%E4%B8%8D%E7%9B%B4%E6%8E%A5%E4%BF%AE%E6%94%B9%E5%BA%93%E4%BB%A3%E7%A0%81%EF%BC%8C%E8%80%8C%E6%98%AF%E5%9C%A8%E6%88%91%E4%BB%AC%E7%9A%84%E9%A1%B9%E7%9B%AE%E4%B8%AD%E6%96%B0%E5%BB%BA%E4%B8%80%E4%B8%AA%E8%87%AA%E5%B7%B1%E7%9A%84%E7%B1%BB%E5%8E%BB%E7%BB%A7%E6%89%BF%E8%BF%99%E4%B8%AA%E5%BA%93%EF%BC%8C%E7%84%B6%E5%90%8E%E4%BF%AE%E6%94%B9%E9%9C%80%E8%A6%81%E4%BF%AE%E6%94%B9%E7%9A%84%E6%96%B9%E6%B3%95%E5%8E%BB%E8%A6%86%E7%9B%96%E5%8E%9F%E6%9C%89%E7%9A%84%E6%96%B9%E6%B3%95%EF%BC%8C%E4%B8%8D%E7%84%B6%E4%BC%9A%E5%BD%B1%E5%93%8D%E6%89%80%E6%9C%89%E4%BD%BF%E7%94%A8%E8%BF%99%E4%B8%AA%E5%BA%93%E7%9A%84%E9%A1%B9%E7%9B%AE%E3%80%82

完结撒花

        当然除了这个之外还有其他的问题,我们在后面的博客中继续讲。

  • 15
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值