Sus*_*200 4 python neural-network python-3.x 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)
Run Code Online (Sandbox Code Playgroud)
我该如何调整它,使其认为输出应该为零?我可以在最后改变它,但我希望它在学习时考虑到这个事实。
Azm*_*sov 14
这里有一些不同的策略,选择实际上取决于您的用例。它们都具有不同的属性,这些属性会影响神经网络的行为:
sigmoid或转移tanh激活:这些限制过于严格,在 [0,1] 范围内,而不仅仅是正值。除了更具限制性之外,高/低值的梯度变得非常小。因此,如果样本卡在那里,可能需要很长时间才能回到 sigmoid/tanh 的中心。如果您对这样的受限域感到满意,那么您可以查看并选择更多激活函数。
relu激活:这里的问题是当梯度低于零时,梯度可能为零。因此,如果样本卡在这里,它们将无法再学习。然而,尽管负域中的梯度为零,但它的计算速度非常快,并且在许多问题上往往表现良好。
softplus激活:RELU 的平滑版本,因此它永远不会陷入零梯度区域。然而,就像 sigmoid/tanh 一样,当它变得更负时,学习会变慢。
exp(output):我发现这往往不太稳定(例如增加非常快< 0)。然而,当与其他函数配合使用时,它仍然可以工作,例如下游 log/ln 或 softmax。
square(output):这是一个平滑函数,具有线性梯度。缺点是平方有时会导致您的值爆炸(或者如果 |output| < 1 则消失);必须谨慎使用标准化来防止这种情况发生。这通常用于损失函数,例如 MSE。
abs(output):这是线性的,因此优点square是它不会改变值的大小,并且学习是恒定的。不过,它确实存在梯度不连续性,因此当输出接近零并且梯度更新跳过不连续性时,可能会导致更多悬崖状的梯度拓扑(梯度裁剪可能会有所帮助)。
Piecewise[{{.5x^2, |x|<1}, {|x|-.5, |x|>=1}}]:融合了 的平滑度square和线性abs,因此兼具两者的优点。缺点是分段条件使得计算速度变慢(尽管可以说仍然比 exp 或 softplus 更快)。我不确定是否有人已经为此创造了一个名字,但也许可以将其称为softabs. 如果您对数据进行标准化,x 可能始终 < 1;所以在这种情况下,您可能只需使用square. 此链接提供了一些关于平滑绝对值函数的其他想法,可能更适合您的需求。
还有最后一点:如果您只想使经过训练的权重参数为正,只需使用权重约束(abs)即可!
您可以将激活函数更改为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')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7592 次 |
| 最近记录: |