pytorch 定义torch类型数据_[错误汇总]torch.load加载模型报错;cuda数据类型报错

在PyTorch中遇到加载模型时的UnicodeDecodeError,原因是Python 2与3的版本差异。解决方案是在`torch.load`时添加`encoding='bytes'`参数。此外,RuntimeError提示数据类型不符,需要将数据转为`torch.cuda.FloatTensor`,但直接在变量后加`.cuda()`可能无效,应使用`var = var.cuda()`。注意这些细节可避免错误并确保模型正常运行。
摘要由CSDN通过智能技术生成

a0a6a1c82cf68c65d511e233445c627b.png
  1. torch.load加载模型报错 :

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1124: ordinal not in range(128)

原因是:Pytorch在加载模型时候,如果训练保存模型的python环境是2.7,然而在python3的环境中去load模型,就会出现上面的错误。

解决办法:

ascii codec cant decode byte 0xc3 ..._人工智能_zhucuankuan2669的博客-CSDN博客​blog.csdn.net
a1a72f8f4d314dd1e121a3be5a0ed98d.png

1e8043778022d0df63fd18e11f3f65ae.png
from functools import partial
import pickle
pickle.load = partial(pickle.load, encoding="latin1")
pickle.Unpickler = partial(pickle.Unpickler, encoding="latin1")
model = torch.load(model_file, map_location=lambda storage, loc: storage, pickle_module=pickle)

加入上面这些代码即可,一招制敌!太感谢了!!!!

4f55a30d388869eba2559e5574e9e6ed.png

另外:有的人使用 cPickle.load()加载模型,也会报这个错误,原因也是python2,python3版本问题。

解决方法:

ascii codec cant decode byte 0x90 in position 614: ordinal not in_Python_一个处女座的程序猿-CSDN博客​blog.csdn.net
9eaea9ebe1378887a599cba07ce32410.png

将 training_data, validation_data, test_data = cPickle.load(f)

改为即可,training_data, validation_data, test_data = cPickle.load(f,encoding='bytes')

加上encoding='bytes'就行了

2.RuntimeError: Expected a Tensor of type torch.cuda.FloatTensor but found a type torch.FloatTensor for s

需要传入一个cuda类型数据,但是实际传入的却不是cuda类型。

RuntimeError: Expected object of type torch.cuda.FloatTensor but found type torch.FloatTensor for ar​blog.csdn.net
0e8b325458607be88d204bf53785bcca.png

意思是要求的目标类型是torch.cuda.FloatTensor,但是找到的数据类型是torch.FloatTensor,所以需要在数据类型后面加上.cuda()。将predict = model(Variable(x_train)) 改为predict = model(Variable(x_train.cuda()))

但是,我加上.cuda()依然报这个错,怎么办呢?就把传入的数据的.cuda()删掉就好了。因为这个参数之前加了.cuda(),可能检测到这一点,所以需要传入cuda类型,但不知道为什么它实际上不是cuda类型,所以把之前的.cuda()删了就不报错了,但是可能也慢了……但是主要不是为了不报错嘛,哈哈

后面我发现我在变量后面直接加 .cuda() —> var.cuda(),是没用的,但是

var = var.cuda() ,却可以!不知道为什么,可能我漏掉了什么细节吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值