1

Novice à l'apprentissage en profondeur. Avec le tutoriel MNIST_SOFTMAX.py de gogoel tensorflow (https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/mnist_softmax.py), j'ai ajouté deux nouvelles couches juste pour voir ce qui se passe.Ajout de plusieurs calques à tensorflow Le tutoriel MNIST réduit la précision

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 

code modifié ci-dessus dans

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 

il laisse tomber la précision 0,9188 à 0,1028. puis-je avoir une idée de la raison pour laquelle ça tombe?

+0

Peut-être en relation: [Réseau neuronal avec couche cachée moins performante que sans] (http://stats.stackexchange.com/questions/181771/neural-net-with-hidden-layer-performing-worse-than-without) – blacksite

+0

Pouvez-vous poster quelque part le code complet? J'aimerais voir comment tu t'entraînes. Descente de gradient stochastique? –

+0

code dans https://github.com/jeongsoopark/MachineLearning/blob/master/mnist_softmax.py J'ai seulement modifié la construction de la couche à partir de la valeur par défaut de tensorflow MNIST_softmax.py – jspark

Répondre

3

Je pense que vous avez besoin à la fois symmetry breaking in the weights et une activation non linéaire entre les couches:

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 

qui obtient une précision de 0,9653.

+0

merci. cela rend le réseau multicouche meilleur que le monocouche. – jspark

1

Vous devez ajouter une fonction d'activation non linéaire entre vos couches. Essayez ReLU.

+0

'Y1 = tf.nn.relu (tf.matmul (x, W1) + B1) ' ' Y2 = tf.nn.relu (tf.matmul (Y1, W2) + B2) ' ' Y3 = tf.matmul (Y2, W3) + B3' J'ai essayé mais il obtient 0.1135 précision – jspark

+0

Essayer de tracer votre fonction de perte par rapport à l'itération. La fonction de perte devrait être en baisse constante. – stackoverflowuser2010

2

Vous souffrez du même problème que la réponse this post. Essentiellement, vos premiers calques cachés apprennent beaucoup plus lentement que la dernière. Normalement, votre réseau devrait apprendre les poids corrects. Ici, cependant, très probablement les poids dans la première couche changent très peu et l'erreur se propage aux couches suivantes. Il est si grand que les couches suivantes ne peuvent probablement pas le corriger. Vérifiez les poids.

+0

Fixation W, initialisation B avec random_normal le corriger, précision = 0,89. ce qui est encore inférieur à la version monocouche. Mais maintenant, il semble que le problème du gradient disparaisse comme @ Lukasz Tracewski vous le signalez. Merci – jspark

+0

Si je dois faire une supposition c'est parce que votre réseau de neurones peut réellement travailler avec des poids aléatoires en ajustant la deuxième couche et les couches suivantes. C'est encore pire, car il faut composer avec le premier «bruit» de la couche cachée, qui a de la difficulté à apprendre les «bons» poids. –