mnistの例でのReLUとシグモイド


8

注意してください:私は次の例を改善しようとはしていません。99%以上の精度が得られることは知っています。コード全体が問題です。この単純なコードを試したところ、約95%の精度が得られました。アクティベーション関数をシグモイドからreluに変更すると、50%未満に低下します。これが起こる理論的な理由はありますか?

次の例をオンラインで見つけました。

from keras.datasets import mnist
from keras.models import Sequential 
from keras.layers.core import Dense, Activation
from keras.utils import np_utils

(X_train, Y_train), (X_test, Y_test) = mnist.load_data()

X_train = X_train.reshape(60000, 784)     
X_test = X_test.reshape(10000, 784)

Y_train = np_utils.to_categorical(Y_train, classes)     
Y_test = np_utils.to_categorical(Y_test, classes)

batch_size = 100      
epochs = 15

model = Sequential()     
model.add(Dense(100, input_dim=784)) 
model.add(Activation('sigmoid'))     
model.add(Dense(10)) 
model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy', metrics=['accuracy'], optimizer='sgd')

model.fit(X_train, Y_train, batch_size=batch_size, epochs=epochs, verbose=1)

score = model.evaluate(X_test, Y_test, verbose=1)
print('Test accuracy:', score[1])

これにより、約95%の精度が得られますが、ReLUでシグモイドを変更すると、50%未満の精度しか得られません。何故ですか?


ケラス自身のreluの例と比較してください。
Emre

この例では、reluがシグモイドよりもはるかに悪い理由を理解したいと思います。彼らは別のオプティマイザを使用しています。sgdはreluでうまく機能しませんか?
ユーザー

モデルが収束しなかったか、オーバーフィットしたかのどちらかです。ドキュメントではドロップアウト(正規化)を使用していて、使用しなかったため、2番目のオプションにさらに傾倒します。この問題は、テストセットとトレーニングセットの学習曲線を描くことでデバッグできます。
Emre、2017

質問は簡単です。なぜそれがシグモイドでうまく動作し、reluではないのですか?コメントのどれも質問を扱っていません。
ユーザー

RELUでのトレーニングの精度はどのくらいですか?
イムラン2018

回答:


4

私はあなたの正確なコードを取り、置き換えました

model.add(Activation('sigmoid'))

沿って

model.add(Activation('relu'))

確かに私はあなたと同じ問題を経験しました:55%の精度しかありません、これは悪いです...

解決策:入力画像の値を[0、255]から[0,1]に再スケールしましたが、うまくいきました:93%の精度でReLU!(https://github.com/keras-team/keras/blob/master/examples/mnist_mlp.pyからインスピレーションを得た):

from keras.datasets import mnist
from keras.models import Sequential 
from keras.layers.core import Dense, Activation
from keras.utils import np_utils

(X_train, Y_train), (X_test, Y_test) = mnist.load_data()

X_train = X_train.reshape(60000, 784)     
X_test = X_test.reshape(10000, 784)
X_train = X_train.astype('float32') / 255
X_test = X_test.astype('float32') / 255

Y_train = np_utils.to_categorical(Y_train, 10)
Y_test = np_utils.to_categorical(Y_test, 10)

batch_size = 100
epochs = 15

model = Sequential()     
model.add(Dense(100, input_dim=784)) 
model.add(Activation('relu'))
model.add(Dense(10)) 
model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy', metrics=['accuracy'], optimizer='sgd')

model.fit(X_train, Y_train, batch_size=batch_size, epochs=epochs, verbose=1)

score = model.evaluate(X_test, Y_test, verbose=1)
print('Test accuracy:', score[1])

出力:

試験精度:0.934


潜在的な説明:[0、255]で入力を使用する場合、レイヤーの加重和を実行する場合 Lz=aL1wL+bL、 値 z多くの場合も大きくなります。もしz 多くの場合(またはそれが0よりも大きい場合でも)大きい場合は、約100としましょう。 ReLUz=z、そしてこの活性化関数の「非線形」の側面を完全に失います!別の言い方をすると、入力が[0、255]の場合、zはしばしば0から遠く離れており、「興味深い非線形の事柄」が起こっている場所を完全に回避します(0付近でReLU関数は非線形でのように見えます__/)...入力が[0,1]の場合、次に加重和z 多くの場合0に近い場合があります:場合によっては0未満になることもあります(重みは[-1、1]でランダムに初期化されるため、可能です!)、0より大きい場合もあります。その後、より多くのニューロンのアクティブ化/非アクティブ化が発生します。 ..これは、[0、1]の入力でうまく機能する理由を説明する可能性があります。


ご尽力ありがとうございました(+1)。私の質問ですが、なぜですか?理論的な解釈は何ですか?
ユーザー

あなたの主張は合理的だ。回答のテキストに短いコメントを追加したい場合(コメントを読む必要がない場合)、回答を受け入れます。
ユーザー、

@userできました!
Basj

1

ReLuアクティベーション機能を使用して約98%の精度を得ました。私は次のアーキテクチャを使用しました:

  1. 300の非表示ユニットを持つ完全に接続されたレイヤー
  2. ReLuアクティベーション
  3. 10個の非表示ユニットがある完全に接続されたレイヤー
  4. Softmaxレイヤー
  5. log(0)と1より大きい値を回避するための出力クリッピング1e-10から0.999999
  6. クロスエントロピー損失

私はあなたが出力クリッピングを追加してからそれを訓練するべきだと思います、それがうまくいくことを願っています。


ありがとうございました。あなたの答えは、シグモイドであるにもかかわらずreluが収束しない理由についての@Basjのコメントで確認されているようです。+1しましたが、理由はまだわかりません。他の回答のコメントはそれを説明していると思います。
ユーザー、

-1

MNISTでは、確率に基づいて予測しようとしているからです。

シグモイド関数は、 バツ 間の値 0 そして 1。これは、ラベルと一致する最も可能性の高い数字を選択するのに役立ちます。

ReLU機能は何もつぶしません。もしバツ 値はより小さい 0、出力は 0。それ以上0、答えは バツ価値そのもの。確率は作成されていません。

正直なところ、差し込んだときに10%を超えるものがあるとは驚きです。


1
彼は彼が隠し層の活性化をシグモイドからRELUに変更したことを意味していると思います。
イムラン2018

1
イムランが言ったように@daleadil、隠された層はアクティベーション機能としてのreluを持つことができます、これは確率とは何の関係もありません
ユーザー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.