【问题标题】:adding value to tensorboard for adversarial learning为对抗性学习增加张量板的价值
【发布时间】:2018-05-20 08:05:52
【问题描述】:

我是张量板的新手。我在使用它时遇到了一些问题。

问题一:

我正在编写一个对抗性学习模型。为了可视化模型的损失,我有以下损失,

  • actor loss

  • critic loss

对于this paper中提供的学习算法, 在一个(或 K)批次中,我必须同时喂给演员和评论家。然后我只需要为评论家提供价值。这次没有演员。我认为,要在 tensorboard 中显示价值,我需要进行以下操作,

def model():
    ...
    actor_loss = ...
    tf.summary.scalar('actor', actor_loss)

    ...

    critic_loss = ...
    tf.summary.scalar('critic', critic_loss)



my_graph = tf.Graph()
with my_graph.as_default():
    tf.reset_default_graph()
    sess = tf.Session()
    with sess.as_default():
        model()
        merged = tf.summary.merge_all()
        writer = tf.summary.FileWriter(address+ '/train',
                               sess.graph)

        init = tf.global_variables_initializer()
sess.run(init)

现在在向 inner_loop (演员和评论家都参与)提供输入时没有问题,我们通过以下方式得到结果,

a,b,c,d,summary = sess.run( [actor_train_step, critic_train_step, actor_loss, critic_loss, merged], feed_dict = feed_dict )
writer.add_summary(summary, batch)

但是当我们只想给评论家提供输入时,代码就变成了以下,

a,b,summary = sess.run( [critic_train_step, critic_loss, merged], feed_dict = feed_dict )
writer.add_summary(summary, batch)

但由于merged 依赖于actor_loss,它无法运行。另一方面,我不能只将演员的价值提供给模型。如何解决这个问题?

问题 2

我不是通过张量运算来评估(计算分值)模型。实际上,我生成输出并将输出提供给另一个脚本并从那里获得分数值。因此,在每个批次/时期之后,我都在评估我的模型并从脚本中获得一个分值。如何将此值保存到张量板?

我无法在会话初始化之前正式化 tf.summary.merge_all() 操作,因为我正在从外部脚本计算训练时的评估得分值。

tf.summary.merge_all() 操作应该放在哪里?

现在,如果我想将问题 1 和问题 2 合并到一个项目中,我需要做些什么新的事情吗?

注意:我是张量板的新手。所以如果你能给出详细的解释就更好了。

【问题讨论】:

    标签: tensorflow merge tensorboard summary


    【解决方案1】:

    问题 #1

    如果你只想总结critic op,你应该只为critic部分运行summary op,而不是使用tf.summary.merge_all()

    例如:

    def model():
        ...
        actor_loss = ...
        tf.summary.scalar('actor', actor_loss)
    
        ...
    
        critic_loss = ...
        summary_critic = tf.summary.scalar('critic', critic_loss)
    
    a,b,summary = sess.run( [critic_train_step, critic_loss, summary_critic], feed_dict = feed_dict )
    writer.add_summary(summary, batch)
    

    问题 #2

    将运行外部脚本后获得的值可视化。您可以使用tf.convert_to_tensor()which is documented here 将这些值转换为张量。然后序列化该张量以在张量板上将其可视化。

    例如:

    vals = output_from_outside_script()
    vals_tensor = sess.run(tf.convert_to_tensor(vals))
    tf.summary.scalar('evaluation', vals_tensor)
    

    每个tf.summary 操作都会创建一个Summary protobuf,它将你的张量序列化为一个事件文件。而不是运行所有的摘要操作,Tensorflow 提供tf.summary.merger_all() 来运行图表中的所有摘要操作。

    我尝试在你的情况下这样做。
    外部脚本:

    import numpy as np
    
    def output_from_outside_script(var):
        return np.sum(var)
    

    对抗训练中的代码:

    import tensorflow as tf
    import numpy as np
    
    from outside_evaluation import *
    
    sess = tf.Session()
    
    x = sess.run(tf.constant([[1,2,3,4]], dtype=tf.float32))
    X = tf.placeholder(dtype=tf.float32, shape=[1, 4])
    W = tf.Variable(tf.truncated_normal([4, 10], stddev=0.1))
    
    sess.run(tf.global_variables_initializer())
    
    val = tf.matmul(a=X, b=W, name='matmul')
    tf.summary.scalar('matmul_mean', tf.reduce_mean(val))
    
    y = sess.run(val, feed_dict={X: x})
    print('y = ', y)
    
    vals = output_from_outside_script(y)
    print('vals = ', vals)
    vals_tensor = tf.convert_to_tensor(vals, name='vals_tensor')
    tf.summary.scalar('evaluation', vals_tensor)
    
    writer = tf.summary.FileWriter(os.path.join('test_log'), sess.graph)
    merged = tf.summary.merge_all()
    
    summary = sess.run(merged, feed_dict={X: x})
    writer.add_summary(summary)
    writer.close()
    

    输出:

    ('y = ', array([[-0.51137048, -0.16054343, -0.03827953,  0.1124011 ,  0.09200752,
            -0.22235785,  0.41357356,  1.04061067, -0.08877556, -0.86647421]], 
    ('vals = ', -0.22920817)
    

    Tensorboard 日志:
    标量:

    如果有任何问题,请告诉我。

    【讨论】:

    • 谢谢@Mike。实际上,我并不了解 tensorboard 的内部工作流程。我主要担心的是,当我输入tf.summary.merge_all() 时,这意味着图的所有摘要操作当时合并还是只是作为一个对象工作?
    • 您可以认为merge_all() 操作是一个大操作,它将合并(运行)图表中的所有摘要操作,因此您必须确保将所有需要的输入提供给您的摘要操作。我认为,是的“当时”
    • 所以当我打电话给tf.summary.scalar('evaluation', vals_tensor) 当时我的merged 对象不知道这一点(tf.summary.scalar('evaluation', vals_tensor))。那么这个操作怎么会和我的整个图合并呢?
    • 我实际上并没有在您的情况下对此进行测试,但我认为当您定义 vals_tensortf.summary.scalar('evaluation', vals_tensor) 时,您已经将这些操作添加到您的图表中。因此,如果您在那之后致电tf.summary.merge_all(),它将起作用。请用你的代码测试一下。
    • 请查看添加的示例。我认为这与您的情况非常相似。
    猜你喜欢
    • 2017-07-20
    • 2016-01-10
    • 1970-01-01
    • 2017-11-04
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    相关资源
    最近更新 更多