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

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

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

Оптимизация производительности модели: Руководство по настройке гиперпараметров в Python с Keras
Оптимизация производительности модели: Руководство по настройке гиперпараметров в Python с Keras
Настройка гиперпараметров - это процесс выбора наилучшего набора гиперпараметров для модели машинного обучения с целью оптимизации ее...
Определение пород собак с помощью конволюционных нейронных сетей (CNN)
Определение пород собак с помощью конволюционных нейронных сетей (CNN)
В рамках финального проекта Udacity Data Scietist Nanodegree я разработал алгоритм с использованием конволюционных нейронных сетей (CNN) для...
1
0
1 066
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

Нормализация ввода не гарантирует, что вывод находится в том же диапазоне (относительно вашего утверждения «обучить модель с нормализацией данных»).

Markus 30.05.2019 23:14

@Markus Маркус Я сказал нормализовать вывод, а не ввод.

Dr. Snoopy 30.05.2019 23:15

@MatiasValdenegro Я хочу масштабировать / изменять свое выходное значение, только если оно выходит за пределы диапазона. Если вывод находится в диапазоне, то это идеальный прогноз для моего приложения. Например, если мой вывод находится в диапазоне от 1 до 50. Поэтому, если я масштабирую эти значения в диапазоне от 1 до 30, все выходные данные в диапазоне (от 1 до 30) также будут масштабированы и будут иметь меньшее значение, чем фактический прогноз. Это не то, чего я хочу. Я хочу масштабировать любое выходное значение от 30 до 30 и любое выходное значение менее -20 до -20. любое значение от -20 до 30, чтобы остаться как есть.

jd95 30.05.2019 23:36

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

Dr. Snoopy 30.05.2019 23:40
Ответ принят как подходящий

Что вы можете сделать, так это активировать свой последний слой с помощью сигмоида, результат будет между 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, то его полное совпадение, ошибки нет, и их масштабирование добавит некоторую ошибку :( Итак, я хочу масштабировать свой вывод до минимального или максимального значения, только мой вывод выходит за пределы заданный диапазон.

jd95 30.05.2019 23:22

Понятно, но я думаю, что если все правильно, ваша модель научится новому способу получения правильных ответов, но на этот раз без выбросов. Но если вам действительно нужно обрезать, я обновлю свой ответ!

Thibault Bacqueyrisses 30.05.2019 23:43

Спасибо за ваше обновление. Отсечение со слоями Lambda сработало :)

jd95 31.05.2019 00:53

Другие вопросы по теме