【发布时间】:2017-11-14 14:01:18
【问题描述】:
我已经在 TensorFlow 中训练了一个模型,现在我想可视化哪些输入可以最大程度地激活输出。我想知道最干净的方法是什么。
我曾想过通过创建一个可训练的输入变量来做到这一点,我可以在每次运行时分配一次。然后通过使用适当的损失函数并使用带有仅包含此输入变量的 var_list 的优化器,我将更新此输入变量直到收敛。即
trainable_input = tf.get_variable(
'trainable_input',
shape=data_op.get_shape(),
dtype=data_op.dtype,
initializer=tf.zeros_initializer(),
trainable=True,
collections=[tf.GraphKeys.LOCAL_VARIABLES])
trainable_input_assign_op = tf.assign(trainable_input, data_op)
data_op = trainable_input
# ... run the rest of the graph building code here, now with a trainable input
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)
# loss_op is defined on one of the outputs
train_op = optimizer.minimize(loss_op, var_list=[trainable_input])
但是,当我这样做时,我遇到了问题。如果我尝试使用 Supervisor 恢复预训练图,那么它自然会抱怨 AdamOptimizer 创建的新变量在我尝试恢复的图中不存在。我可以通过使用 get_slots 来获取 AdamOptimizer 创建的变量并将这些变量手动添加到 tf.GraphKeys.LOCAL_VARIABLES 集合来解决这个问题,但是感觉很麻烦,我不确定这会产生什么后果。我也可以从传递给主管的 Saver 中明确排除这些变量,而不将它们添加到 tf.GraphKeys.LOCAL_VARIABLES 集合中,但是我得到一个异常,即它们没有被主管正确初始化:
File "/usr/local/lib/python3.5/site-packages/tensorflow/python/training/supervisor.py", line 973, in managed_session
self.stop(close_summary_writer=close_summary_writer)
File "/usr/local/lib/python3.5/site-packages/tensorflow/python/training/supervisor.py", line 801, in stop
stop_grace_period_secs=self._stop_grace_secs)
File "/usr/local/lib/python3.5/site-packages/tensorflow/python/training/coordinator.py", line 386, in join
six.reraise(*self._exc_info_to_raise)
File "/usr/local/lib/python3.5/site-packages/six.py", line 686, in reraise
raise value
File "/usr/local/lib/python3.5/site-packages/tensorflow/python/training/supervisor.py", line 962, in managed_session
start_standard_services=start_standard_services)
File "/usr/local/lib/python3.5/site-packages/tensorflow/python/training/supervisor.py", line 719, in prepare_or_wait_for_session
init_feed_dict=self._init_feed_dict, init_fn=self._init_fn)
File "/usr/local/lib/python3.5/site-packages/tensorflow/python/training/session_manager.py", line 280, in prepare_session
self._local_init_op, msg))
RuntimeError: Init operations did not make model ready. Init op: init, init fn: None, local_init_op: name: "group_deps_5"
op: "NoOp"
input: "^init_1"
input: "^init_all_tables"
, error: Variables not initialized: trainable_input/trainable_input/Adam, trainable_input/trainable_input/Adam_1
我不太确定为什么这些变量没有被初始化,因为我之前使用该技术从恢复过程中排除了一些变量(全局和本地),并且它们似乎按预期进行了初始化。
简而言之,我的问题是是否有一种简单的方法可以将优化器添加到图形并执行检查点恢复(其中检查点不包含优化器变量),而无需处理优化器的内部结构。如果这不可能,那么仅将优化器变量添加到 LOCAL_VARIABLES 集合有什么缺点吗?
【问题讨论】: