原文: 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)