2017-08-01 47 views
1

我有一個值列表,範圍從1500025000。我必須將它們分成兩類,(大約)20000最終將歸入第1類,其餘的歸類爲第2類。我發現S形激活應該適用於此。我使用了以下幾層keras爲: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類結束了我怎樣才能改進這個?

+0

你訓練了你的模型嗎? –

+0

這將有助於您發佈整個代碼。 –

+0

需要查看'model.complie()','model.fit()'和X和Y值的數據樣本 – DJK

回答

1

如果你有一個範圍在15000到25000之間的數值列表,那麼sigmoid會給你所有這些附近的1.0。乙狀結腸南瓜一切以適應這樣會漸漸接近1.快速0和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的值(不是指值的值)需要進行分類,然後沒關係

0

LucidMonkey的評論並沒有解釋爲什麼,即使在運行梯度下降後,所有的例子都是類別2.

的問題是,對於具有非常大的量級的數字(如你的),sigmoid的派生實際上是零。

在梯度下降中,您將採取步驟朝向全局最小值,其大小由模型中的衍生物大小決定。如果衍生物爲零,那麼這些步驟也將爲零,並且您的模型將被卡住。因此,即使在運行梯度下降之後,您仍將停留在每個示例中sigmoid函數評估爲〜1的區域。

在sigmoid圖層將輸入置於sigmoid的導數非零的範圍之前,將數據標準化爲平均值1和方差0,並且您的梯度下降算法實際上可以進行優化。