Способы ограничения выхода проблемы регрессии NN определенным пределом (т.е. я хочу, чтобы мой NN всегда предсказывал выходные значения только в диапазоне от -20 до +30) - PullRequest
1 голос
/ 30 мая 2019

Я тренирую Н.Н. для решения проблемы регрессии.Таким образом, выходной слой имеет линейную функцию активации.Выход NN должен быть между -20 и 30. Большую часть времени мой NN работает хорошо.Однако иногда он выдает более 30, что нежелательно для моей системы.Так кто-нибудь знает какую-либо функцию активации, которая может обеспечить такие ограничения на вывод, или какие-либо предложения по изменению функции линейной активации для моего приложения?

Я использую Keras с бэкэндом tenserflow для этого приложения

Ответы [ 2 ]

2 голосов
/ 31 мая 2019

Что вы можете сделать, это активировать последний слой с сигмоидом, результат будет между 0 и 1, а затем создать пользовательский слой, чтобы получить желаемый диапазон:

def get_range(input, maxx, minn):
    return (minn - maxx) * ((input - K.min(input, axis=1))/ (K.max(input, axis=1)*K.min(input, axis=1))) + maxx

, а затем добавьте это в свою сеть:

out = layers.Lambda(get_range, arguments={'maxx': 30, 'minn': -20})(sigmoid_output)

Выход будет нормализован между «maxx» и «minn».

UPDATE

Если вы хотите обрезать ваши данные без нормализации всех ваших выходов, сделайте это вместо:

def clip(input, maxx, minn):
    return K.clip(input, minn, maxx)

out = layers.Lambda(clip, arguments={'maxx': 30, 'minn': -20})(sigmoid_output)
0 голосов
/ 30 мая 2019

Что вам нужно сделать, это нормализовать выходные значения в диапазоне [-1, 1] или [0, 1], а затем использовать tanh (для [-1, 1]) или sigmoid (для[0, 1]) активируйте на выходе и обучите модель нормализованным данным.

Затем вы можете денормализовать прогнозы, чтобы получить значения в ваших исходных диапазонах во время вывода.

...