【问题标题】:Proper way to optimize the input in TensorFlow for visualization优化 TensorFlow 中的输入以进行可视化的正确方法
【发布时间】: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 集合有什么缺点吗?

【问题讨论】:

    标签: tensorflow visualization


    【解决方案1】:

    当我使用 slim 库时也会出现同样的错误。事实上,slim.learning.train() 内部使用了tf.train.Supervisor。我希望我对此GitHub issue 的回答可以帮助您解决主管问题。

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

    1。将参数saver 传递给slim.learning.train()

    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)
    

    函数optimistic_restore_vars定义为

    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_init_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
    )
    

    【讨论】:

      猜你喜欢
      • 2021-08-08
      • 1970-01-01
      • 1970-01-01
      • 2020-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-09
      • 1970-01-01
      相关资源
      最近更新 更多