Сброс переменных потоковых метрик тензорного потока - PullRequest
0 голосов
/ 07 июня 2018

У меня есть куча потоковых метрик (tf.metrics.accuracy и custom streaming micro, macro и weighted F1-баллы).

Во время обучения я получаювид графика ниже (не говоря уже о переобучении).

Это происходит потому, что для вычисления метрик набора проверки я вызываю tf.local_variables_initializer, чтобы сбросить метрики и иметь значение только для набора проверки.

Это подразумевает 2 побочных эффекта:

  1. Пики на изображении
  2. В промежутках между валидациями показатели обучения продолжают агрегироваться, даже если проверка происходит каждые 2 эпохи

Я мог бы частично разрешить ситуацию, если бы различные метрики содержали каждую метрику (поезд против val).Но это не решило бы 2.

Поэтому у меня 2 вопроса :

  • По вашему опыту, поведение, которое вы ожидаете увидеть (или нет)? решение?)
  • Можно ли использовать поток метрик только за последние n пакета?

spkinging plot

1 Ответ

0 голосов
/ 07 июня 2018

Такое поведение ожидается, если вы сбрасываете метрики между тренировками.Метрики поезда не усугубляют метрики проверки, если они являются двумя различными операциями.Я приведу пример того, как сохранить эти метрики разными и как сбросить только один из них.


Игрушка Пример:

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

Действительная точность вернулась к нулю, в то время как точность обучения осталась неизменной.

...