问题
I am making a simple Logistic Regression Model using Tensorflow. But the cost value is always returning nan.
My data sets are divided into x_data and y_data. x_data is a coordinate in an image and y_data is 1 or 0 since my image is black and white. I am trying to find a dividing line between white color and black color.
def train(input,iterations):
import tensorflow as tf
tf.set_random_seed(777) # for reproducibility
x_data = []
y_data = []
i_dim = input.shape[0]
j_dim = input.shape[1]
for i in range(i_dim):
for j in range(j_dim):
x_data.append([j,i_dim-i-1])
y_data.append([int(input[i,j])])
# placeholders for a tensor that will be always fed.
X = tf.placeholder(tf.float32, shape=[None, 2])
Y = tf.placeholder(tf.float32, shape=[None, 1])
W = tf.Variable(tf.random_normal([2, 1]), name='weight')
b = tf.Variable(tf.random_normal([1]), name='bias')
# Hypothesis using sigmoid: tf.div(1., 1. + tf.exp(tf.matmul(X, W)))
hypothesis = tf.sigmoid(tf.matmul(X, W) + b)
# cost/loss function
cost = -tf.reduce_mean(Y * tf.log(hypothesis) + (1 - Y) *
tf.log(1 - hypothesis))
train = tf.train.AdamOptimizer(1e-4).minimize(cost)
# Launch graph
with tf.Session() as sess:
# Initialize TensorFlow variables
sess.run(tf.global_variables_initializer())
for step in range(iterations):
cost_val, _ = sess.run([cost, train], feed_dict={X: x_data, Y: y_data})
print(step, cost_val)
this is my log
(0, nan)
(1, nan)
(2, nan)
(3, nan)
(4, nan)
(5, nan)
(6, nan)
(7, nan)
(8, nan)
(9, nan)
(10, nan)
(11, nan)
(12, nan)
(13, nan)
(14, nan)
(15, nan)
(16, nan)
(17, nan)
(18, nan)
(19, nan)
(20, nan)
and so on
回答1:
When your hypothesis is equal to 1, your second part of the loss becomes Y * log(0), hence the nan output. I suggest you to add a small constant inside the logarithm and it should work. Try this
cost = -tf.reduce_mean(Y*(tf.log(hypothesis+1e-4))+(1-Y)*(tf.log(1-hypothesis+1e-4)))
来源:https://stackoverflow.com/questions/50561959/tensorflow-cost-value-return-nan