私は主にこのノートブックの例gpflow
SVGP
に従って、おもちゃのデータセットでモデルを(大雑把に)トレーニングして保存しようとしています
を使用してモデルを保存するとpickle
(これは推奨されませんが、これがここでの主な問題だとは思いません)、いくつかの異常であり、意図しない動作であると思われるものを発見しgpflow.utilities.freeze(model)
ましたpickle
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
期待される動作
pickle が最初のインスタンスで機能することを期待していたとは言いませんtensorflow
。一般に、関連するオブジェクトを保存する推奨される方法ではないことを知っているからです。ただし、最初のインスタンスでは失敗するが、2 番目のインスタンスでは成功するとは考えていません。コードベースを見ると、 mutatinggpflow.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
freeze
それを呼び出すと、model
実際にmodel
は「固定された」モデルに不可解に変換され、それが「一定の」プロパティを持つようになると思います ( https://gpflow.readthedocs.io/en/master/notebooks/intro_to_gpflow2.html#TensorFlow- saved_model ) を使用して、ピクルスにすることができます。
この問題について明確にしていただければ幸いです。
注: これissue
はgpflow
github
( https://github.com/GPflow/GPflow/issues/1493 ) に投稿しましたが、この問題はここでより広い gpflow コミュニティにブロードキャストする必要があると判断されました。