我有一堆流指标(tf.metrics.accuracycustommicromacroweighted F1分数)。

在训练期间,我得到下面的图(不要考虑过度拟合)。

发生这种情况的原因是,为了计算验证集的指标,我称tf.local_variables_initializer以重置指标,并且仅具有验证集的值。

这意味着2种副作用:


图像中的尖峰
在两次验证之间,即使每2个周期进行一次验证,训练指标也会不断汇总


我可以通过让不同的张量保存每个度量(火车与瓦尔)来部分解决这种情况。但这不能解决2.

因此,我有两个问题:


根据您的经验,这是您期望看到的一种行为(解决方案吗?)
有没有办法让指标仅在最后的n批次中流式传输?


python - 重置Tensorflow流指标的变量-LMLPHP

最佳答案

如果您在两次培训之间重置指标,则将出现此现象。
如果训练指标是两个不同的操作,则它们不会合并验证指标。我将举一个示例,说明如何保持这些指标不同,以及如何仅重置其中一个。



玩具示例:

logits = tf.placeholder(tf.int64, [2,3])
labels = tf.Variable([[0, 1, 0], [1, 0, 1]])

#create two different ops
with tf.name_scope('train'):
   train_acc, train_acc_op = tf.metrics.accuracy(labels=tf.argmax(labels, 1),
                                                 predictions=tf.argmax(logits,1))
with tf.name_scope('valid'):
   valid_acc, valid_acc_op = tf.metrics.accuracy(labels=tf.argmax(labels, 1),
                                                 predictions=tf.argmax(logits,1))


训练:

#initialize the local variables has it holds the variables used for metrics calculation.
sess.run(tf.local_variables_initializer())
sess.run(tf.global_variables_initializer())

# initial state
print(sess.run(train_acc, {logits:[[0,1,0],[1,0,1]]}))
print(sess.run(valid_acc, {logits:[[0,1,0],[1,0,1]]}))

#0.0
#0.0


初始状态为预期的0.0

现在调用训练操作指标:

#training loop
for _ in range(10):
    sess.run(train_acc_op, {logits:[[0,1,0],[1,0,1]]})
print(sess.run(train_acc, {logits:[[0,1,0],[1,0,1]]}))
# 1.0
print(sess.run(valid_acc, {logits:[[0,1,0],[1,0,1]]}))
# 0.0


有效精度仍为0.0时,仅更新训练精度。调用有效操作:

for _ in range(10):
    sess.run(valid_acc_op, {logits:[[0,1,0],[0,1,0]]})
print(sess.run(valid_acc, {logits:[[0,1,0],[1,0,1]]}))
#0.5
print(sess.run(train_acc, {logits:[[0,1,0],[1,0,1]]}))
#1.0


在此,有效精度被更新为新值,而训练精度保持不变。

让我们只重置验证操作:

stream_vars_valid = [v for v in tf.local_variables() if 'valid/' in v.name]
sess.run(tf.variables_initializer(stream_vars_valid))

print(sess.run(valid_acc, {logits:[[0,1,0],[1,0,1]]}))
#0.0
print(sess.run(train_acc, {logits:[[0,1,0],[1,0,1]]}))
#1.0


有效精度重置为零,而训练精度保持不变。

关于python - 重置Tensorflow流指标的变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50745126/

10-14 00:57