Я использую Keras (бэкэнд Tensorflow) для построения модели, которая с помощью входных данных предсказывает один класс (из 64 классов), модель мультикласса. Учитывая довольно большое количество классов, я не хочу использовать функции потери categorical_crossentropy
или sparse_categorical_crossentropy
, поскольку они основаны на одном предсказанном классе.
Например: пусть y_true=0
(разреженный), y_pred1=[0.4, 0.5, 0.01, 0.02, 0.01, ...]
и y_pred2=[0.04, 0.05, 0.5, 0.4, 0.01, ...]
(где y_pred1
и y_pred2
- прогнозируемые векторы с одним горячим током). Потери выше приведут к той же потере - поскольку золотая метка 0 не является самой высокой меткой, которая была предсказана. В моем случае я хочу разделить прогнозы и получить потери на y_pred1
намного ниже, поскольку золотая метка была в топ-5 прогнозируемых классов.
Я пытался использовать функцию потери костюма, но безуспешно - произошло неясное исключение ValueError: None values not supported.
.
def in_top_k(y_true, y_pred):
return keras.backend.in_top_k(y_pred, math_ops.argmax(y_true, axis=-1), k=5)
model.compile(loss=in_top_k,
optimizer='adam',
metrics=['accuracy'])
, где y_pred
и y_true
- [n, 64] тензоры.
- Что может быть эта ошибка?
- Является ли моя потеря костюма импл. правильно?
- Правильно ли мое мышление?
Спасибо!