Machine learning 我如何记录或查看培训有辍学的TensorFlow神经网络的成本?

Machine learning 我如何记录或查看培训有辍学的TensorFlow神经网络的成本?,machine-learning,neural-network,tensorflow,Machine Learning,Neural Network,Tensorflow,我如何看待实际用于训练神经网络的辍学者的准确性和成本 正如预期的那样,每次我运行一个 train_writer.add_summary(sess.run(merged, feed_dict=foo), step) 或 如果网络包括辍学,并且foo提供了除1.0以外的“保持概率”,我将得到不同的值,例如,我每次都会得到不同的损失或精度-例如,使用 print(sess.run(accuracy, feed_dict=foo)) print(sess.run(accuracy, feed_dict

我如何看待实际用于训练神经网络的辍学者的准确性和成本

正如预期的那样,每次我运行一个

train_writer.add_summary(sess.run(merged, feed_dict=foo), step)

如果网络包括辍学,并且
foo
提供了除1.0以外的“保持概率”,我将得到不同的值,例如,我每次都会得到不同的损失或精度-例如,使用

print(sess.run(accuracy, feed_dict=foo))
print(sess.run(accuracy, feed_dict=foo))
print(sess.run(accuracy, feed_dict=foo))
可能会给你一些

75.808
75.646
75.770 
虽然它们大致相同,但并不完全相同,大概是因为每次我评估时,网络都会丢失不同的节点。这样做的结果一定是,我从来没有看到在培训中实际遇到的成本


我如何记录或查看实际用于训练带辍学的TensorFlow神经网络的成本(或使用网络计算的其他汇总值)?

问题在哪里?如果对随机网络调用三次,则应该得到三个不同的值。当你从网络中记录你的损失时,你就是在记录训练中实际使用的损失。基本上,您可以从计算图形中读取值,如:

for i in range(100):
    batch_xs, batch_ys = mnist.train.next_batch(100)
    cross_entropy = -tf.reduce_sum(y_ * tf.log(y))
    _, loss_val = sess.run([train_step, cross_entropy],
                           feed_dict={x: batch_xs, y_: batch_ys})
    print 'loss = ' + loss_val
它将打印在训练步骤中计算的损失(不会计算两次,因此辍学输出掩码不会重新采样)


如果您想查看“如果我现在停止学习,列车组的准确度会是多少”,您需要一个评估图,它将告诉您的网络,是时候将辍学单位从随机更改为缩放/平均结果了。

问题出在哪里?如果对随机网络调用三次,则应该得到三个不同的值。当你从网络中记录你的损失时,你就是在记录训练中实际使用的损失。基本上,您可以从计算图形中读取值,如:

for i in range(100):
    batch_xs, batch_ys = mnist.train.next_batch(100)
    cross_entropy = -tf.reduce_sum(y_ * tf.log(y))
    _, loss_val = sess.run([train_step, cross_entropy],
                           feed_dict={x: batch_xs, y_: batch_ys})
    print 'loss = ' + loss_val
它将打印在训练步骤中计算的损失(不会计算两次,因此辍学输出掩码不会重新采样)


相反,如果您想查看“如果我现在停止学习,列车组的准确度会是多少”,您需要一个评估图,它将告诉您的网络,是时候将辍学单位从随机改为缩放/平均结果了。

问题不是我得到三个(或多个)不同的值(这是预期的),这是关于如何访问培训期间遇到的问题。为了确保我对如何完成访问有一个关键点:在这种情况下,提供给
run
的单个调用的任何内容,无论在评估过程中遇到多少次,都只会评估一次,因此如果我通过
[op1,op2,op3]
,比如说,
op1
本身计算
op2
,后者又计算
op3
,我将看到后两者的值将与计算
op1
中使用的值相同?如果是这样,问题的另一个关键部分是:如何将该值(
loss\u val
)输入日志(例如,使用
SummaryWriter
)?是的,如果您传递多个要运行的内容,则基础图将只计算一次。这是TF的全部操作-它分析您的执行图,只执行所需的节点,从不执行同一个节点两次。同样,在培训期间,没有“准确性”-您的网络使用代理丢失(如日志丢失)进行训练,这是训练过程中实际遇到的值(完全独立于是否使用辍学-这很有效)。您可以改为询问(如回答的第二部分所述)“如果我现在停止试验并尝试评估训练集的准确性,会发生什么情况?”-这在提供链接的do_eval文档中有详细描述,“问题”不是我得到三个(或多个)不同的值(这是预期的),这是关于如何访问培训过程中遇到的问题。为了确保我对如何完成访问有一个关键点:在这种情况下,提供给
run
的单个调用的任何内容,无论在评估过程中遇到多少次,都只会评估一次,因此如果我通过
[op1,op2,op3]
比如说,
op1
本身计算
op2
,后者又计算
op3
,我将看到后两者的值将与计算
op1
中使用的值相同?如果是这样,问题的另一个关键部分是:如何获得该值(
loss\u val
)进入日志(例如,使用
SummaryWriter
)?是的,如果您传递多个要运行的内容,则基础图将只计算一次。这就是TF的整个过程-它分析您的执行图,只执行所需的节点,从不执行同一个节点两次。再次,在培训期间,没有“准确性”-您的网络使用代理丢失(如日志丢失)进行训练,这是训练过程中实际遇到的值(完全独立于是否使用辍学-这很有效)。您可以改为询问(如回答的第二部分所述)“如果我现在停止试验并尝试评估训练集的准确性,会发生什么情况?”-详细说明见所提供链接下的do_eval文档