Это мой первый вопрос, опубликованный в 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 "скаляр или список скаляров", но может я что-то упускаю?
Спасибо!