首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Python,Keras中将神经网络的输出限制为正

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

Stack Overflow用户
提问于 2018-04-23 13:30:36
回答 2查看 4.3K关注 0票数 2

我使用Keras包:

代码语言:javascript
运行
复制
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)

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-23 13:44:27

可以将激活函数更改为relu => f(x) = max(0, x)

代码语言:javascript
运行
复制
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')
票数 5
EN

Stack Overflow用户

发布于 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)来代替!

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49982438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档