我无法加载模型,因为无法放置PosixPath

时间:2019-07-31 08:33:10

标签: python pytorch fast-ai

我正在设置一个脚本,我需要使用fast-ai软件包中的一些功能。事实是我在Windows上,并且在定义路径时,来自fast-ai的名为load_learner的函数无法加载模型。

我尝试将功能更改为以下包:

state = pickle.load(open(str(path) + '/' + str(fname), 'rb'))

代替:

state = pickle.load(open(path/fname, 'rb'))

但我收到此错误:

 File "lib\site-packages\fastai\basic_train.py", line 462, in load_learner
    state = pickle.load(open(path/fname, 'rb'))
  File "\lib\pathlib.py", line 1006, in __new__
    % (cls.__name__,))
NotImplementedError: cannot instantiate 'PosixPath' on your system

我的路径定义为:

folder_path = './models/model1'
fname = 'model.pkl'

,我将该函数称为: model = load_learner(folder_path, fname)

如何在此功能中使用Windows路径?


更新1

发布的答案仅在Linux上是正确的。我在Windows上仍然有问题。我没有找到在Windows上通过PosixPath的方法。我发现的唯一解决方案是更改模块中的内部软件包,但这不是解决此类问题的安全方法。


谢谢。

6 个答案:

答案 0 :(得分:2)

只需将PosixPath重定向到WindowsPath

import pathlib
temp = pathlib.PosixPath
pathlib.PosixPath = pathlib.WindowsPath

我也正在加载fastai模型,此技巧有效。

答案 1 :(得分:0)

根据提供的错误消息,您正在使用pathlib。因此,您无需在此处使用+ '/' +str(path) + '/' + str(fname)

/作为路径分隔符在Linux / Unix上有效:

state = pickle.load(open(path / fname, 'rb'))

在Windows上,请使用.joinpath()

state = pickle.load(open(path.joinpath(fname), 'rb'))

如果您不打算使用pathlib,请使用os.path.join()。它将自动为您的操作系统选择正确的格式。

答案 2 :(得分:0)

根据我自己的问题,我找到了一种使用方法:

from pathlib import Path

folder_path = Path('./models/model1')

更新1

此解决方案仅在Linux上有效,在Windows上我仍然会出现错误。


答案 3 :(得分:0)

这里的问题与Python根据操作系统处理路径的方式不同有关:

  • PosixPath-在Linux / Unix上

  • WindowsPath-在Windows上

在一个操作系统上使用pickle持久化对象时(例如Linux-在这种情况下),有关类型/类的信息也将持久化(此处为PosixPath)。

现在,当加载pickle文件时,Python假定它将能够基于之前保留的类型信息来重新创建对象。在这种情况下,它尝试重新创建PosixPath库阻止的pathlib类型的对象,并且无法在Windows上实例化该对象。在Windows上,应该使用WindowsPath代替,但是pickle模块不能很好地处理此类与操作系统相关的逻辑,因此它会无助地引发错误。

从理论上讲,您可以干扰pathlib的代码来删除OS检查,但是没有简单的解决方法,但是要避免对OS依赖的对象进行酸洗(例如,像os.path那样将路径存储为字符串-肯定可以解决此问题)。

There is also another possibility-为路径对象使用平台无关的PurePosixPath类。

答案 4 :(得分:0)

我正在使用与Web服务器相同的部署fastai模型,并且遇到了相同的问题,这就是我所做的... 在导出模型时,请使用joblib或pickle来对模型进行酸洗,而不要使用learning.export(),在服务器中,请使用以下代码。

 __model = pickle.load(open(os.path.join('./artifacts/saved_model.pkl'), 'rb'))

这样做可以解决路径问题,但是由于模型是使用GPU训练的,因此会出现错误,要求将存储映射到CPU

答案 5 :(得分:0)

对于posix路径错误: 当您在colab /梯度上训练模型并下载时, 然后在Windows上进行推断。

只需将PosixPath重定向到WindowsPath

import pathlib

temp = pathlib.PosixPath
pathlib.PosixPath = pathlib.WindowsPath
相关问题