2017-05-03 2 views
0

Hier ist ein Snippet, das erfolgreich mit dill serialisieren wird, aber mit pickle fehlschlagen. Es ist überraschend, dass Tensor Objekte nicht nativ pickbar sind. Ist das eine grundsätzliche Einschränkung von threadbewussten Tensoren oder wird sie einfach nicht implementiert?Warum versagt das Beizen eines Tensorflow-Tensors?

import dill 
import pickle 
import tensorflow as tf 

dill.dumps(tf.zeros((1,1))) 
print("Dill succeeded") 
pickle.dumps(tf.zeros((1,1))) 
print("Pickle succeeded") 

Ausgang:

$ python foo.py 
Dill succeeded 
Traceback (most recent call last): 
    File "foo.py", line 7, in <module> 
    pickle.dumps(tf.zeros((1,1))) 
TypeError: can't pickle _thread.lock objects 
+0

Mögliches Duplikat http://stackoverflow.com/questions/39286665/how-to-avoid-pickling-errors-when-sharing-objects-between-threads – DyZ

Antwort

2

einfache Antwort ist, dass pickle nicht die meisten Objekte in Python serialisiert werden kann, das thread.lock Objekt enthalten. Wenn Sie eines dieser Objekte serialisieren möchten, verwenden Sie eine erweiterte Serialisierungsbibliothek wie dill. Was genau pickle kann nicht, ich denke, ursprünglich stammt es von der Umsetzung der GIL und frame Objekt Rendering einige Objekte unserializable, und damit gab es kein Laufwerk, um alles in der Sprache zu serialisieren. Es wurde immer über Sicherheitsprobleme gesprochen, die von der Serialisierung aller Python-Objekte herrühren, aber ich denke, das ist ein Ablenkungsmanöver. Wenn Sie keine vollständige Sprachserialisierung haben, ist die Möglichkeit eingeschränkt, parallel zu arbeiten. Daher wird pickle von dill lernen, wie Sie weitere Objekte serialisieren können.