1

我正在为回归问题训练 NN。所以输出层具有线性激活函数。NN 输出应该在 -20 到 30 之间。我的 NN 大部分时间都表现良好。但是,有时它会提供超过 30 的输出,这对我的系统来说是不可取的。那么有没有人知道任何可以对输出提供这种限制的激活函数或关于为我的应用程序修改线性激活函数的任何建议?

我正在为这个应用程序使用带有 tenserflow 后端的 Keras

4

2 回答 2

3

你可以做的是用 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)
于 2019-05-30T21:06:05.473 回答
2

您应该做的是将目标输出标准化为 [-1, 1] 或 [0, 1] 范围,然后使用tanh(for [-1, 1]) 或sigmoid(for [0, 1]) 激活输出,并使用归一化数据训练模型。

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

于 2019-05-30T20:48:41.250 回答