2017-05-02 3 views
3

Keras fit_generator()의 매개 변수는 pickle_safe이며 기본값은 False입니다.
이 pickle_safe 인이면 훈련이 더 빨리 실행될 수 있으므로 플래그를 True으로 설정 하시겠습니까? Kera's docs에 따르면Keras "pickle_safe": 파이썬에서 "pickle safe"또는 "non picklable"이라는 것은 무엇을 의미합니까?

:

pickle_safe : true의 경우, 사용 과정을 기반으로 스레딩. 이 구현은 멀티 프로세싱에 의존하기 때문에 자식 프로세스에 쉽게 전달할 수 없으므로 선택 불가능한 인수를 생성기로 전달하면 안됩니다.

나는 이것이 무엇을 말하는지 정확히 이해하지 못합니다.
내 인수가 pickle_safe인지 또는인지 어떻게 알 수 있습니까 ??

가 관련이있는 경우 :
- 나는 정의 생성기
전달 해요 - 발전기 함수가 인수를 취합니다 X_train, y_train, BATCH_SIZE, p_keep;
그들은 np.array, int, float 유형입니다.
- GPU를 사용하지 않습니다.
- 또한 Keras 1.2.1을 사용하고 있습니다.이 인수는 keras 2와 동일하게 동작한다고 생각합니다.

답변

1

나는 keras에 더 익숙하지 않지만, 문서에서 한 눈에에서, pickle_safe은 발전기에 의해 생성 된 튜플은 "picklable"해야한다는 것을 의미한다.

pickle은 개체를 serialize 및 unserialize하는 데 사용되는 표준 파이썬 모듈입니다. 표준 multiprocessing 구현은 다른 프로세스간에 객체를 공유하기 위해 pickle 메커니즘을 사용합니다. 두 프로세스가 동일한 주소 공간을 공유하지 않기 때문에 동일한 파이썬 객체를 직접 볼 수 없습니다. 따라서 프로세스 A에서 프로세스 B로 개체를 보내려면 A (특정 잘 알려진 형식의 바이트 순서를 생성 함)로 절인 다음 pickled 형식을 프로세스 간 통신 메커니즘을 통해 B로 보냅니다. B에서 언 패킹되어 B의 주소 공간에 A의 원본 객체 사본을 생성합니다.

따라서 개체가 picklable인지 알아 보려면 말하자면 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를 사용 bar으로 바이트 문자열에서 foo 객체를 재구성 할 수 있습니다 뭔가 picklable없는 경우

>>> 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) 

, 당신은 예외를 얻을 것이다. 예를 들어, 람다는 절인 할 수 없습니다 https://docs.python.org/3.5/library/pickle.html?highlight=pickle#what-can-be-pickled-and-unpickled

+0

그것이 pickelable 있는지 확인하는 방법 주셔서 감사합니다 :

>>> 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>' 

더 많은 정보를 원하시면 설명서를 참조하십시오.나는 워드 프로세서를 읽었을 것이지만, 프로세싱, 스트림, 쓰레드 등은 아직 이해하지 못했다. 귀하의 제안은 테스트 할 수있는 좋은 방법입니다! – SherylHohman

+0

단순히'pickle_safe = True'를 설정하면 오류가 발생합니다 (적어도 제 경우에는) 객체가 실제로 pickle_safe가 아닙니다. 나는 일종의 침묵의 실패가있을 것이라고 추정했다. – SherylHohman

관련 문제