У меня есть нейронная сеть, в которой последний слой представляет собой сплющенный слой, который выводит кривуюКривая может иметь один или несколько локальных максимумов, но меня интересует только поиск глобальных максимумов.Основная истина, которую я имею, - это целочисленный индекс (или аргумент) глобальных максимумов.Я попытался написать собственный проигрыш в Керасе следующим образом:
def custom_loss(y_output,y_idx_pred):
return K.mean(K.sum((K.argmax(y_output)-y_idx_pred)**2))
Я также бросил целые числа в float32.Но я получаю ошибку, что есть градиент «Нет».Я искал ответ и обнаружил, что у argmax нет определенного градиента.Я обнаружил, что я предложил создать собственный слой Argmax или вместо него использовать softmax.
Как мне здесь использовать softmax?Softmax только дает мне приближение [0 0 1... ]
, а не сам целочисленный индекс.Как я должен работать с этим?Я даже пытался рассматривать проблему как проблему классификации, поворачивая основную правду к [0 1 0... ]
и использовал кросс-центропию, но сеть не могла ничего узнать.Это было лучше, когда я просто добавил плотный (1) слой, а затем обучил модель.Кажется, что классификация рассматривает все аргументы одинаково, но здесь это не так.Мне нужно евклидово расстояние l2.
Где я могу получить правильную инструкцию по созданию пользовательского слоя Argmax?Поможет ли это даже в моей ситуации?Возможно ли реализовать настраиваемую функцию потерь, которая будет дифференцируемой?Что мне делать?