2017-05-24 3 views
1

J'ai fait un réseau de neurones uniques à alimentation directe. La prédiction imprime 0.5 alors qu'il devrait imprimer 0.0. Je suis très nouveau pour tensorflow. Aidez-moi, s'il vous plaît. Ceci est mon code:réseau d'alimentation de neurone unique dans un flux tensoriel

""" 
O---(w1)-\ 
      \ 
O---(w2)-->Sum ---> Sigmoid ---> O 3 inputs and 1 output 
     /
O---(w3)-/ 

      | Input  | Output 
Example 1 | 0 0 1 | 0 
Example 2 | 1 1 1 | 1 
Example 3 | 1 0 1 | 1 
Exmaple 4 | 0 1 1 | 0 

""" 

import tensorflow as tf 

features = tf.placeholder(tf.float32, [None, 3]) 
labels = tf.placeholder(tf.float32, [None]) 

#Random weights 
W = tf.Variable([[-0.16595599], [0.44064899], [-0.99977125]], tf.float32) 

init = tf.initialize_all_variables() 
sess = tf.Session() 
sess.run(init) 

predict = tf.nn.sigmoid(tf.matmul(features, W)) 

error = labels - predict 

# Training 
optimizer = tf.train.GradientDescentOptimizer(0.01) 
train = optimizer.minimize(error) 

for i in range(10000): 
    sess.run(train, feed_dict={features: [[0, 1, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]], labels: [0, 1, 1, 0]}) 

training_cost = sess.run(error, feed_dict={features: [[0, 1, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]], labels: [0, 1, 1, 0]}) 
print('Training cost = ', training_cost, 'W = ', sess.run(W)) 

print(sess.run(predict, feed_dict={features:[[0, 1, 1]]})) 

J'ai également fait manuellement ce modèle en utilisant seulement numpy qui fonctionne bien.

Edit: J'ai essayé tous les types de fonction de coût, y compris tf.reduce_mean (PREDICT-étiquettes) ** 2)

+0

étiquettes - prédire n'est pas une erreur valide, peut-être que vous vouliez dire tf.reduce_mean ((étiquettes) ** - 2 prévoir)? – lejlot

Répondre

1

vous aviez deux erreurs

(a) votre fonction d'erreur d'origine permet d'optimiser la mauvais objectif

(b) votre vecteur cible a été transposée la ligne suivante rend visible print(sess.run(predict-label, feed_dict={features: [[0, 1, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]], labels: [0, 1, 1, 0]})}))

le résultat est une matrice 4x4.

Vous pouvez atteindre le résultat souhaité en utilisant le code suivant

import tensorflow as tf 

features = tf.placeholder(tf.float32, [None, 3]) 
labels = tf.placeholder(tf.float32, [None,1]) 

#Random weights 
W = tf.Variable([[10.0], [000.0], [0.200]], tf.float32) 
init = tf.initialize_all_variables() 
with tf.Session() as sess: 
    sess.run(init) 

    predict = tf.nn.sigmoid(tf.matmul(features, W)) 

    print(sess.run(predict, feed_dict={features:[[0, 1, 1]]})) 

    lbls= [[0], [1], [1], [0]] 
    print(sess.run(predict, 
       feed_dict={features: [[0, 1, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]], labels:lbls})) 


    # error = labels - predict 
    error = tf.reduce_mean((labels - predict)**2) 
    # Training 
    optimizer = tf.train.GradientDescentOptimizer(10) 
    train = optimizer.minimize(error) 

    for i in range(100): 
     sess.run(train, 
     feed_dict={features: [[0, 1, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]], labels: lbls}) 
     training_cost = sess.run(error, 
          feed_dict={features: [[0, 1, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]], 
             labels: lbls}) 
     classe = sess.run((labels-predict), 
          feed_dict={features: [[0, 1, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]], 
             labels: lbls}) 
     print('Training cost = ', training_cost, 'W = ', classe) 

    print(sess.run(predict, 
       feed_dict={features: [[0, 1, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]]}))