【问题标题】:How to read a ckpt file with python3, while it is saved using python2?python3读取ckpt文件,python2保存时,如何读取ckpt文件?
【发布时间】:2018-08-03 14:43:33
【问题描述】:

我尝试使用 pyTorch 读取检查点文件

checkpoint = torch.load(xxx.ckpt)

该文件是由使用 python 2.7 编写的程序生成的。我尝试使用 python 3.6 读取文件,但出现以下错误

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

是否可以在不降级python的情况下读取文件?

【问题讨论】:

    标签: python pytorch


    【解决方案1】:

    pickle 在 Python 2.x 和 Python 3.x 之间存在一些兼容性问题,由于迁移到 unicode,您可能将字符串保存为模型的一部分,这就是您看到该错误的原因。

    您可以按照推荐的方式在 Pytorch 中保存模型并执行以下操作:

    torch.save(filename, model.state_dict())
    

    而不是保存model。然后在 Python3 中:

    model = Model() # construct a new model
    model.load_state_dict(torch.load(filename))
    

    另一种方法是在 Python 2 中 unpickle 并将其保存为另一种更容易在 Python 2 和 Python 3 之间传输的格式。例如,您可以使用 Pytorch-Numpy 桥来保存架构的张量并使用 np.savez .

    您也可以尝试使用pickle 代替torch.loadtell it to decode ASCII strings to Python3 strings

    【讨论】:

    • 好吧,pickle 不起作用。它只是生成一个整数。
    • 您能否提供您正在保存的模型的代码以及您如何保存它?我很难调试我无法重现的东西
    【解决方案2】:

    最终我解决了这个问题

    1) 使用anaconda创建python2环境

    2) 使用pytorch读取检查点文件,然后使用pickle保存

    checkpoint = torch.load("xxx.ckpt")
    with open("xxx.pkl", "wb") as outfile:
        pickle.dump(checkpointfile, outfile)
    

    3)回到python3环境,使用pickle读取文件,使用pytorch保存文件

    pkl_file = open("xxx.pkl", "rb")
    data = pickle.load(pkl_file, encoding="latin1")
    torch.save(data, "xxx.ckpt")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-10
      • 1970-01-01
      相关资源
      最近更新 更多