这是一个可以通过dill
成功进行序列化但无法通过pickle
进行序列化的代码段。令人惊讶的是,Tensor
对象本身不是可 pickle 的。这是线程感知张量的基本限制,还是只是没有实现?
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")
输出:
$ 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
最佳答案
dill 为什么可以序列化这些对象,但不能序列化pickle的原因呢?简单的答案是pickle
无法序列化python中包括的thread.lock
对象的大多数对象。如果要序列化这些对象之一,请使用dill
之类的高级序列化库。至于pickle
为何无法做到的原因,我认为最初它源于GIL的实现和frame
对象,使某些对象无法序列化,因此没有动力将语言中的所有内容序列化。一直以来都有关于所有python对象序列化的安全性问题的讨论,但是我认为这是一个红色的鲱鱼。没有完整的语言序列化限制了并行计算操作的能力,因此希望pickle
将从dill
中学习如何序列化更多对象。
关于python - 为什么对tensorflow张量进行 pickle 会失败?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43769390/