【问题标题】:How to restrict the output of Neural Network to be positive in Python, Keras如何在 Python、Keras 中限制神经网络的输出为正
【发布时间】:2018-10-03 13:54:02
【问题描述】:

我使用 Keras 包:

from keras.models import Sequential
from keras.layers import Dense, Activation

model = Sequential([
Dense(100, input_shape=(52,)),
Activation('relu'),
Dense(40),
Activation('softmax'),
Dense(1),
Activation('tanh')
])

 model.compile(optimizer='sgd',
          loss='mean_absolute_error')
 model.fit(train_x2, train_y, epochs=200, batch_size=52)

如何调整它以使其认为输出应为零?我可以在最后改变它,但我希望它在学习时考虑这个事实。

【问题讨论】:

  • 将最后一次激活从 tanh 更改为 sigmoid,因此它将被限制在 0 到 1 的区间内。
  • @czr 但输出可能超过 1。所以,这行不通。
  • 把最后一层改成relu怎么样?它将使output >= 0

标签: python python-3.x neural-network keras


【解决方案1】:

这里有一些不同的策略,选择真的取决于你的用例。它们都有不同的属性,会影响神经网络的行为:

  • sigmoid 或移位tanh 激活:这些将过于严格,在 [0,1] 内而不仅仅是正值。除了更具限制性之外,朝向高/低值的梯度变得非常小。因此,如果样本卡在那里,可能需要很长时间才能回到 sigmoid/tanh 的中心。如果您对这样的受限域感到满意,那么您可以查看和选择更多的激活函数。

  • relu 激活:这里的问题是梯度在零以下时可能为零。因此,如果样本卡在这里,他们将不再学习。然而,尽管负域中的梯度为零,但它的计算速度非常快,并且对于许多问题往往表现良好。

  • softplus 激活:RELU 的平滑版本,因此它永远不会卡在零梯度区域。然而,就像 sigmoid/tanh 一样,学习会随着负数的增加而变慢。

  • exp(output):我发现这往往不太稳定(例如非常迅速地增加

  • square(output):这是一个平滑函数,具有线性梯度。缺点是平方有时会导致您的值爆炸(或在 |output|

  • abs(output):这是线性的,因此相对于square 的优势在于它不会改变值的大小,并且学习是恒定的。不过,它确实在梯度中存在不连续性,因此当输出接近于零并且梯度更新跳过不连续性时,可能会导致更多类似悬崖的梯度拓扑(梯度裁剪在这里可能会有所帮助)。

  • Piecewise[{{.5x^2, |x|<1}, {|x|-.5, |x|>=1}}]:这融合了square的平滑和abs的线性,所以兼有两者的优点。缺点是分段条件使其计算速度较慢(尽管可以说仍然比 exp 或 softplus 快)。我不确定是否有人已经为此创造了一个名字,但也许它可以称为softabs。如果您正在对数据进行规范化,x 可能总是 square 就可以了。 This link 对平滑绝对值函数有一些额外的想法,可能会更好地满足您的需求。

还有最后一点:如果您只想使训练后的权重参数为正值,只需使用权重约束 (abs)!

【讨论】:

  • softplus(output) 是另一种选择。
【解决方案2】:

你可以把激活函数改成relu => f(x) = max(0, x)

model = Sequential()
model.add(Dense(100, input_shape=(52,), kernel_initializer='normal', activation='relu'))
model.add(Dense(40, kernel_initializer='normal', activation='relu'))
model.add(Dense(1, kernel_initializer='normal', activation='relu'))
model.compile(loss='mean_absolute_error', optimizer='sgd')

【讨论】:

    猜你喜欢
    • 2016-02-24
    • 2020-05-17
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    • 2019-01-15
    • 2018-01-24
    • 2018-10-29
    相关资源
    最近更新 更多