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
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