我有一个值列表,范围从15000
到25000
。我必须将它们分成两类,这样(大约)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结束。我该如何改进?
答案 0 :(得分: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个值(不是指值的值)需要进行分类,然后再进行分类
答案 1 :(得分:1)
LucidMonkey的评论并没有解释为什么,即使在运行梯度下降之后,所有的例子都是第2类。
问题在于对于幅度非常大的数字(如你的),sigmoid的导数实际上为零。
在梯度下降中,您可以采用全局最小值,其大小由模型中导数的大小控制。如果导数为零,那么步骤也将为零,您的模型将被卡住。因此,即使在运行梯度下降之后,您仍将停留在sigmoid函数在每个示例中评估为~1的区域。
在sigmoid层之前将数据规范化为1和方差0将输入放入sigmoid的导数非零的范围内,并且梯度下降算法实际上能够进行优化。