tensorflow中的日志记录和摘要不正确

时间:2017-06-29 12:24:04

标签: python tensorflow

我正在使用tensorflow v0.11.0。我正在培训两个网络:DG。基本问题是我无法记录我正在显示的值以及导致混乱的值。 dg损失的打印值与我记录的完全不同。

#Defining Losses
loss_d1 = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(out_1, 0.9*tf.ones_like(in_1)))
loss_d2 = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(out_2, tf.zeros_like(in_2)))
loss_g = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(out_2, tf.ones_like(in_2)))

#combining losses
loss_d = loss_d1 + loss_d2

#creating summaries
loss_d1_sum = tf.scalar_summary("loss_d1", loss_d1)
loss_d2_sum = tf.scalar_summary("loss_d2", loss_d2)
loss_d_sum = tf.scalar_summary("loss_d", loss_d)
loss_g_sum = tf.scalar_summary("loss_g", loss_g)

#defining the optimizers
op_g = tf.train.AdamOptimizer(learning_rate).minimize(loss_g, var_list=vars_g)
op_d = tf.train.AdamOptimizer(learning_rate).minimize(loss_d, var_list=vars_d)

#merging summaries
self.g_sum = tf.merge_summary([loss_g])
self.d_sum = tf.merge_summary([loss_d, loss_d1, loss_d2])
self.writer = tf.train.SummaryWriter('./logs', sess.graph)

我正在更新D一次和G两次:

# Update D network
_, summary_str = self.sess.run([op_d, d_sum], feed_dict= fd)
self.writer.add_summary(summary_str, counter)

# Update G network
_, summary_str = self.sess.run([op_g, g_sum], feed_dict= fd)
self.writer.add_summary(summary_str, counter)

# Update G network again
_, summary_str = self.sess.run([op_g, g_sum], feed_dict= fd)
self.writer.add_summary(summary_str, counter)

我正在运行以下2次。每次迭代都有1次D次更新和2次G次更新。

# Printing stats to stdout
[loss_d, loss_g] = sess.run([loss_d, loss_g], feed_dict = fd)
print 'd_loss:{}, g_loss:{}'.format(loss_d, loss_g)

这给了我输出:

d_loss: 1.43663359, g_loss: 0.68026298
d_loss: 1.72329867, g_loss: 0.55464995

我现在使用以下代码提取值,以使用matplotlib进行绘制。

for entry in tf.train.summary_iterator(log_file)
    for v in entry.summary.value:
        if v.tag == 'loss_d'
            g.append(v.simple_value)
        elif v.tag == 'loss_g'
            d.append(v.simple_value)

print len(d), len(d)       # 2 4
print 'd_loss', d          # d_loss [2.196472406387329, 1.200419545173645]
print 'g_loss', g          # g_loss [6.2136077880859375, 2.953800678253174, 5.429494857788086, 2.6036014556884766]

我是否正确实施了日志记录方案?我认为loss_dloss_g的值可能已经改变,因为我在记录后运行了操作。但那意味着最后一个操作必须保存值,并且在执行sess.run时不得更改。 fd在整个迭代过程中保持不变。

1 个答案:

答案 0 :(得分:0)

您没有正确使用摘要。

摘要操作生成包含摘要协议缓冲区的张量;合并摘要将多个摘要操作组合到一个目标中,该目标将一起生成所有摘要原型。

您创建了一些标量摘要操作,但您还没有评估它们。相反,您将非摘要张量(loss_g等)传递给merge_summary,这是未定义的行为,因为这些操作应该只是采用摘要操作。如果要手动创建合并的摘要目标,则应将tf.summary.scalar(x)的输出传递给merge_summary。

您可能还想查看the docsthis tutorial

相关问题