将 NN 回归问题的输出限制在一定范围内的方法(即我希望我的 NN 始终只预测 -20 到 +30 之间的输出值)
Ways to limit output of NN regression problem in certain limit(i.e. I want my NN to always predict output values only between -20 to +30)
我正在为回归问题训练神经网络。所以输出层有一个线性激活函数。 NN 输出应该在 -20 到 30 之间。我的 NN 大部分时间都表现良好。但是,有时它会给出超过 30 的输出,这对我的系统来说是不可取的。那么有没有人知道任何可以对输出提供这种限制的激活函数或任何关于为我的应用程序修改线性激活函数的建议?
我正在为此应用程序使用带有 tenserflow 后端的 Keras
您应该做的是将目标输出标准化为 [-1, 1] 或 [0, 1] 范围,然后使用 tanh
(对于 [-1, 1])或 sigmoid
(for [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)
我正在为回归问题训练神经网络。所以输出层有一个线性激活函数。 NN 输出应该在 -20 到 30 之间。我的 NN 大部分时间都表现良好。但是,有时它会给出超过 30 的输出,这对我的系统来说是不可取的。那么有没有人知道任何可以对输出提供这种限制的激活函数或任何关于为我的应用程序修改线性激活函数的建议?
我正在为此应用程序使用带有 tenserflow 后端的 Keras
您应该做的是将目标输出标准化为 [-1, 1] 或 [0, 1] 范围,然后使用 tanh
(对于 [-1, 1])或 sigmoid
(for [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)