#python #python-3.x #dictionary
#python #python-3.x #словарь
Вопрос:
У меня есть словарь имен метрик.
metrics = {
'accuracy': accuracy,
'loss': loss
}
Я хочу создать другой словарь, в котором хранятся значения метрик для набора иерархических меток. Предполагается, что словарь должен быть примерно таким:
{'c1_accuracy': 0.84, 'c1_loss': 5.67, 'c2_loss': 8.78, 'c2_accuracy': 0.73}
Я пытаюсь использовать что-то вроде этого
summary_batch = {'c1_{}'.format(metric): metrics['metric'](c1_output, c1_label) for metric in metrics}
Как я могу сделать это для всех меток (c1, c2, …) сразу?
Редактировать: я пытаюсь решить проблему иерархической классификации, в которой у меня есть два грубых класса (скажем, c1 и c2) и один точный класс (f). metrics
словарь используется только для хранения метрик, которые используются в циклах обучения и оценки. У меня есть отдельные функции для вычисления значений метрик. В приведенном выше примере metrics['metric'](c1_output, c1_label) for metric in metrics
будут вызываться функции accuracy
и loss
для истинных меток ( c1_label
) и вывода модели ( c1_output
).
Я хочу сохранить эти показатели как для грубых классов, так и для класса fine. Есть ли способ, которым я могу это сделать, не используя add или не записывая отдельные циклы для каждого класса?
Комментарии:
1. Что такое
accuray
,loss
,c1_ouput
,c1_label
и откуда берутся значения0.84
и5.67
т. Д.?2. Не лучше ли вам создать иерархическую структуру (например, dict of dicts), а не полагаться на похожие имена, чтобы предложить структуру, и манипулировать строками неудобными способами для генерации ключей?
3. Что это такое в вашем коде
metrics['metric'](c1_output, c1_label)
, можете ли вы предоставить лучший образец вашей структуры показателей?4. @IoaTzimas У меня есть функции для точности и потерь.
c1_label
является истинной меткой иc1_output
выводом модели.metrics['metric'](c1_output, c1_label)
вызовет функцию дляc1_output
иc1_label
.0.84, 5.67
это значения, рассчитанные с помощью функции потерь и точности.5. Ваш псевдокод смешивает строки и идентификаторы, поэтому очень трудно угадать, какие входные данные использовать для создания окончательного словаря.
Ответ №1:
Было бы интересно узнать, как вы получаете значения для заполнения словаря, чтобы сделать это при его создании, однако вы можете создать его пустым с помощью этого цикла
metrics = {}
for n in range(10):
key_constructor = 'c{}_{}'
key_acc = key_constructor.format(n,'accuracy')
key_loss = key_constructor.format(n,'loss')
metrics[key_acc] = 0
metrics[key_loss] = 0
Комментарии:
1. metrics — это просто словарь для хранения желаемых показателей, которые я хочу вычислить для своей модели. В этом случае я только что добавил точность и потери. У меня есть отдельные функции для вычисления точности и потерь.
metrics['metric'](c1_output, c1_label) for metric in metrics
вызовет функции потери и точности дляc1_output
иc1_label
.
Ответ №2:
Если вы хотите иметь иерархию, почему бы не использовать вложенный dict?
summuary_batch = {
"c1": {
"accuracy": xxx,
"loss": yyy,
},
"c2": {
"accuracy": zzz,
"loss": ttt,
},
}