【发布时间】:2020-06-03 14:09:01
【问题描述】:
我一直在尝试(粗略地)在玩具数据集上训练和保存 gpflow SVGP 模型,主要遵循 this notebook example
使用pickle 保存模型后(我很欣赏不建议这样做,但我不认为这是这里的主要问题),我发现了一些不寻常的,我认为是意外行为:
如果我们在尝试picklemodel 之前没有调用gpflow.utilities.freeze(model),那么我们会得到一个错误。
如果我们确实调用gpflow.utilities.freeze(model)(丢弃返回的冻结模型),那么model 可以被腌制而不会出错。
重现
最小的、可重复的示例
import numpy as np
import gpflow
import tensorflow as tf
import pickle
rng = np.random.RandomState(123)
N = 10000 # Number of training observations
X = rng.rand(N, 1)
Y = rng.randn(N, 1)
data = (X, Y)
n_inducing_vars = 100
Z = X[:n_inducing_vars]
minibatch_size = 100
n_iterations = 100
#Define model object
model = gpflow.models.SVGP(gpflow.kernels.Matern12(), gpflow.likelihoods.Bernoulli(), inducing_variable=Z, num_data=N)
#Create minibatch object
data_minibatch = (
tf.data.Dataset.from_tensor_slices(data).prefetch(
N).repeat().shuffle(N).batch(minibatch_size)
)
data_minibatch_it = iter(data_minibatch)
model_objective = model.training_loss_closure(data_minibatch_it)
#Define optimiser
optimizer = tf.keras.optimizers.Adam(0.001)
#Optimise both variational parameters and kernel hyperparameters.
for step in range(n_iterations):
optimizer.minimize(model_objective,
var_list=model.trainable_variables
)
freeze = False
if not freeze:
# pickle doesn't work
pickle.dump(model, open('test1', 'wb'))
else:
# if following code is executed, pickle works fine
_ = gpflow.utilities.freeze(model) # ignore return value
pickle.dump(model, open('test1', 'wb'))
堆栈跟踪或错误消息
TypeError Traceback (most recent call last)
<ipython-input-6-3d5f537ca994> in <module>
----> 1 pickle.dump(model, open('test1', 'wb'))
TypeError: can't pickle HashableWeakRef objects
预期行为
并不是说我希望泡菜在第一个实例中起作用,因为我知道这不是保存tensorflow 相关对象的推荐方法。但是,我当然不希望它在第一次失败但在第二次成功。从代码库来看,我不认为 gpflow.utilities.freeze(model) 应该改变 model,它似乎正在这样做。
系统信息
- 使用 GPflow 版本 2.0.0 ... 2.0.4 测试
- TensorFlow 版本:2.1.0,tensorflow_probability 0.9.0
- Python 版本:Python 3.6.9
我猜想在model 上调用freeze 时,实际上莫名其妙地将model 转换为“冻结”模型,然后该模型具有使其能够被腌制的“恒定”属性(https://gpflow.readthedocs.io/en/master/notebooks/intro_to_gpflow2.html#TensorFlow-saved_model) .
非常感谢您对此问题的任何澄清。
请注意,我在gpflow github (https://github.com/GPflow/GPflow/issues/1493) 上以issue 的形式发布了此问题,但决定应在此处向更广泛的 gpflow 社区广播此问题。
【问题讨论】:
标签: tensorflow tensorflow-probability gpflow