Question

Il y a beaucoup de ressources en ligne sur la façon de mettre en œuvre MLP dans tensorflow, et la plupart des échantillons fonctionnent :) Mais je suis intéressé par un particulier, que j'ai appris https://www.coursera.org/learn/machine-learning . Dans lequel, il utilise une fonction coût défini comme suit:

$ J (\ theta) = \ frac {1} {m} \ sum_ {i = 1} ^ {m} \ sum_ {k = 1} ^ {K} \ left [-y_k ^ {(i)} \ log ( (h_ \ theta (x ^ {(i)})) _ k - (1 - y_k ^ {(i)}) \ log (1 - (h_ \ theta (x ^ {(i)})) _ k \ right] $

$ h_ \ theta $ est le sigmoïde fonction.

Et il y a ma mise en œuvre:

# one hidden layer MLP

x = tf.placeholder(tf.float32, shape=[None, 784])
y = tf.placeholder(tf.float32, shape=[None, 10])

W_h1 = tf.Variable(tf.random_normal([784, 512]))
h1 = tf.nn.sigmoid(tf.matmul(x, W_h1))

W_out = tf.Variable(tf.random_normal([512, 10]))
y_ = tf.matmul(h1, W_out)

# cross_entropy = tf.nn.sigmoid_cross_entropy_with_logits(y_, y)
cross_entropy = tf.reduce_sum(- y * tf.log(y_) - (1 - y) * tf.log(1 - y_), 1)
loss = tf.reduce_mean(cross_entropy)
train_step = tf.train.GradientDescentOptimizer(0.05).minimize(loss)

correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

# train
with tf.Session() as s:
    s.run(tf.initialize_all_variables())

    for i in range(10000):
        batch_x, batch_y = mnist.train.next_batch(100)
        s.run(train_step, feed_dict={x: batch_x, y: batch_y})

        if i % 100 == 0:
            train_accuracy = accuracy.eval(feed_dict={x: batch_x, y: batch_y})
            print('step {0}, training accuracy {1}'.format(i, train_accuracy))

Je pense que la définition des couches sont correctes, mais le problème est dans le cross_entropy . Si j'utilise le premier, l'On avait mis en commentaire , le modèle converge rapidement; mais si j'utilise le 2ème, que je pense / espoir est la traduction de l'équation précédente, le modèle ne converge pas.

Était-ce utile?

La solution

Vous avez fait trois erreurs:

  1. Vous avez omis les termes de décalage avant que les transformations non linéaires (les variables B_1 et b_out). Cela augmente la puissance représentative du réseau de neurones.
  2. Vous avez omis la transformation softmax à la couche supérieure. Cela rend la sortie d'une distribution de probabilité, de sorte que vous pouvez calculer la croix-entropie, qui est la fonction habituelle des coûts pour la classification.
  3. Vous avez utilisé la forme binaire de la croix-entropie lorsque vous devriez avoir utilisé la forme multi-classe.

Quand je lance ce je reçois plus de 90% exactitudes:

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

mnist = input_data.read_data_sets('/tmp/MNIST_data', one_hot=True)

x = tf.placeholder(tf.float32, shape=[None, 784])
y = tf.placeholder(tf.float32, shape=[None, 10])

W_h1 = tf.Variable(tf.random_normal([784, 512]))
b_1 = tf.Variable(tf.random_normal([512]))
h1 = tf.nn.sigmoid(tf.matmul(x, W_h1) + b_1)

W_out = tf.Variable(tf.random_normal([512, 10]))
b_out = tf.Variable(tf.random_normal([10]))
y_ = tf.nn.softmax(tf.matmul(h1, W_out) + b_out)

# cross_entropy = tf.nn.sigmoid_cross_entropy_with_logits(y_, y)
cross_entropy = tf.reduce_sum(- y * tf.log(y_), 1)
loss = tf.reduce_mean(cross_entropy)
train_step = tf.train.GradientDescentOptimizer(0.05).minimize(loss)

correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

# train
with tf.Session() as s:
    s.run(tf.initialize_all_variables())

    for i in range(10000):
        batch_x, batch_y = mnist.train.next_batch(100)
        s.run(train_step, feed_dict={x: batch_x, y: batch_y})

        if i % 1000 == 0:
            train_accuracy = accuracy.eval(feed_dict={x: batch_x, y: batch_y})
            print('step {0}, training accuracy {1}'.format(i, train_accuracy))
Licencié sous: CC-BY-SA avec attribution
scroll top