这是一个可以通过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/

10-11 00:56
查看更多