【问题标题】:Sigmoid layer in KerasKeras 中的 Sigmoid 层
【发布时间】:2018-01-08 14:48:27
【问题描述】:

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

model = Sequential()

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。我该如何改进呢?

【问题讨论】:

  • 你训练过你的模型吗?
  • 如果您发布整个代码会有所帮助。
  • 需要查看model.complie(),model.fit(),以及 X 和 Y 值的数据样本

标签: python machine-learning neural-network keras sigmoid


【解决方案1】:

如果您有一个介于 15000 和 25000 之间的值列表,那么 sigmoid 将为您提供所有这些值的接近 1.0。 sigmoid 将所有内容压缩到 0 和 1 之间,因此像这样的非常大的值将渐近接近 1。快速而肮脏的测试表明:

>>> import math
>>> def s(x):
...     return 1.0/(1.0+math.exp(-x))
... 
>>> s(15000)
1.0
>>> s(25000)
1.0

要么对值进行标准化,因为你知道范围,这应该不难,或者使用不同的激活函数。

当您提到其中 20000 个最终归入一个类别而其余的归入另一类别时,问题有点模棱两可,所以如果您的意思是您有 15000 到 25000 个值(不是指值的值)需要分类的,那没关系

【讨论】:

    【解决方案2】:

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

    问题在于,对于数量级非常大的数字(比如你​​的),sigmoid 的导数实际上为零。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-16
      • 1970-01-01
      • 2020-12-05
      • 2021-07-29
      • 1970-01-01
      • 2017-05-15
      • 2018-08-14
      • 1970-01-01
      相关资源
      最近更新 更多