1

私は、1つの隠れ層とシグモイド活性化関数を持つニューラルネットワークのためのバッチベースの逆伝搬アルゴリズムを実装します。出力レイヤーはワンホットSigmoidレイヤーです。第1層のネットはz1である。適用S字状の後はa1になります。同様に、2番目の層にはz2とa2があります。ニューラルネットワークの損失が減少しても精度は向上しませんか?

x, y = train_data, train_target 
for i in range(0, num_passes): 
    # call 
    z1, a1, z2, a2 = predict(current_model, x) 

    # recall 
    derv_out2 = (y - a2) * (a2 * (1 - a2)) 
    delta2 = np.matmul(np.transpose(a1), derv_out2)/train_size 
    dw2 = delta2 + reg_lambda * w2 
    db2 = np.mean(b2 * derv_out2, 0) 

    derv_out1 = a1 * np.reshape(np.sum(delta2 * w2, 1), [1, a1.shape[1]]) 
    delta1 = np.matmul(np.transpose(x), derv_out1)/train_size 
    dw1 = delta1 + reg_lambda * w1 
    db1 = np.mean(b1 * derv_out1, 0) 

    # gradient descent parameter update 
    w1 += learning_rate * dw1 
    b1 += learning_rate * db1 
    w2 += learning_rate * dw2 
    b2 += learning_rate * db2 

    # assign new parameters to the model 
    current_model = {'w1': w1, 'b1': b1, 'w2': w2, 'b2': b2} 

完全なコードファイル:

バックプロパゲーションプロセスは、次のようであるlink

は、上記のアルゴリズムの損失が減少しているが、分類の精度は約ランダム選択です。何が問題ですか?

+0

精度メトリックは単純なav(合計(1または0))ですが、損失は完全な出力ベクトルと目的の値の比較に基づいています。ネットを走らせると、真偽精度テストが良くなることなく出力ベクトルの差が小さくなります。あなたの損失を簡略化すると.. – bivouac0

+0

'np.sqrt(np.sum(np.square(output - target)))' '' learning_rate = 1.0'を設定すると、精度と損失の両方がちょうどいくつかの反復と多くの変更しないでください。ここでの大きな問題は、デルタ計算にエラーがあり、どこかに悪いアップデートを与えていることです。 (ここに複数のコメントについて申し訳ありません - 事故で入力してください) – bivouac0

+0

楽しく私はあなたに最適化コード/モデルをKerasの同等物に置き換えました。 SDG最適化と50,000のバッチサイズをそのまま使用しても、最適化されませんでした(少なくとも合理的な時間ではない)。バッチサイズを128に変更した場合は、100エポック程度に最適化されています。オプティマイザをRMSProp(128バッチ)に切り替えると、最初のエポック後に最適化されました。データを処理するのに十分な強力な最適化アルゴリズムがないかもしれません。このようにしなければならない場合、私は小さなバッチサイズと多くの繰り返しを試みます。 – bivouac0

答えて

0

@ bivouac0コメントに基づいて、学習率を調整しようとしています。 基本的なステップ(長い学習時間のため)では、0.1または0.01の学習率が非常に低いことがわかりました。その後、学習率を調整する適応型アプローチを実装します(損失が下降するとレートを上げ、下降するとレートを上げます)。このアプローチを使用すると、精度が大幅に向上しました。