优化TensorFlow可视化输入的正确方法

优化TensorFlow可视化输入的正确方法,tensorflow,visualization,Tensorflow,Visualization,我已经在TensorFlow中训练了一个模型,现在我想可视化哪些输入最大程度地激活了输出。我想知道最干净的方法是什么 我曾想通过创建一个可训练的输入变量来实现这一点,我可以在每次运行时分配一次。然后,通过使用一个适当的损失函数,使用一个带有var_列表的优化器,其中只包含这个输入变量,我将更新这个输入变量,直到收敛。i、 e trainable_input = tf.get_variable( 'trainable_input', shape=data_op.get_shape(

我已经在TensorFlow中训练了一个模型,现在我想可视化哪些输入最大程度地激活了输出。我想知道最干净的方法是什么

我曾想通过创建一个可训练的输入变量来实现这一点,我可以在每次运行时分配一次。然后,通过使用一个适当的损失函数,使用一个带有var_列表的优化器,其中只包含这个输入变量,我将更新这个输入变量,直到收敛。i、 e

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])
然而,当我这样做时,我会遇到一些问题。如果我尝试使用主管还原预先训练好的图,那么它自然会抱怨AdamOptimizer创建的新变量在我尝试还原的图中不存在。我可以通过使用get_slots来获取AdamOptimizer创建的变量,并手动将这些变量添加到tf.GraphKeys.LOCAL_variables集合中来解决这一问题,但它感觉相当粗糙,我不确定这会产生什么后果。我还可以从传递给主管的保护程序中明确排除这些变量,而无需将它们添加到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
我不太清楚为什么这些变量没有得到初始化,因为我以前使用过这种技术,从恢复过程中排除了一些变量(全局和局部),它们似乎按照预期得到了初始化


简而言之,我的问题是,是否有一种简单的方法可以将优化器添加到图中并执行检查点恢复(其中检查点不包含优化器变量),而无需处理优化器的内部。如果这是不可能的,那么仅仅将优化器变量添加到本地变量集合是否有任何不利影响?

使用slim库时也会发生相同的错误。实际上,
slim.learning.train()
在内部使用了
tf.train.Supervisor
。我希望我的回答能帮助你们的主管解决这个问题

我和你有同样的问题。我通过以下两个步骤来解决它

1.将参数
saver
传递到
slim.learning.train()
其中函数定义为

def optimistic_restore_vars(model_checkpoint_path):
    reader = tf.train.NewCheckpointReader(model_checkpoint_path)
    saved_shapes = reader.get_variable_to_shape_map()
    var_names = sorted([(var.name, var.name.split(':')[0]) for var in tf.global_variables() if var.name.split(':')[0] in saved_shapes])
    restore_vars = []
    name2var = dict(zip(map(lambda x:x.name.split(':')[0], f.global_variables()), tf.global_variables()))
    with tf.variable_scope('', reuse=True):
        for var_name, saved_var_name in var_names:
            curr_var = name2var[saved_var_name]
            var_shape = curr_var.get_shape().as_list()
            if var_shape == saved_shapes[saved_var_name]:
                restore_vars.append(curr_var)
    return restore_vars
```

2.将参数
local\u init\u op
传递到
slim.learning.train()
以初始化添加的新变量 最后,代码应该如下所示
使用slim库时也会发生相同的错误。实际上,
slim.learning.train()
在内部使用了
tf.train.Supervisor
。我希望我的回答能帮助你们的主管解决这个问题

我和你有同样的问题。我通过以下两个步骤来解决它

1.将参数
saver
传递到
slim.learning.train()
其中函数定义为

def optimistic_restore_vars(model_checkpoint_path):
    reader = tf.train.NewCheckpointReader(model_checkpoint_path)
    saved_shapes = reader.get_variable_to_shape_map()
    var_names = sorted([(var.name, var.name.split(':')[0]) for var in tf.global_variables() if var.name.split(':')[0] in saved_shapes])
    restore_vars = []
    name2var = dict(zip(map(lambda x:x.name.split(':')[0], f.global_variables()), tf.global_variables()))
    with tf.variable_scope('', reuse=True):
        for var_name, saved_var_name in var_names:
            curr_var = name2var[saved_var_name]
            var_shape = curr_var.get_shape().as_list()
            if var_shape == saved_shapes[saved_var_name]:
                restore_vars.append(curr_var)
    return restore_vars
```

2.将参数
local\u init\u op
传递到
slim.learning.train()
以初始化添加的新变量 最后,代码应该如下所示
local_init_op = tf.global_variables_initializer()
ckpt = tf.train.get_checkpoint_state(FLAGS.train_dir)
saver = tf.train.Saver(var_list=optimistic_restore_vars ckpt.model_checkpoint_path) if ckpt else None)
local_init_op = tf.global_variables_initializer()

###########################
# Kicks off the training. #
###########################
learning.train(
    train_tensor,
    saver=saver,
    local_init_op=local_init_op,
    logdir=FLAGS.train_dir,
    master=FLAGS.master,
    is_chief=(FLAGS.task == 0),
    init_fn=_get_init_fn(),
    summary_op=summary_op,
    number_of_steps=FLAGS.max_number_of_steps,
    log_every_n_steps=FLAGS.log_every_n_steps,
    save_summaries_secs=FLAGS.save_summaries_secs,
    save_interval_secs=FLAGS.save_interval_secs,
    sync_optimizer=optimizer if FLAGS.sync_replicas else None
)