Создание словаря с несколькими ключами с использованием цикла for

#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,
    },
}