我不熟悉keras
,但是从文档来看,pickle_safe
只是意味着生成器生成的元组必须是“picklable”。
pickle
是一个标准的Python模块,用于序列化和反序列化对象。标准multiprocessing
实现使用pickle
在不同进程之间共享对象的机制——由于两个进程不共享相同的地址空间,因此它们无法直接看到相同的Python对象。因此,要将对象从进程 A 发送到进程 B,它们在 A 中进行腌制(以特定的众所周知的格式生成一系列字节),然后通过进程间通信机制将腌制的格式发送到 B,并且在 B 中进行 unpickled,在 B 的地址空间中生成 A 的原始对象的副本。
因此,要发现您的对象是否可腌制,只需调用,例如: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
产生一个字节字符串。我们现在可以重构foo
字节字符串中的对象为bar
using loads
:
>>> 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)
如果某些东西不可picklable,你会得到一个例外。例如,lambda 不能被 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 https://docs.python.org/3.5/library/pickle.html?highlight=pickle#what-can-be-pickled-and-unpickled