Возможно ли иметь metri c, который возвращает массив (или тензор), а не число? - PullRequest
0 голосов
/ 28 января 2020

У меня есть нейронная сеть с выходом NxM, где N - размер пакета, а M - количество выходов, для которых сеть должна сделать прогноз. Я хотел бы вычислить метри c для каждого из M выходов сети, т. Е. Для всех экземпляров пакета, но отдельно для каждого из M выходов, чтобы было M значений это метри c. Я попытался создать пользовательскую метри c следующим образом.

def my_metric(y_true, y_pred):
    return [3.1, 5.2] # a list of dummy values

и затем передать эту метри c в список метрик метода compile модели, а затем Керас выдает число это среднее значение 3.1 и 5.2 (в данном случае (3.1 + 5.2)/2 = 4.15), а не печать фактического списка. Итак, есть ли способ вернуть и напечатать список (или массив numpy) в виде metri c? Конечно, в моем конкретном случае c я не буду возвращать фиктивный список в приведенном выше примере, но мой пользовательский показатель c более сложный.

1 Ответ

1 голос
/ 28 января 2020

Сделать один метри c на м.

Рабочий код для одного выхода:

from keras.layers import Dense, Input
from keras.models import Model
import keras.backend as K
import numpy as np

inputs = Input((5,))
outputs = Dense(3)(inputs)
model = Model(inputs, outputs)

def metricWrapper(m):
    def meanMetric(true, pred):
        return pred[:, m]
    meanMetric.__name__ = 'meanMetric_' + str(m)
    return meanMetric
metrics = [metricWrapper(m) for m in range(3)]

model.compile(loss='mse', metrics=metrics, optimizer='adam')
model.fit(np.random.rand(10,5), np.zeros((10,3)))
...