Ignite: running average with for loop

Created on 28 Sep 2019  路  3Comments  路  Source: pytorch/ignite

Hi, I have a problem with running average when using it in for loop.
for example i got this code on issue #353

output_transform1 = lambda data: data['output1'], data['labels']
output_transform2 = lambda data: data['output2'], data['labels']

alpha = 0.98
acc_metric1 = RunningAverage(Accuracy(output_transform=output_transform1), alpha=alpha)
acc_metric1.attach(trainer, 'running_avg_accuracy1')

acc_metric2 = RunningAverage(Accuracy(output_transform=output_transform2), alpha=alpha)
acc_metric2.attach(trainer, 'running_avg_accuracy2')

@trainer.on(Events.ITERATION_COMPLETED)
def log_running_avg_metrics(engine):
    print("running avg accuracy:", engine.state.metrics['running_avg_accuracy1'])
    print("running avg accuracy:", engine.state.metrics['running_avg_accuracy2])

if i use this code like this

for key in ['output1', 'output2']:
    RunningAverage(Accuracy(output_transform=lambda data: data[key], data['labels']), alpha=alpha).attach(trainer, key)

running average returns same value with the key it is declare at last. (in this case 'output2' value only)

how can i solve this problem ?

thank you

question

All 3 comments

Hi @Aiden-Jeon this lambda problem that can not store internal variables: key. To setup RunningAverage in the loop like that, you can use functools.partial :

from functools import partial

def output_transform(data, key):
    return data[key], data['labels']

for key in ['output1', 'output2']:
    RunningAverage(Accuracy(output_transform=partial(output_transform, key=key)),
                   alpha=alpha).attach(trainer, key)

https://github.com/pytorch/ignite/issues/311#issuecomment-435524176

Oh, i missed the basic python usage.

i solved the problem.

thank you!

I close the issue as solved. Feel free to reopen if needed

Was this page helpful?
0 / 5 - 0 ratings