2017-02-02 10 views
2

Windows 10でPython 3.5(Anaconda)で実行しているTendorflowをバックエンドとしてKerasで書かれた、トレーニング中にKerasクラシファイアの精度が着実に向上してから0.25に低下します(ローカル最小?)

model = Sequential() 
    model.add(Dense(100, input_dim=283, init='normal', activation='relu')) 
    model.add(Dropout(0.2)) 
    model.add(Dense(150, init='normal', activation='relu')) 
    model.add(Dropout(0.2)) 
    model.add(Dense(200, init='normal', activation='relu')) 
    model.add(Dropout(0.2)) 
    model.add(Dense(200, init='normal', activation='relu')) 
    model.add(Dropout(0.2)) 
    model.add(Dense(200, init='normal', activation='relu')) 
    model.add(Dropout(0.2)) 
    model.add(Dense(4, init='normal', activation='sigmoid')) 
    sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) 
    model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy']) 

私は自分のGPUをトレーニングしています。トレーニング(10000のエポック)の間に、ナイーブネットワークの精度は着実に前に突然、0.25で落下して付着し、0.7と0.9の間のどこかに0.25から増加:

Epoch 1/10000 
    6120/6120 [==============================] - 1s - loss: 1.5329 - acc: 0.2665 
    Epoch 2/10000 
    6120/6120 [==============================] - 1s - loss: 1.2985 - acc: 0.3784 
    Epoch 3/10000 
    6120/6120 [==============================] - 1s - loss: 1.2259 - acc: 0.4891 
    Epoch 4/10000 
    6120/6120 [==============================] - 1s - loss: 1.1867 - acc: 0.5208 
    Epoch 5/10000 
    6120/6120 [==============================] - 1s - loss: 1.1494 - acc: 0.5199 
    Epoch 6/10000 
    6120/6120 [==============================] - 1s - loss: 1.1042 - acc: 0.4953 
    Epoch 7/10000 
    6120/6120 [==============================] - 1s - loss: 1.0491 - acc: 0.4982 
    Epoch 8/10000 
    6120/6120 [==============================] - 1s - loss: 1.0066 - acc: 0.5065 
    Epoch 9/10000 
    6120/6120 [==============================] - 1s - loss: 0.9749 - acc: 0.5338 
    Epoch 10/10000 
    6120/6120 [==============================] - 1s - loss: 0.9456 - acc: 0.5696 
    Epoch 11/10000 
    6120/6120 [==============================] - 1s - loss: 0.9252 - acc: 0.5995 
    Epoch 12/10000 
    6120/6120 [==============================] - 1s - loss: 0.9111 - acc: 0.6106 
    Epoch 13/10000 
    6120/6120 [==============================] - 1s - loss: 0.8772 - acc: 0.6160 
    Epoch 14/10000 
    6120/6120 [==============================] - 1s - loss: 0.8517 - acc: 0.6245 
    Epoch 15/10000 
    6120/6120 [==============================] - 1s - loss: 0.8170 - acc: 0.6345 
    Epoch 16/10000 
    6120/6120 [==============================] - 1s - loss: 0.7850 - acc: 0.6428 
    Epoch 17/10000 
    6120/6120 [==============================] - 1s - loss: 0.7633 - acc: 0.6580 
    Epoch 18/10000 
    6120/6120 [==============================] - 4s - loss: 0.7375 - acc: 0.6717 
    Epoch 19/10000 
    6120/6120 [==============================] - 1s - loss: 0.7058 - acc: 0.6850 
    Epoch 20/10000 
    6120/6120 [==============================] - 1s - loss: 0.6787 - acc: 0.7018 
    Epoch 21/10000 
    6120/6120 [==============================] - 1s - loss: 0.6557 - acc: 0.7093 
    Epoch 22/10000 
    6120/6120 [==============================] - 1s - loss: 0.6304 - acc: 0.7208 
    Epoch 23/10000 
    6120/6120 [==============================] - 1s - loss: 0.6052 - acc: 0.7270 
    Epoch 24/10000 
    6120/6120 [==============================] - 1s - loss: 0.5848 - acc: 0.7371 
    Epoch 25/10000 
    6120/6120 [==============================] - 1s - loss: 0.5564 - acc: 0.7536 
    Epoch 26/10000 
    6120/6120 [==============================] - 1s - loss: 0.1787 - acc: 0.4163 
    Epoch 27/10000 
    6120/6120 [==============================] - 1s - loss: 1.1921e-07 - acc: 0.2500 
    Epoch 28/10000 
    6120/6120 [==============================] - 1s - loss: 1.1921e-07 - acc: 0.2500 
    Epoch 29/10000 
    6120/6120 [==============================] - 1s - loss: 1.1921e-07 - acc: 0.2500 
    Epoch 30/10000 
    6120/6120 [==============================] - 2s - loss: 1.1921e-07 - acc: 0.2500 
    Epoch 31/10000 
    6120/6120 [==============================] - 1s - loss: 1.1921e-07 - acc: 0.2500 
    Epoch 32/10000 
    6120/6120 [==============================] - 1s - loss: 1.1921e-07 - acc: 0.2500 ... 

私は、これはオプティマイザによるものであると推測していますすべてのデータを1つのカテゴリに割り当てるローカルの最小値になります。どのように私はこれを行うことを禁止することができますか?

物事は私が試してみた(しかし、起きてからこれを停止していないようでした):

  1. は、トレーニングデータから例の同数が含まれていることを確保(ADAM)
  2. 異なるオプティマイザを使用して各カテゴリ
  3. は1トンからネットワーク内の隠れ層の数を増やす5
  4. と2の間のカテゴリの数を変える
  5. (現在6000において)訓練データの量を増やしますO 5
  6. を助け、これらの

なし(50〜500)層の幅を変更しません。これがなぜ起こっているのか、そして/またはそれをどう抑えるのか、他のアイデア? Kerasのバグでしょうか?事前に何か提案をいただきありがとうございます。

編集:

model = Sequential() 
model.add(Dense(100, input_dim=npoints, init='normal', activation='relu')) 
model.add(Dropout(0.2)) 
model.add(Dense(150, init='normal', activation='relu')) 
model.add(Dropout(0.2)) 
model.add(Dense(200, init='normal', activation='relu')) 
model.add(Dropout(0.2)) 
model.add(Dense(200, init='normal', activation='relu', W_constraint=maxnorm(3))) 
model.add(Dropout(0.2)) 
model.add(Dense(200, init='normal', activation='relu', W_constraint=maxnorm(3))) 
model.add(Dropout(0.2)) 
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) 
model.add(Dense(ncat, init='normal', activation='softmax')) 
model.compile(loss='mean_squared_error', optimizer=sgd, metrics=['accuracy']) 

問題が(シグモイドから)ソフトマックスに、最終的な活性化を変更して最後の二つの隠れ層にmaxnorm(3)規則を追加することによって解決されたとを表示します多くの提案に感謝します。

+1

問題が発生した後に 'model.predict'の出力を見ましたか?おそらく、最適化中にいくつかの数値問題に遭遇し、すべての出力が 'NaN'または' Inf'ですか?これは、問題の絞り込みに役立ちます。 – sietschie

+1

どのようなタスクを解決したいですか?複数のラベルまたは複数の分類による分類(オブジェクトは1つのクラスに属しているか、複数のクラスに属している可能性がありますか) –

+0

@sietschieありがとう、私は一見と報告するつもりです – SWS

答えて

4

sigmoidで嘘をついた問題は、最後のレイヤーでのアクティブ化として機能します。この場合、最終層の出力は、単一クラスに属する例の確率分布として解釈することはできません。この層からの出力は、通常、最大1まで合算されません。この場合、最適化は予期しない動作につながる可能性があります。私の意見では、maxnormの制約を追加する必要はありませんが、mseの代わりにcategorical_crossentropyを使用することを強くお勧めします。この最適化の場合、この関数がうまく機能することが証明されています。

関連する問題