Keras 将NN回归问题的输出限制在一定范围内的方法(即,我希望我的NN总是预测-20到+;30之间的输出值)

Keras 将NN回归问题的输出限制在一定范围内的方法(即,我希望我的NN总是预测-20到+;30之间的输出值),keras,neural-network,regression,activation-function,mlp,Keras,Neural Network,Regression,Activation Function,Mlp,我正在为回归问题训练神经网络。因此,输出层具有线性激活函数。NN输出应该在-20到30之间。我的NN大部分时间都表现良好。然而,有时它的输出超过30,这对我的系统来说是不可取的。那么,有谁知道有什么激活函数可以对输出提供这样的限制,或者有什么建议可以为我的应用程序修改线性激活函数 我将Keras与tenserflow后端一起用于此应用程序您应该做的是将目标输出标准化到范围[-1,1]或[0,1],然后在输出处使用tanh(对于[-1,1])或sigmoid(对于[0,1])激活,并使用标准化数据

我正在为回归问题训练神经网络。因此,输出层具有线性激活函数。NN输出应该在-20到30之间。我的NN大部分时间都表现良好。然而,有时它的输出超过30,这对我的系统来说是不可取的。那么,有谁知道有什么激活函数可以对输出提供这样的限制,或者有什么建议可以为我的应用程序修改线性激活函数


我将Keras与tenserflow后端一起用于此应用程序

您应该做的是将目标输出标准化到范围[-1,1]或[0,1],然后在输出处使用
tanh
(对于[-1,1])或
sigmoid
(对于[0,1])激活,并使用标准化数据训练模型


然后,您可以对预测进行非规范化处理,以在推断过程中获得原始范围内的值。

您可以做的是使用sigmoid激活最后一层,结果将介于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)

规范化输入并不能保证输出在同一范围内(关于您的语句“使用规范化数据训练模型”)。@Markus我说要规范化输出,而不是输入。@MatiasValdenegro我只想在输出值超出范围时缩放/更改输出值。如果输出在这个范围内,那么它对我的应用程序来说是完美的预测。例如,如果我的输出在1到50之间。因此,如果我将这些值缩放到1到30之间,那么(1到30)之间的所有输出也将被缩放,并且其值将小于实际预测值。那不是我想要的。我想缩放任何大于30到30的输出值。以及任何小于-20到-20的输出值。任何介于-20到30之间的值都可以保持原样。@JD95不是缩放,即钳制,但如果对数据进行规格化,则规格化值中不会产生超出该范围的值。谢谢您的快速回答!然而,我仍然有一个疑问,如果我将根据最小值和最大值缩放输出,那么大多数输出数据将根据缩放进行更改。但是,如果我的模型输出介于-20到30之间,那么它的perfact匹配没有错误,缩放它们会增加一些错误:(因此,我想将我的输出缩放到最小值或最大值,但我的输出超出了给定的范围。我明白了,但我认为如果一切正常,您的模型将学习一种新的方法来获得正确的答案,但这次没有异常值。但是如果您确实需要剪裁,我将更新我的答案!感谢您的更新。使用Lambda层剪裁成功:)