首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Keras中的Sigmoid层

Keras中的Sigmoid层
EN

Stack Overflow用户
提问于 2017-08-02 00:15:08
回答 2查看 8.3K关注 0票数 3

我有一个值列表,范围从1500025000。我必须将它们分成两类,这样(大约) 20000将最终归入类别1,其余的归入类别2。我认为乙状结肠激活应该适用于这一点。为此,我在keras中使用了以下层:

model = Sequential()

代码语言:javascript
复制
model.add(Dense(1 , input_dim =1 ))
model.add(Activation('sigmoid'))
model.add(Dense(2 , init='normal' , activation = 'softmax'))
model.compile(loss='mean_absolute_error', optimizer='rmsprop')
model.fit(X_train, y_train, validation_data=(X_test, y_test),epochs=10,batch_size=200,verbose=2)

然而,当我为我的样例运行模型时,所有的值都以类别2结束。我如何改进这一点?

EN

回答 2

Stack Overflow用户

发布于 2017-08-06 20:06:15

如果你有一个范围在15000和25000之间的值列表,那么sigmoid会给你所有这些值的接近1.0。sigmoid将所有内容压缩到0到1之间,所以像这样的非常大的值将逐渐接近1。快速而肮脏的测试显示:

代码语言:javascript
复制
>>> import math
>>> def s(x):
...     return 1.0/(1.0+math.exp(-x))
... 
>>> s(15000)
1.0
>>> s(25000)
1.0

要么归一化这些值,这应该不难,因为你知道范围,或者使用不同的激活函数。

当您提到20000的值将最终归入一个类别,其余的归入另一个类别时,问题有点模棱两可,因此,如果您的意思是需要对15000到25000个值(不指值的值)进行分类,那么请不要担心

票数 1
EN

Stack Overflow用户

发布于 2017-12-14 16:17:34

LucidMonkey的评论没有解释为什么,即使在运行梯度下降之后,所有的例子都是第二类。

问题是,对于数值非常大的数字(比如你的),sigmoid的导数实际上是零。

在梯度下降中,您可以逐步接近全局最小值,其大小由模型中导数的大小决定。如果导数为零,那么步骤也将为零,您的模型将被卡住。因此,即使在运行梯度下降之后,您仍将停留在每个示例中sigmoid函数的计算结果为~1的区域。

在sigmoid层之前将数据归一化为均值1和方差0将输入放入sigmoid导数为非零的范围,并且您的梯度下降算法实际上将能够优化。

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

https://stackoverflow.com/questions/45442843

复制
相关文章

相似问题

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