process - Keras "pickle_safe": What does it mean to be "pickle safe", 或者 Python 中的 "non picklable"?

标签 process thread-safety keras pickle python-multithreading

凯拉斯 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只是意味着您的生成器生成的元组必须是“可 pickle 的”。
pickle是一个标准的python模块,用于序列化和反序列化对象。标准multiprocessing实现使用 pickle在不同进程之间共享对象的机制——由于两个进程不共享相同的地址空间,它们不能直接看到相同的 python 对象。因此,为了将对象从进程 A 发送到进程 B,它们在 A 中被 pickle (这会产生特定众所周知格式的字节序列),然后通过进程间通信机制将 pickle 格式发送到 B,然后在 B 中解压,在 B 的地址空间中生成 A 的原始对象的副本。

因此,要发现您的对象是否可 pickle ,只需调用 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使用 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)

如果某些东西不可 pickle ,你会得到一个异常(exception)。例如,不能 pickle lambda:
>>> 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

关于process - Keras "pickle_safe": What does it mean to be "pickle safe", 或者 Python 中的 "non picklable"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43730275/

相关文章:

c# - 启动流程然后引发事件以监视它们

c++ - 获取dylib模块的SizeOfImage和EntryPoint

multithreading - 如果两个thead同时锁定互斥锁,会发生什么情况?

c# - 锁定非线程安全的对象,这是可以接受的做法吗?

python - Keras:输入 0 与层 conv1d_5 不兼容:预期 ndim=3,发现 ndim=2

python - 使用经过训练的模型层在 keras 中创建另一个模型

python - 如何在 tensorflow 中进行最小池化?

process - 何时必须将信号插入进程的敏感列表中

c++ - CWnd::GetSafeHwnd() 和 CWnd::m_hWnd 是线程安全的吗?

vb.net - 将参数传递给 EXE