dill を使用してデータセット/データローダーを保存およびロードする

原文: https://mp.weixin.qq.com/s/TStrHMbgDjPIsXaPK6-VSQ

ディル 1個

pickle/dillオブジェクトなどのほとんどの Python データ形式を保存するために使用できます。pickle はlambda関数やシリアル化されたオブジェクトなどを保存できませんが、dill保存することはできます。

ピクルスとディルの使い方は同じです。

ディルの特徴:

1) 下記の標準タイプが酸漬け可能です。

  • none、type、bool、int、long、float、complex、str、unicode、
  • タプル、リスト、辞書、ファイル、バッファ、組み込み、
  • 古いスタイルのクラスと新しいスタイルのクラス、
  • 新旧のスタイルのクラスのインスタンス、
  • セット、フローズンセット、配列、関数、例外

2) いくつかのユニークなタイプのピクルスもできます

  • 収量を伴う関数、入れ子関数、ラムダ、
  • セル、メソッド、unboundmethod、モジュール、コード、メソッドラッパー、
  • dictproxy、メソッド記述子、getset記​​述子、メンバー記述子、
  • ラッパーディスクリプタ、xrange、スライス、
  • 未実装、省略記号、終了

3) ただし、以下の種類は当面漬けることができません。

  • フレーム、ジェネレーター、トレースバック

4) ディルのその他の働き

  • Pythonインタープリタセッションの保存とロード
  • 関数とクラスからソース コードを保存および抽出する
  • 酸洗いエラーを対話的に診断する

次にディルの活用法をいくつか紹介します。

2 無名関数の保存

# !pip install dill
import dill

# 保存匿名函数
squared = lambda x: x**2
dill.loads(dill.dumps(squared))(3)

# 9

3 ソースコードを表示する

# 保存源码
import dill.source
print(dill.source.getsource(squared))

ipython でレポートしOSError: could not extract source code、次の形式に変更します。

code=dill.source.getsource(dill.detect.code(squared))
print(code)

# squared = lambda x: x**2

4 クラス Dataset、DataLoader を保存します

これにより、データの前処理が高速化されます。

# 保存class
from torch.utils.data import TensorDataset, DataLoader
import torch
from sklearn.datasets import make_classification

data, target = make_classification()
# data.shape, target.shape
# ((100, 20), (100,))

batch_size=10
dataset = TensorDataset(torch.from_numpy(data), torch.from_numpy(target))
dataloader = DataLoader(dataset, shuffle=False, drop_last=True, batch_size=batch_size)

セーブデータ:

dill.dump(dataset, './dataset_save.pkl')
dill.dump(dataloader, './dataloader_save.pkl')

直接保存するとエラーが発生します。TypeError: file must have a 'write' attribute

次の方法で保存するだけです。

with open('./dataset_save.pkl','wb') as f:
    dill.dump(dataset, f)

with open('./dataloader_save.pkl','wb') as f:
    dill.dump(dataloader, f)

ダウンロードデータ:

with open('./dataset_save.pkl','rb') as f:
    dataset_save = dill.load(f)

with open('./dataloader_save.pkl','rb') as f:
    dataloader_save = dill.load(f)

データ比較:

x, y = next(iter(dataloader))
x_save, y_save = next(iter(dataloader_save))
torch.equal(x, x_save), torch.equal(y, y_save)
# (True, True)

おすすめ

転載: blog.csdn.net/mengjizhiyou/article/details/127251705