首页 > 解决方案 > TensorFlow 成本值返回 NAN

问题描述

我正在使用 Tensorflow 制作一个简单的逻辑回归模型。但是成本值总是返回 nan。

我的数据集分为x_data和y_data。x_data 是图像中的坐标,y_data 是 1 或 0,因为我的图像是黑白的。我试图找到白色和黑色之间的分界线。

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)

这是我的日志 (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)

等等

标签: pythontensorflownan

解决方案


当您的假设等于 1 时,您的损失的第二部分变为 Y * log(0),因此是 nan 输出。我建议您在对数内添加一个小常数,它应该可以工作。尝试这个

cost = -tf.reduce_mean(Y*(tf.log(hypothesis+1e-4))+(1-Y)*(tf.log(1-hypothesis+1e-4)))

推荐阅读