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

Ban*_*ras 4 python pickle pathlib pytorch fast-ai

我正在设置一个脚本,我需要使用 package.json 中的一些函数fast-ai。事实是,我在 Windows 上,当我定义路径时,fast-ainamed 中的函数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
Run Code Online (Sandbox Code Playgroud)

我的路径定义为:

folder_path = './models/model1'
fname = 'model.pkl'
Run Code Online (Sandbox Code Playgroud)

我把这个函数称为: model = load_learner(folder_path, fname)

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


更新 1

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


提前致谢。

Kum*_*Tea 11

只需重定向PosixPathWindowsPath.

import pathlib
temp = pathlib.PosixPath
pathlib.PosixPath = pathlib.WindowsPath
Run Code Online (Sandbox Code Playgroud)

我也在加载fastai模型,这个技巧有效。


Jea*_* T. 7

在 Windows 上工作时,您可以暂时设置pathlib.PosixPathWindowsPath. 恢复到原始值很重要,尤其是在加载pickle期间出现异常时。

一个简单的方法是执行以下操作try / finally

posix_backup = pathlib.PosixPath
try:
    pathlib.PosixPath = pathlib.WindowsPath
    learn_inf = load_learner(EXPORT_PATH)
finally:
    pathlib.PosixPath = posix_backup
Run Code Online (Sandbox Code Playgroud)

如果你经常这样做,你可以使流程更顺畅,如下所示:

  1. 定义一个可以临时进行更改的函数
  2. with在块中使用它

您可以将其添加到某处(如果您使用 Jupyter,则添加到脚本或专用单元的顶部)。

from contextlib import contextmanager
import pathlib

@contextmanager
def set_posix_windows():
    posix_backup = pathlib.PosixPath
    try:
        pathlib.PosixPath = pathlib.WindowsPath
        yield
    finally:
        pathlib.PosixPath = posix_backup
Run Code Online (Sandbox Code Playgroud)

然后,像这样使用它:

EXPORT_PATH = pathlib.Path("model.pkl")

with set_posix_windows():
    learn_inf = load_learner(EXPORT_PATH)
Run Code Online (Sandbox Code Playgroud)

...另外,检查 sophros 的答案:/sf/answers/4398589331/