Keras "pickle_safe":在 Python 中成为 "pickle safe" 或 "non picklable" 是什么意思?

Keras "pickle_safe": What does it mean to be "pickle safe", or alternatively, "non picklable" in Python?

Keras fit_generator() 有一个参数 pickle_safe,默认为 False
如果 pickle_safe,训练可以 运行 更快,因此将标志设置为 True ?

根据Kera's docs

pickle_safe: If True, use process based threading. Note that because this implementation relies on multiprocessing, you should not pass non picklable arguments to the generator as they can't be passed easily to children processes.

我不太明白这是什么意思。
如何确定我的参数是 pickle_safe 还是不是 ??

如果相关:
- 我正在传递自定义生成器
- 生成器函数接受参数:X_train、y_train、batch_size、p_keep;
它们的类型是 np.array, int, float)
- 我没有使用 GPU
- 另外,我使用的是 Keras 1.2.1,尽管我相信这个论点的行为与 keras 2

中的行为相同

我对keras不熟悉,但是看了一下文档,pickle_safe只是意味着你的生成器生成的元组必须是"picklable".

pickle 是一个标准的 python 模块,用于序列化和反序列化对象。标准 multiprocessing 实现使用 pickle 机制在不同进程之间共享对象——因为两个进程不共享相同的地址 space,它们不能直接看到相同的 python 对象。因此,为了将对象从进程 A 发送到进程 B,它们在 A 中被 pickle(以特定的众所周知格式生成字节序列),然后 pickle 格式通过进程间通信机制发送到 B,并且在 B 中 unpickled,在 B 的地址 space.

中生成 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 产生一个字节串。我们现在可以使用 loads:

从字节字符串将 foo 对象重构为 bar
>>> 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)

如果某些东西不可腌制,你会得到一个例外。例如,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