5

スクリプトをセットアップしていますが、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

私のパスは次のように定義されています。

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

関数を次のように呼び出します。 model = load_learner(folder_path, fname)

この関数で Windows パスを使用するにはどうすればよいですか?


更新 1

投稿された回答は、Linux でのみ正しかったです。Windowsでまだ問題があります。Windows で PosixPath を通過する方法が見つかりませんでした。私が見つけた唯一の解決策は、モジュールから内部パッケージを変更することですが、この種の問題を解決する安全な方法ではありません。


前もって感謝します。

4

7 に答える 7

0

ここでの問題は、OS に応じて Python がパスを処理する方法の違いに関連しています。

  • PosixPath- Linux / Unix の場合

  • WindowsPath- Windows の場合

1 つの OS (この場合のように Linux など)を使用してオブジェクトを永続化するpickle場合、型/クラスに関する情報も永続化されます (ここでは: PosixPath)。

ここで、pickle ファイルがロードされると、Python は、以前に永続化された型情報に基づいてオブジェクトを再作成できると想定します。この場合、ライブラリPosixPathによって妨げられpathlib、Windows でインスタンス化できないタイプのオブジェクトを再作成しようとします。WindowsWindowsPathでは代わりに使用する必要がありますが、pickleモジュールはそのような OS 依存のロジックをうまく処理できないため、どうしようもなくエラーをスローします。

理論的には のコードに干渉しpathlibて OS チェックを削除することはできますが、簡単な回避策はありませんが、OS に依存するオブジェクトのピクルを回避することです (たとえば、パスを文字列として保存する場合と同様に、os.pathこの問題は確実に回避されます)。

PurePosixPathパス オブジェクトにプラットフォームに依存しないクラスを使用するという別の可能性もあります。

于 2020-07-10T14:58:29.603 に答える
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()ください。OSに適したフォーマットを自動的に選択します。

于 2019-07-31T11:30:05.863 に答える
0

Windows で作業している場合、一時的に に設定できpathlib.PosixPathますWindowsPath。特に pickle のロード中に例外が発生した場合は、元の値に戻すことが重要です。

簡単な方法は、次のことtry / finallyです。

posix_backup = pathlib.PosixPath
try:
    pathlib.PosixPath = pathlib.WindowsPath
    learn_inf = load_learner(EXPORT_PATH)
finally:
    pathlib.PosixPath = posix_backup

何度も行う場合は、次のように流れをスムーズにすることができます。

  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

そして、次のように使用します。

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

with set_posix_windows():
    learn_inf = load_learner(EXPORT_PATH)

... また、ソフロスからの回答を確認してください: https://stackoverflow.com/a/62836990/1603480

于 2021-08-16T02:14:45.380 に答える