我正在设置一个脚本,我需要使用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路径?
发布的答案仅在Linux上是正确的。我在Windows上仍然有问题。我没有找到在Windows上通过PosixPath的方法。我发现的唯一解决方案是更改模块中的内部软件包,但这不是解决此类问题的安全方法。
谢谢。
答案 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')
此解决方案仅在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