2016-08-29 6 views
0

1つの隠れ層(RELU活性化関数付き)を持つパーセプトロン(完全に接続されたレイヤを持つニューラルネットワーク)をTensorflowで作成し、それをMNISTデータで正常に実行し、90 %+精度。しかし、2番目の隠れ層を追加すると、確率的勾配降下の多くのミニバッチの後でさえも、非常に低い精度(10%)が得られます。なぜこのようなことが起こるのでしょうか?私が役に立つと思えば、この投稿に私のPythonコードを追加することができます。Tensorflowでのマルチレイヤパーセプトロンの問題

私のグラフコードです(Udacityコースのスターターコードを使用しますが、追加のレイヤーが追加されています)。いくつかの側面を簡単にするためにコメントアウトされていることに注意してください - しかし、これでも簡単なバージョンで、症状は同じ(でも多くの反復後に約10%の低正解率)のまま:

import tensorflow as tf 

batch_size = 128 
hidden_size = 256 
train_subset = 10000 

graph = tf.Graph() 
with graph.as_default(): 

    # Input data. For the training data, we use a placeholder that will be fed 
    # at run time with a training minibatch. 
    tf_train_dataset = tf.placeholder(tf.float32, 
            shape=(batch_size, image_size * image_size)) 
    tf_train_labels = tf.placeholder(tf.float32, shape=(batch_size, num_labels)) 
    #tf_train_dataset = tf.constant(train_dataset[:train_subset, :]) 
    #tf_train_labels = tf.constant(train_labels[:train_subset]) 

    tf_valid_dataset = tf.constant(valid_dataset) 
    tf_test_dataset = tf.constant(test_dataset) 

    # Variables. 
    weightsToHidden1 = tf.Variable(
    tf.truncated_normal([image_size * image_size, hidden_size])) 
    biasesToHidden1 = tf.Variable(tf.zeros([hidden_size])) 

    weightsToHidden2 = tf.Variable(
    tf.truncated_normal([hidden_size, hidden_size])) 
    biasesToHidden2 = tf.Variable(tf.zeros([hidden_size])) 

    weightsToOutput = tf.Variable(
    tf.truncated_normal([hidden_size, num_labels])) 
    biasesToOutput = tf.Variable(tf.zeros([num_labels])) 

    # Training computation.  
    logitsToHidden1 = tf.nn.relu(tf.matmul(tf_train_dataset, weightsToHidden1) 
          + biasesToHidden1) 

    validLogitsToHidden1 = tf.nn.relu(tf.matmul(tf_valid_dataset, weightsToHidden1) 
          + biasesToHidden1) 

    testLogitsToHidden1 = tf.nn.relu(tf.matmul(tf_test_dataset, weightsToHidden1) 
          + biasesToHidden1) 

    logitsToHidden2 = tf.nn.relu(tf.matmul(logitsToHidden1, weightsToHidden2) 
          + biasesToHidden2) 

    validLogitsToHidden2 = tf.nn.relu(tf.matmul(validLogitsToHidden1, weightsToHidden2) 
          + biasesToHidden2) 

    testLogitsToHidden2 = tf.nn.relu(tf.matmul(testLogitsToHidden1, weightsToHidden2) 
          + biasesToHidden2) 


    logitsToOutput = tf.matmul(logitsToHidden2, weightsToOutput) + biasesToOutput 
    validLogitsToOutput = tf.matmul(validLogitsToHidden2, weightsToOutput) + biasesToOutput 
    testLogitsToOutput = tf.matmul(testLogitsToHidden2, weightsToOutput) + biasesToOutput 


    loss = (tf.reduce_mean(
    tf.nn.softmax_cross_entropy_with_logits(logitsToOutput, tf_train_labels))) #+ 
    # tf.nn.l2_loss(weightsToHidden1) * 0.002 + 
    #tf.nn.l2_loss(weightsToHidden2) * 0.002 + 
    #tf.nn.l2_loss(weightsToOutput) * 0.002) 

    # Optimizer. 
    optimizer = tf.train.GradientDescentOptimizer(0.5).minimize(loss) 

    # Predictions for the training, validation, and test data. 
    train_prediction = tf.nn.softmax(logitsToOutput) 
    valid_prediction = tf.nn.softmax(validLogitsToOutput) 
    test_prediction = tf.nn.softmax(testLogitsToOutput) 
+0

はいコードが間違いなく助けになるでしょう:) – fabrizioM

+0

ニューラルネットワークエンジニアリングの専門家がいない限り、コードが必要です。 –

+0

上記のグラフコードを追加しました - 簡潔にするためにセッションコードを省略しました(簡単に他のネットワークと連携しました)が、必要に応じてリクエストによって追加されます。 –

答えて

0

0.01にあなたの学習率を変更しますか、さらに小さな値。しかし、私の場合、精度は2層のパーセプトロンよりもまだ悪いです

関連する問題