Нескалярная пользовательская метрика в Tensorflow Keras - PullRequest
0 голосов
/ 18 марта 2019

Это мой первый вопрос, опубликованный в StackOverflow, поэтому наберитесь терпения, пожалуйста, и дайте мне знать, если мне нужно как-то улучшить свой вопрос:)

Допустим, я хочу вычислить отдельное значение метрики для каждого класса.Есть ли способ использовать пользовательскую метрическую функцию в реализации Keras Tensorflow, которая выводит нескалярный тензор?В качестве примера: у меня есть пользовательская метрическая функция balanced_accuracy_per_class, возвращающая тензор формы (1, 4), и я передаю ее методу compile, как показано ниже:

# Define some dummy data:
train_data = tf.constant([
    [0.2, 0.5, 0.1, 0.0, 5.2, 6.3],
    [0.4, 0.1, 0.8, 0.4, 6.4, 7.5],
])

train_labels = tf.constant([
    [1., 0., 0., 0.],
    [0., 1., 1., 0.],
])

val_data = tf.constant([
    [0.3, 0.4, 0.2, 0.1, 2.2, 4.3],
    [3.4, 3.1, 2.8, 1.4, 2.4, 5.5],
])

val_labels = tf.constant([
    [0., 1., 0., 1.],
    [1., 0., 0., 0.],
])

# Example dummy implementation.
def balanced_accuracy_per_class(y_true, y_pred):
    return tf.constant([0.0, 0.2, 0.4, 0.6])

sgd = tf.keras.optimizers.SGD(lr=0.1, decay=0.000225, momentum=0.5)

model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(4, input_shape=(6, )))
model.add(tf.keras.layers.Activation('sigmoid'))

model.compile(optimizer='rmsprop',
          loss='mse',
          metrics=[balanced_accuracy_per_class])

model.fit(train_data, train_labels, epochs=3, steps_per_epoch=1)

evaluation_results = model.evaluate(val_data, val_labels, steps=1)

Как на этапе обучения, так и на этапе оценкииндикатор выполнения выводит метрики в виде скаляра (точнее 0,3):

Эпоха 1/3

1/1 [==============================] - 0 с 81 мс / шаг - потеря: 0,2392 - сбалансированный_аккуратный_пер_класс: 0,3000

эпоха 2/3

1 /1 [=====================================] - 0 с 0 с / шаг - потеря: 0,2367 - balance_accuracy_per_class: 0,3000

Эпоха 3/3

1/1 [=============================] - 0s 997us/ шаг - потеря: 0,2350 - Balanced_accuracy_per_class: 0,3000

1/1 [===================================] - 0 с 53 мс / шаг - потеря: 0,4557 - Balanced_accuracy_per_class: 0,3000

Чего я хотел бы добиться, так это model.evaluate возвращая массив вместо скаляра для данной метрики.

Строка документа функции оценки модели явно mentions "скаляр или список скаляров", но может я что-то упускаю?

Спасибо!

...