我有一个值列表,范围从15000到25000。我必须将它们分成两类,这样(大约) 20000将最终归入类别1,其余的归入类别2。我认为乙状结肠激活应该适用于这一点。为此,我在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结束。我如何改进这一点?
发布于 2017-08-06 20:06:15
如果你有一个范围在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-12-14 16:17:34
LucidMonkey的评论没有解释为什么,即使在运行梯度下降之后,所有的例子都是第二类。
问题是,对于数值非常大的数字(比如你的),sigmoid的导数实际上是零。
在梯度下降中,您可以逐步接近全局最小值,其大小由模型中导数的大小决定。如果导数为零,那么步骤也将为零,您的模型将被卡住。因此,即使在运行梯度下降之后,您仍将停留在每个示例中sigmoid函数的计算结果为~1的区域。
在sigmoid层之前将数据归一化为均值1和方差0将输入放入sigmoid导数为非零的范围,并且您的梯度下降算法实际上将能够优化。
https://stackoverflow.com/questions/45442843
复制相似问题