如何在Python,Keras中限制神经网络的输出为正

时间:2018-04-23 13:30:36

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

我使用包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)

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

2 个答案:

答案 0 :(得分:1)

您可以将激活功能更改为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')

答案 1 :(得分:1)

这里有一些各种各样的策略,实际上在所有情况下都不会起作用。在我看来,平方是最好的:

  • relu激活:这里的问题是,当梯度低于零时,梯度可能为零。因此,如果样本卡在这里,他们将不再学习。
  • exp(output):我发现这种趋势不太稳定(例如,增长非常快<0)。
  • sigmoid或移位的tanh:这些限制过于严格,在[0,1]内不仅是正值。除了更具限制性之外,朝着高/低值的梯度变得非常小。因此,如果样本卡在那里,可能需要永远回到乙状结肠/ tanh的中心。
  • square(output):梯度仅为2 *输出,例如线性,适用于任何值。它限制为正值。根据我的经验,这是最稳定,最容易训练的。