我正在使用tensorflow v0.11.0。我正在培训两个网络:D
和G
。基本问题是我无法记录我正在显示的值以及导致混乱的值。 d
和g
损失的打印值与我记录的完全不同。
#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_d
和loss_g
的值可能已经改变,因为我在记录后运行了操作。但那意味着最后一个操作必须保存值,并且在执行sess.run
时不得更改。 fd
在整个迭代过程中保持不变。
答案 0 :(得分:0)
您没有正确使用摘要。
摘要操作生成包含摘要协议缓冲区的张量;合并摘要将多个摘要操作组合到一个目标中,该目标将一起生成所有摘要原型。
您创建了一些标量摘要操作,但您还没有评估它们。相反,您将非摘要张量(loss_g等)传递给merge_summary,这是未定义的行为,因为这些操作应该只是采用摘要操作。如果要手动创建合并的摘要目标,则应将tf.summary.scalar(x)的输出传递给merge_summary。
您可能还想查看the docs或this tutorial。