Я создал модель, которая потенциально может иметь несколько выходных слоев следующим образом.
...
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
метрик отдельно (что было бы очень утомительно и создавало бы большую связь между именами метрик и созданием этого массива и заговор, которого, конечно же, я бы хотел избежать). Можно ли это сделать?