我正在TensorFlow中的VAE项目中工作,在该项目中内置了编码器/解码器网络。这个想法是要能够保存,然后使用编码器功能加载经过训练的模型并进行采样。
还原模型后,我无法使解码器功能运行并把还原后的训练变量还给我,却遇到“未初始化的值”错误。我认为这是因为该函数正在创建一个新的新函数,覆盖现有函数,否则以其他方式。但是我不知道如何解决这个问题。这是一些代码:
class VAE(object):
def __init__(self, restore=True):
self.session = tf.Session()
if restore:
self.restore_model()
self.build_decoder = tf.make_template('decoder', self._build_decoder)
@staticmethod
def _build_decoder(z, output_size=768, hidden_size=200,
hidden_activation=tf.nn.elu, output_activation=tf.nn.sigmoid):
x = tf.layers.dense(z, hidden_size, activation=hidden_activation)
x = tf.layers.dense(x, hidden_size, activation=hidden_activation)
logits = tf.layers.dense(x, output_size, activation=output_activation)
return distributions.Independent(distributions.Bernoulli(logits), 2)
def sample_decoder(self, n_samples):
prior = self.build_prior(self.latent_dim)
samples = self.build_decoder(prior.sample(n_samples), self.input_size).mean()
return self.session.run([samples])
def restore_model(self):
print("Restoring")
self.saver = tf.train.import_meta_graph(os.path.join(self.save_dir, "turbolearn.meta"))
self.saver.restore(self.sess, tf.train.latest_checkpoint(self.save_dir))
self._restored = True
想要运行samples = vae.sample_decoder(5)
在我的日常训练中,我跑步:
if self.checkpoint:
self.saver.save(self.session, os.path.join(self.save_dir, "myvae"), write_meta_graph=True)
根据以下建议的答案,我更改了还原方法
self.saver = tf.train.Saver()
self.saver.restore(self.session, tf.train.latest_checkpoint(self.save_dir))
但是现在在创建Saver()对象时出现值错误:
ValueError: No variables to save
答案 0 :(得分:0)
tf.train.import_meta_graph
将恢复图形,这意味着将重建存储在文件中的网络体系结构。另一方面,对tf.train.Saver.restore
的调用只会将文件中的变量值还原到会话中的当前图形(如果文件中的某些值属于当前活动目录中不存在的变量,则自然失败图)。
因此,如果您已经在代码中构建了网络层,则无需调用tf.train.import_meta_graph
。否则,这可能会导致您出现问题。
不确定其余代码的外观,但这是一些建议。首先构建图形,然后创建会话,最后还原(如果适用)。那么您的init可能看起来像这样
def __init__(self, restore=True):
self.build_decoder = tf.make_template('decoder', self._build_decoder)
self.session = tf.Session()
if restore:
self.restore_model()
但是,如果仅还原编码器,然后重新构建解码器,则可以最后构建解码器。但是不要忘了在使用之前初始化其变量。