Process Keras“;泡菜“安全的”:“是”意味着什么;泡菜安全“;,或者,另一种选择是;“不可拾取”;用Python?

Process Keras“;泡菜“安全的”:“是”意味着什么;泡菜安全“;,或者,另一种选择是;“不可拾取”;用Python?,process,thread-safety,keras,pickle,python-multithreading,Process,Thread Safety,Keras,Pickle,Python Multithreading,Kerasfit_generator()有一个参数pickle_safe,默认为False 如果是pickle_安全的,培训可以运行得更快,并相应地将标志设置为True 根据: pickle\u safe:如果为True,则使用基于进程的线程。请注意,由于此实现依赖于多处理,因此不应将不可拾取的参数传递给生成器,因为它们无法轻松传递给子进程 我不太明白这是什么意思。 如何确定我的参数是否是pickle\u安全的 如果相关: -我正在传入一个自定义生成器 -生成器函数接受参数:X_列、y_列、批量

Keras
fit_generator()
有一个参数
pickle_safe
,默认为
False

如果是pickle_安全的,培训可以运行得更快,并相应地将标志设置为
True

根据:

pickle\u safe:如果为True,则使用基于进程的线程。请注意,由于此实现依赖于多处理,因此不应将不可拾取的参数传递给生成器,因为它们无法轻松传递给子进程

我不太明白这是什么意思。
如何确定我的参数是否是
pickle\u安全的

如果相关:
-我正在传入一个自定义生成器
-生成器函数接受参数:X_列、y_列、批量大小、p_保持
它们的类型为np.array、int、float)
-我没有使用GPU

-另外,我使用的是Keras 1.2.1,虽然我相信这个参数的行为与Keras 2中的行为相同,但我对Keras不太熟悉,但是从文档看,
pickle\u safe
只是意味着生成器生成的元组必须是“可拾取的”

pickle
是一个标准python模块,用于序列化和取消序列化对象。标准的
multiprocessing
实现使用
pickle
机制在不同的进程之间共享对象——因为两个进程不共享相同的地址空间,所以它们不能直接看到相同的python对象。因此,要将对象从进程A发送到进程B,需要在A中对其进行pickle处理(以特定的已知格式生成字节序列),然后通过进程间通信机制将pickle格式发送到B,并在B中取消pickle,在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.'
>>>
转储
生成一个字节字符串。现在,我们可以使用
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)
>foo\u pick=pickle.dumps(foo)
>>>bar=pickle.load(foo_-pick)
>>>酒吧
>>>酒吧a,酒吧b,酒吧c
(1, 2, 3)
如果某些东西不可拾取,则会出现异常。例如,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>'
>>类MyOther:
...   定义初始化(self,a,b,c):
...     self.a=a
...     self.b=b
...     self.c=c
...     self.printer=lambda:print(self.a、self.b、self.c)
...
>>>其他=MyOther(1,2,3)
>>>other_pick=腌菜。倾倒(其他)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
AttributeError:无法pickle本地对象“MyOther.\u初始化\u..”
有关更多信息,请参阅文档:

感谢您提供了一种检查它是否可拾取的方法。我读过文档,但是处理、流、线程等等我还不懂。你的建议是一个很好的测试方法!事实证明,简单地设置
pickle\u safe=True
也会抛出一个错误(至少在我的例子中是这样),对象实际上不是pickle\u安全的。我原以为会有某种无声的失败。。