我正在设置一个脚本,我需要使用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。我找到的唯一解决方案是从我的模块中更改内部包,但它不是解决这种问题的安全方法。
先谢谢你了。
8条答案
按热度按时间nimxete21#
将
PosixPath
重定向到WindowsPath
。我也在加载
fastai
模型,这个技巧很有效。rekjcdws2#
根据我自己的问题,我找到了一种方法:
更新1
这个解决方案只适用于Linux,在Windows上我仍然得到一个错误。
93ze6v8z3#
在Windows上工作时,您可以临时将
pathlib.PosixPath
设置为WindowsPath
。重要的是恢复到原始值,特别是在加载pickle期间出现异常时。一个简单的方法是执行
try / finally
:如果你经常这样做,你可以让流程更流畅,如下所示:
1.定义一个可以临时执行更改的函数
1.在
with
块中使用它您可以将其添加到某个地方(如果使用Jupyter,则可以将其添加到脚本或专用单元格的顶部)。
然后,就像这样使用它:
......同时,检查sophros的答案:https://stackoverflow.com/a/62836990/1603480
hjqgdpho4#
根据提供的错误信息,您使用的是
pathlib
。因此您不需要在这里使用+ '/' +
:str(path) + '/' + str(fname)
/
作为路径分隔符在Linux/Unix上工作:在Windows上使用
.joinpath()
:如果您不打算使用
pathlib
,请使用os.path.join()
。它会自动为您的操作系统选择正确的格式。snvhrwxg5#
这里的问题与Python根据操作系统处理路径的方式的差异有关:
PosixPath
-在Linux / Unix上WindowsPath
-在Windows上当在一个操作系统上使用
pickle
持久化对象时(比如Linux -就像在本例中一样),有关类型/类的信息也会持久化(这里:PosixPath
)。现在,当pickle文件被加载时,Python假设它将能够基于它先前持久化的类型信息重新创建对象。在这种情况下,它试图重新创建
PosixPath
类型的对象,该对象被pathlib
库阻止并且不能在Windows上示例化。在Windows上应该使用WindowsPath
,但是pickle
模块不能很好地处理这种依赖于操作系统的逻辑,因此它无助地抛出错误。理论上,你可以干预
pathlib
的代码来删除操作系统检查,但没有简单的解决方法,而是避免对依赖于操作系统的对象进行pickle(例如,将路径存储为字符串-就像os.path
一样-肯定会解决这个问题)。There is also another possibility-为path对象使用一个独立于平台的
PurePosixPath
类。wtzytmuj6#
对于posix路径错误:当你在colab/gradient上训练你的模型并下载它,然后在Windows上进行推理。
将
PosixPath
重定向到WindowsPath
:omqzjyyz7#
我正在做同样的工作-将fastai模型部署为Web服务器,遇到了同样的问题,这就是我所做的......在导出模型时,使用joblib或pickle来pickle模型,而不是使用learn.export(),并在服务器中使用以下代码。
通过这样做,它能够解决路径问题,但由于模型是使用GPU训练的,因此它会给出错误,要求将存储Map到CPU
tez616oj8#
在windows上使用此方法在本地使用fastai: