3

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

模型=顺序()

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

4

2 回答 2

1

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

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

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

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

于 2017-12-14T08:17:34.303 回答
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 个值(不是指值的值)需要被分类,然后没关系

于 2017-08-06T12:06:14.743 回答