2017-05-02 12 views
3

Keras fit_generator()のパラメータはpickle_safeで、デフォルトはFalseです。
pickle_safeの場合、トレーニングはより速く実行できるため、フラグをTrueに設定しますか? Kera's docsによるとKeras "pickle_safe":Pythonで "pickle safe"、あるいは "pickable"とは何を意味しますか?

pickle_safe:Trueの場合、使用するプロセスベースのスレッド。この実装はマルチプロセッシングに依存しているため、子プロセスに簡単に渡すことができないため、pickableではない引数をジェネレータに渡すべきではないことに注意してください。

私はこれが何を言っているのか正確には分かりません。
引数が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は、オブジェクトのシリアル化とシリアル化解除に使用される標準のPythonモジュールです。標準multiprocessingの実装では、pickleメカニズムを使用して、異なるプロセス間でオブジェクトを共有します.2つのプロセスが同じアドレス空間を共有しないため、同じPythonオブジェクトを直接見ることはできません。したがって、プロセスAからプロセスBにオブジェクトを送信するには、オブジェクトをA(特定のよく知られているフォーマットのバイトシーケンスを生成する)でピクルし、ピクルされたフォーマットをプロセス間通信メカニズムを介して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オブジェクトを再構築することができます

>>> 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化されていない場合、あなたは例外を取得します。例えば、ラムダは漬けすることはできません。

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

+0

は、それがpickelableであるかどうかを確認する方法をありがとうございました。私はドキュメントを読んでいましたが、処理、ストリーム、スレッドなどはまだ理解していません。あなたの提案はテストに最適な方法です! – SherylHohman

+0

'pickle_safe = True'を設定するだけでは、エラー(少なくとも私の場合)はオブジェクトが実際にpickle_safeではないことがわかります。私はある種の静かな失敗があると推測していた。 – SherylHohman

関連する問題