私はkeras
に精通していませんが、ドキュメントの一見から、pickle_safe
は、ジェネレータで生成されたタプルを "picklable"にする必要があることを意味します。
pickle
は、オブジェクトのシリアル化とシリアル化解除に使用される標準のPythonモジュールです。標準multiprocessing
の実装では、pickle
メカニズムを使用して、異なるプロセス間でオブジェクトを共有します.2つのプロセスが同じアドレス空間を共有しないため、同じPythonオブジェクトを直接見ることはできません。したがって、プロセスAからプロセスBにオブジェクトを送信するには、オブジェクトをA(特定のよく知られているフォーマットのバイトシーケンスを生成する)でピクルし、ピクルされたフォーマットをプロセス間通信メカニズムを介してBに送信し、 Bでアンピクルされ、Bのアドレス空間にAの元のオブジェクトのコピーを生成します。
オブジェクトがpicklableであるかどうかを調べるには、たとえばpickle.dumps
を呼び出します。
>>> import pickle
>>> class MyObject:
... def __init__(self, a, b, c):
... self.a = a
... self.b = b
... self.c = c
...
>>> foo = MyObject(1, 2, 3)
>>> pickle.dumps(foo)
b'\x80\x03c__main__\nMyObject\nq\x00)\x81q\x01}q\x02(X\x01\x00\x00\x00cq\x03K\x03X\x01\x00\x00\x00aq\x04K\x01X\x01\x00\x00\x00bq\x05K\x02ub.'
>>>
dumps
は、バイト文字列を生成する。私たちは今、loads
を使用してbar
としてバイト列からfoo
オブジェクトを再構築することができます
>>> foo_pick = pickle.dumps(foo)
>>> bar = pickle.loads(foo_pick)
>>> bar
<__main__.MyObject object at 0x7f5e262ece48>
>>> bar.a, bar.b, bar.c
(1, 2, 3)
何かがpickle化されていない場合、あなたは例外を取得します。例えば、ラムダは漬けすることはできません。
>>> class MyOther:
... def __init__(self, a, b, c):
... self.a = a
... self.b = b
... self.c = c
... self.printer = lambda: print(self.a, self.b, self.c)
...
>>> other = MyOther(1, 2, 3)
>>> other_pick = pickle.dumps(other)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: Can't pickle local object 'MyOther.__init__.<locals>.<lambda>'
は、詳細はドキュメントを参照してください: https://docs.python.org/3.5/library/pickle.html?highlight=pickle#what-can-be-pickled-and-unpickled
は、それがpickelableであるかどうかを確認する方法をありがとうございました。私はドキュメントを読んでいましたが、処理、ストリーム、スレッドなどはまだ理解していません。あなたの提案はテストに最適な方法です! – SherylHohman
'pickle_safe = True'を設定するだけでは、エラー(少なくとも私の場合)はオブジェクトが実際にpickle_safeではないことがわかります。私はある種の静かな失敗があると推測していた。 – SherylHohman