Пользовательская функция потерь для прогнозирования числового вывода - PullRequest
0 голосов
/ 11 декабря 2018

Я хочу, чтобы моя сеть keras предсказывала числовой вывод в диапазоне 60..200.По моему опыту, просто вывести сигмоид * 140 + 60 или аналогичный результат очень плохо в этом случае, и преобразовать его в класс может быть лучше.

Однако я борюсь с определением функции потерь.Очевидно, что предсказывать соседний класс лучше, и его нужно штрафовать меньше.

Пример кода ниже.Сеть, очевидно, будет более сложной и, вероятно, частично сверточной, но это только начало работы.

Текущий код выдает ошибку: «IndexError: только целые числа, кусочки (:), многоточие (...)), numpy.newaxis (`None ') и целые или логические массивы являются допустимыми индексами".Я думаю, это имеет смысл, поскольку обратное распространение ограничивает то, что можно сделать, но я не уверен, как правильно разрабатывать и отлаживать функции потерь.

classes = np.array(range(60,200,5))
nc = classes.shape[0]
def myloss(y_true, y_pred):
  pred_class = K.argmax(y_pred,axis=1)
  return K.sqrt( K.sum( K.square( classes[pred_class] - y_true ) ) )

in1 = Input(shape=(77,))
mid = Dense(50, activation='tanh')( in1 ) 
out = Dense(nc, activation='softmax')( mid ) 
model = Model(inputs=in1, outputs=out)
model.add_loss( myloss(sbp, out) )

1 Ответ

0 голосов
/ 11 декабря 2018

Проблема, которую вы описываете, является порядковой регрессией.Существует множество работ по функциям потерь для порядковой регрессии в машинном обучении.Как вы говорите, идея состоит в том, чтобы еще больше штрафовать большие отклонения, чего нельзя сказать о потере кроссентропии, обычно используемой для классификации.Вы можете взглянуть на этот репозиторий на github (у меня нет опыта его использования): https://github.com/JHart96/keras_ordinal_categorical_crossentropy

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...