我使用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)我如何调整它,使它认为输出应该是零?我可以在最后改变它,但我希望它在学习时考虑到这个事实。
发布于 2020-08-05 23:12:46
这里有一些不同的策略,选择取决于您的用例。它们都具有不同的特性,这些特性会影响神经网络的行为:
sigmoid或移位的tanh激活:这将是过度限制,在0,1,而不仅仅是正值范围内。除了限制性更强之外,向高/低值的梯度变得非常小。因此,如果样品被卡在那里,可能要花很长时间才能回到乙状结肠/坦赫的中心。如果您对这样的受限域没有意见,那么您可以查看并从中选择更多的激活函数。relu激活:这里的问题是,当梯度低于零时,梯度可以是零。所以如果样本被困在这里,他们就不会再学习了。然而,尽管负域的梯度为零,但它的计算速度非常快,而且在许多问题上往往表现良好。softplus激活: RELU的平滑版本,这样它就不会被困在零梯度区域。然而,像sigmoid/tanh一样,随着学习变得越来越消极,学习也会变慢。exp(output):我发现这有点不稳定(例如增长非常快地< 0)。但是,当与其他函数配对时,它仍然可以工作,例如下游日志/ln或softmax。square(output):这是一个光滑的函数,具有线性梯度。缺点是,平方有时会导致值爆炸(或者,如果小于1,则会消失);必须谨慎地使用规范化来防止这种情况发生。这通常用于丢失函数,如MSE。abs(output):这是线性的,所以与square相比,它的优点是它不会改变值的大小,而且学习是恒定的。但是,它在梯度中确实存在不连续性,因此,当输出接近于零时,梯度更新可能会导致更多类似悬崖的梯度拓扑,并且梯度更新会跳过不连续性(梯度裁剪可能会在这里有所帮助)。Piecewise[{{.5x^2, |x|<1}, {|x|-.5, |x|>=1}}]:这把square的平滑性和线性abs混合在一起,所以两者都有优点。缺点是分段条件使得计算速度变慢(尽管可以说仍然比exp或softplus更快)。我不确定是否有人已经为这个发明了一个名称,但是也许它可以被称为softabs。如果您正在规范化您的数据,那么x很可能总是< 1;所以在这种情况下,您可能只使用square就可以了。This link为平滑的绝对值函数提供了一些可能更适合您需要的额外想法。
还有最后一个注意事项:如果您只想使一个经过训练的权重参数为正,只需使用一个权重约束(abs)来代替!
https://stackoverflow.com/questions/49982438
复制相似问题