我使用包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)
如何调整它以使其认为输出应为零?我可以在最后改变它,但我希望它在学习的同时考虑这个事实。
答案 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 *输出,例如线性,适用于任何值。它限制为正值。根据我的经验,这是最稳定,最容易训练的。