1

初心者から深い学習者まで。 gogoelテンソルフローのMNIST_SOFTMAX.pyチュートリアル(https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/mnist_softmax.py)を使用して、何が起こるかを確認するために2つの新しいレイヤーを追加しました。テンソルフローへのレイヤ数の追加MNISTチュートリアルで精度低下の原因となる

x = tf.placeholder(tf.float32, [None, 784]) 
W1 = tf.Variable(tf.zeros([784, 256])) 
W2 = tf.Variable(tf.zeros([256, 256])) 
W3 = tf.Variable(tf.zeros([256, 10])) 

B1 = tf.Variable(tf.zeros([256])) 
B2 = tf.Variable(tf.zeros([256])) 
B3 = tf.Variable(tf.zeros([10])) 

Y1 = tf.matmul(x, W1) + B1 
Y2 = tf.matmul(Y1, W2) + B2 
Y3 = tf.matmul(Y2, W3) + B3 
y = Y3 

に上記変更されたコードが0.9188から0.1028まで精度を低下

x = tf.placeholder(tf.float32, [None, 784]) 
W = tf.Variable(tf.zeros([784, 10])) 
b = tf.Variable(tf.zeros([10])) 
y = tf.matmul(x, W) + b 

。なぜそれが落ちるのか、いくつか考えられますか?

+0

おそらく関連しています:[隠された層のないニューラルネットがない場合](http://stats.stackexchange.com/questions/181771/neural-net-with-hidden-layer-performing-worse-than-without) – blacksite

+0

完全なコードをどこかに投稿できますか?私はあなたがどのように訓練をしているのか見たいと思います。確率的勾配降下? –

+0

のコードhttps://github.com/jeongsoopark/MachineLearning/blob/master/mnist_softmax.py テンソルフローのデフォルトのMNIST_softmax.py – jspark

答えて

3

私はあなたがsymmetry breaking in the weightsと層の間の非線形活性化の両方が必要だと思う:

W = tf.Variable(tf.random_normal([784, 256], stddev=0.1)) 
W1 = tf.Variable(tf.random_normal([256, 256], stddev=0.1)) 
W2 = tf.Variable(tf.random_normal([256, 10], stddev=0.1)) 
b = tf.Variable(tf.zeros([256])) 
b1 = tf.Variable(tf.zeros([256])) 
b2 = tf.Variable(tf.zeros([10])) 

y = tf.matmul(x, W) + b 
y = tf.nn.relu(y) 
y = tf.matmul(y, W1) + b1 
y = tf.nn.relu(y) 
y = tf.matmul(y, W2) + b2 

0.9653の精度を取得します。

+0

それは多層ネットワークを単層よりも優れています。 – jspark

1

レイヤ間に非線形のアクティブ化関数を追加する必要があります。 ReLUを試してみてください。

+0

からレイヤー構造を変更しました。Y1 = tf.nn.relu(tf.matmul(x、 Y3 = tf.matmul(Y2、W3)+ B3' 'Y2 = tf.nn.relu(tf.matmul(Y1、W2)+ B2)' 'Y3 = tf.matmul(Y2、W3)+ B3' 私は試しましたが、0.1135精度 – jspark

+0

損失関数と反復をプロットしようとしています。損失関数は着実に低下するはずです。 – stackoverflowuser2010

2

this postと同じ問題が発生します。基本的に、最初の隠れたレイヤーは最後よりずっと遅く学習します。通常、ネットワークは正しい重みを学習する必要があります。しかし、ここでは、第1層の重みがほとんど変化せず、誤差が次の層に伝播する可能性が最も高い。それは非常に大きく、後続のレイヤーはそれを修正することはできません。体重を確認してください。

+0

random_normalでWを固定してBを初期化すると、精度は0.89になります。これは単層バージョンよりもまだ低いです。しかし今、あなたが指摘している@Lukasz Tracewskiのように、勾配の問題が消えているようです。ありがとう – jspark

+0

あなたのニューラルネットワークが2番目以降のレイヤーを調整してランダムウェイトで実際に動作できるため、私はそれを推測しています。それは "右"の重みを学ぶのが難しい最初の隠れた層の "ノイズ"に対処しなければならないので、まだ悪いです。ありがとう。 –

関連する問題