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

如何在Python、Keras中限制神经网络的输出为正,python,python-3.x,neural-network,keras,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(optim

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

如何调整它,使其认为输出应为零?我可以在最后改变它,但是我想在学习的时候考虑这个事实。< /P> < P>你可以将激活函数改为<代码> Relu <代码> > >代码> f(x)= max(0,x)< /代码>


您可以将激活功能更改为
relu
=>
f(x)=max(0,x)


这里有一些不同的策略,并不是很多都适用于所有情况。在我看来,平方(最后列出的)是最好的:

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

这里有一些不同的策略,但并不是很多都适用于所有情况。在我看来,平方(最后列出的)是最好的:

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

将最后一次激活从tanh更改为sigmoid,因此它将被限制在0到1的间隔内。@czr但输出可能大于1。所以,这将不起作用。将最后一层更改为
relu
怎么样?它将使
输出>=0
将最后一次激活从tanh更改为sigmoid,因此它将被限制在0到1的间隔内。@czr但输出可能大于1。所以,这将不起作用。将最后一层更改为
relu
怎么样?它将使
output>=0
softplus(输出)是另一个选项。softplus(输出)是另一个选项。
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')