Как собрать связанные метрики в отдельный массив, который представляет собой одну запись словаря метрик? - PullRequest
0 голосов
/ 31 января 2020

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

...
outputs = []

assert len(targets) > 0
for target in targets:
     x = get_out_layer(x, M)(x)
     ouputs.append(x)

model = tf.keras.models.Model(inputs=inputs, outputs=outputs)

model.compile(loss={target: my_loss for target in targets},
              optimizer=tf.keras.optimizers.Adam(lr=learning_rate),
              metrics={target: my_metrics for target in targets} )

model, таким образом, может иметь len(targets) выходных слоев (где len(targets) - по крайней мере один), каждый из которая будет иметь форму NxM, где N - размер пакета, а M - количество выходных нейронов (прогнозов), поэтому в целом может быть len(targets) * M отдельных прогнозов. В моем случае my_metrics содержит метри c для каждого из этих M выходных нейронов, поэтому len(my_metrics) = M.

Когда я печатаю атрибут metrics моей модели (то есть print(model.metrics) ), Я получаю список со всеми моими метриками, но этот список также включает потери, но это проблема! Позвольте мне объяснить, почему.

Я хотел бы построить my_metrics для каждой из целей (в targets) отдельно, то есть для выходного слоя 1 я хотел бы построить метрики M, для вывода слой 2, я хотел бы построить M метрики и т. д. (хотя в настоящее время len(targets) == 1, поэтому в настоящее время я буду только M метрики для уникального выходного слоя). Я хотел бы построить эти метрики M для каждой партии (или для каждой эпохи). Я знаю, что могу использовать обратный вызов для этого. Однако, например, в определении def on_epoch_end(epoch, logs), logs - это dict, который также содержит значение потерь. Теперь я хотел бы создать массив NumPy d формы (M,), который содержит эти M метрики, где первые d[0] соответствуют первому выходному нейрону, d[1] второму и т. Д. c. Несмотря на то, что эти M метрики имеют разные имена, я бы не хотел создавать этот массив NumPy (который будет использоваться для построения графиков) путем индексации всех этих M метрик отдельно, и я бы хотел избежать этой связи между имена каждой из этих M метрик и создание этого NumPy массива. Поэтому желательно, чтобы logs (словарь из названий метрик и соответствующих значений) был примерно таким:

logs={
    "loss": 0.5
    "my_target1": [value1, ..., valueM],
    ...
    "my_targetT": [value1, ..., valueM],
}

Это позволило бы мне просто знать my_target1 (который является элементом targets в методе compile выше) и т. д. c., чтобы получить упорядоченный список метрик. Таким образом, я могу легко создать массив NumPy без необходимости индексировать каждую из M метрик отдельно (что было бы очень утомительно и создавало бы большую связь между именами метрик и созданием этого массива и заговор, которого, конечно же, я бы хотел избежать). Можно ли это сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...