Я обучаю NN проблеме регрессии. Таким образом, выходной слой имеет линейную функцию активации. Предполагается, что выход NN находится в диапазоне от -20 до 30. Мой NN большую часть времени работает хорошо. Однако иногда он выдает более 30, что нежелательно для моей системы. Итак, кто-нибудь знает какую-либо функцию активации, которая может обеспечить такое ограничение на вывод, или какие-либо предложения по изменению функции линейной активации для моего приложения?
Я использую Keras с бэкэндом tensorflow для этого приложения.
Что вам нужно сделать, так это нормализовать ваши целевые выходные данные в диапазоне [-1, 1] или [0, 1], а затем использовать активацию tanh
(для [-1, 1]) или sigmoid
(для [0, 1]) на выходе и обучить модель нормализации данных.
Затем вы можете денормализовать прогнозы, чтобы получить значения в исходных диапазонах во время вывода.
@Markus Маркус Я сказал нормализовать вывод, а не ввод.
@MatiasValdenegro Я хочу масштабировать / изменять свое выходное значение, только если оно выходит за пределы диапазона. Если вывод находится в диапазоне, то это идеальный прогноз для моего приложения. Например, если мой вывод находится в диапазоне от 1 до 50. Поэтому, если я масштабирую эти значения в диапазоне от 1 до 30, все выходные данные в диапазоне (от 1 до 30) также будут масштабированы и будут иметь меньшее значение, чем фактический прогноз. Это не то, чего я хочу. Я хочу масштабировать любое выходное значение от 30 до 30 и любое выходное значение менее -20 до -20. любое значение от -20 до 30, чтобы остаться как есть.
@ JD95 JD95 Это не масштабирование, а ограничение, но если вы нормализуете свои данные, никакие значения за пределами этого диапазона не будут отображаться в нормализованных значениях.
Что вы можете сделать, так это активировать свой последний слой с помощью сигмоида, результат будет между 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».
Если вы хотите обрезать свои данные без нормализации всех ваших выходных данных, сделайте это вместо этого:
def clip(input, maxx, minn):
return K.clip(input, minn, maxx)
out = layers.Lambda(clip, arguments = {'maxx': 30, 'minn': -20})(sigmoid_output)
Спасибо за быстрый ответ! Однако у меня все еще есть одно сомнение: если я буду масштабировать свой вывод в соответствии с минимальным и максимальным значением, то большая часть выходных данных будет изменена в соответствии с масштабированием. Однако, если вывод моей модели находится в диапазоне от -20 до 30, то его полное совпадение, ошибки нет, и их масштабирование добавит некоторую ошибку :( Итак, я хочу масштабировать свой вывод до минимального или максимального значения, только мой вывод выходит за пределы заданный диапазон.
Понятно, но я думаю, что если все правильно, ваша модель научится новому способу получения правильных ответов, но на этот раз без выбросов. Но если вам действительно нужно обрезать, я обновлю свой ответ!
Спасибо за ваше обновление. Отсечение со слоями Lambda сработало :)
Нормализация ввода не гарантирует, что вывод находится в том же диапазоне (относительно вашего утверждения «обучить модель с нормализацией данных»).