Why does TensorFlow return [[nan nan]] instead of probabilities from a CSV file?

后端 未结 2 531
面向向阳花
面向向阳花 2021-01-02 09:24

Here is the code that I am using. I\'m trying to get a 1, 0, or hopefully a probability in result to a real test set. When I just split up the training set and run it on the

相关标签:
2条回答
  • 2021-01-02 09:36

    I don't know the direct answer, but I know how I'd approach debugging it: tf.Print. It's an op that prints the value as tensorflow is executing, and returns the tensor for further computation, so you can just sprinkle them inline in your model.

    Try throwing in a few of these. Instead of this line:

    tf_softmax = tf.nn.softmax(tf.matmul(tf_in,tf_weight) + tf_bias)
    

    Try:

    tf_bias = tf.Print(tf_bias, [tf_bias], "Bias: ")
    tf_weight = tf.Print(tf_weight, [tf_weight], "Weight: ")
    tf_in = tf.Print(tf_in, [tf_in], "TF_in: ")
    matmul_result = tf.matmul(tf_in, tf_weight)
    matmul_result = tf.Print(matmul_result, [matmul_result], "Matmul: ")
    tf_softmax = tf.nn.softmax(matmul_result + tf_bias)
    

    to see what Tensorflow thinks the intermediate values are. If the NaNs are showing up earlier in the pipeline, it should give you a better idea of where the problem lies. Good luck! If you get some data out of this, feel free to follow up and we'll see if we can get you further.

    Updated to add: Here's a stripped-down debugging version to try, where I got rid of the input functions and just generated some random data:

    import tensorflow as tf
    import numpy as np
    
    def dense_to_one_hot(labels_dense, num_classes=10):
      """Convert class labels from scalars to one-hot vectors."""
      num_labels = labels_dense.shape[0]
      index_offset = np.arange(num_labels) * num_classes
      labels_one_hot = np.zeros((num_labels, num_classes))
      labels_one_hot.flat[index_offset + labels_dense.ravel()] = 1
      return labels_one_hot
    
    x_train=np.random.normal(0, 1, [50,10])
    y_train=np.random.randint(0, 10, [50])
    y_train_onehot = dense_to_one_hot(y_train, 10)
    
    x_test=np.random.normal(0, 1, [50,10])
    y_test=np.random.randint(0, 10, [50])
    y_test_onehot = dense_to_one_hot(y_test, 10)
    
    #  A number of features, 4 in this example
    #  B = 3 species of Iris (setosa, virginica and versicolor)
    
    A=10
    B=10
    tf_in = tf.placeholder("float", [None, A]) # Features
    tf_weight = tf.Variable(tf.zeros([A,B]))
    tf_bias = tf.Variable(tf.zeros([B]))
    tf_softmax = tf.nn.softmax(tf.matmul(tf_in,tf_weight) + tf_bias)
    
    tf_bias = tf.Print(tf_bias, [tf_bias], "Bias: ")
    tf_weight = tf.Print(tf_weight, [tf_weight], "Weight: ")
    tf_in = tf.Print(tf_in, [tf_in], "TF_in: ")
    matmul_result = tf.matmul(tf_in, tf_weight)
    matmul_result = tf.Print(matmul_result, [matmul_result], "Matmul: ")
    tf_softmax = tf.nn.softmax(matmul_result + tf_bias)
    
    # Training via backpropagation
    tf_softmax_correct = tf.placeholder("float", [None,B])
    tf_cross_entropy = -tf.reduce_sum(tf_softmax_correct*tf.log(tf_softmax))
    
    # Train using tf.train.GradientDescentOptimizer
    tf_train_step = tf.train.GradientDescentOptimizer(0.01).minimize(tf_cross_entropy)
    
    # Add accuracy checking nodes
    tf_correct_prediction = tf.equal(tf.argmax(tf_softmax,1), tf.argmax(tf_softmax_correct,1))
    tf_accuracy = tf.reduce_mean(tf.cast(tf_correct_prediction, "float"))
    
    print tf_correct_prediction
    print tf_accuracy
    
    init = tf.initialize_all_variables()
    sess = tf.Session()
    sess.run(init)
    
    for i in range(1):
        print "Running the training step"
        sess.run(tf_train_step, feed_dict={tf_in: x_train, tf_softmax_correct: y_train_onehot})
        #print y_train_onehot
        #saver.save(sess, 'trained_csv_model')
    
        print "Running the eval step"
        ans = sess.run(tf_softmax, feed_dict={tf_in: x_test})
        print ans
    

    You should see lines starting with "Bias: ", etc.

    0 讨论(0)
  • 2021-01-02 09:50

    tf_cross_entropy = -tf.reduce_sum(tf_softmax_correct*tf.log(tf_softmax))

    This was my problem on a project I was testing on. Specificaly it ended up being 0*log(0) which produces nan.

    If you replace this with:

    tf_cross_entropy = -tf.reduce_sum(tf_softmax_correct*tf.log(tf_softmax + 1e-50)) It should avoid the problem.

    Ive also used reduce_mean rather than reduce_sum. If you double the batch size and use reduce_sum it will double the cost (and the magnitude of the gradient). In addition to that when using tf.print (which prints to the console tensorfow was started from) it makes it a bit more comparable when varying batch size.

    Specifically this is what I'm using now when debugging:

    cross_entropy = -tf.reduce_sum(y*tf.log(model + 1e-50)) ## avoid nan due to 0*log(0) cross_entropy = tf.Print(cross_entropy, [cross_entropy], "cost") #print to the console tensorflow was started from

    0 讨论(0)
提交回复
热议问题