Как бороться с недифференцируемостью argmax - PullRequest
3 голосов
/ 26 марта 2019

У меня есть нейронная сеть, в которой последний слой представляет собой сплющенный слой, который выводит кривуюКривая может иметь один или несколько локальных максимумов, но меня интересует только поиск глобальных максимумов.Основная истина, которую я имею, - это целочисленный индекс (или аргумент) глобальных максимумов.Я попытался написать собственный проигрыш в Керасе следующим образом:

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?Поможет ли это даже в моей ситуации?Возможно ли реализовать настраиваемую функцию потерь, которая будет дифференцируемой?Что мне делать?

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