She*_*man 7 process pickle thread-safety python-multithreading keras
Keras fit_generator()有一个pickle_safe默认参数False.
如果是 pickle_safe,训练可以更快地运行,并相应地将标志设置为True?
根据Kera的文档:
pickle_safe:如果为True,则使用基于进程的线程.请注意,由于此实现依赖于多处理,因此不应将非可选参数传递给生成器,因为它们无法轻松传递给子进程.
我不明白这是什么意思.
我怎样才能确定我的论点是否pickle_safe存在?
如果它是相关的:
- 我传入一个自定义生成器
- 生成器函数接受参数:X_train,y_train,batch_size,p_keep;
它们的类型为np.array,int,float)
- 我没有使用GPU
- 而且,我使用的是Keras 1.2.1,但我相信这个参数与keras 2的行为相同
Gil*_*ton 12
我不熟悉keras,但是从文档看一眼,pickle_safe仅意味着您的生成器生成的元组必须是“可拾取的”。
pickle是一个标准的python模块,用于序列化和反序列化对象。标准multiprocessing实现使用该pickle机制在不同进程之间共享对象-由于两个进程不共享相同的地址空间,因此它们无法直接看到相同的python对象。因此,要将对象从进程A发送到进程B,将它们在A中进行腌制(这会以特定的众所周知的格式生成字节序列),然后通过进程间通信机制将腌制的格式发送给B,然后在B中解开,在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.'
>>>
Run Code Online (Sandbox Code Playgroud)
dumps产生一个字节字符串。现在,我们可以使用以下方法foo从字节字符串重构对象:barloads
>>> 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)
Run Code Online (Sandbox Code Playgroud)
如果某些东西无法腌制,您将获得一个例外。例如,不能腌制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>'
Run Code Online (Sandbox Code Playgroud)
请参阅文档以获取更多信息:https : //docs.python.org/3.5/library/pickle.html?highlight=pickle#what-can-be-pickled-and-unpickled
| 归档时间: |
|
| 查看次数: |
2961 次 |
| 最近记录: |