# 使用TensorFlow创建逻辑回归模型训练结果为nan

JAVA_朴先生 2021-03-08 10:17

train_X = train_data[:, :-1] train_y = train_data[:, -1:] feature_num = len(train_X[0]) sample_num = len(train_X) print("Size of train_X: {}x{}".format(sample_num, feature_num)) print("Size of train_y: {}x{}".format(len(train_y), len(train_y[0]))) X = tf.placeholder(tf.float32) y = tf.placeholder(tf.float32) W = tf.Variable(tf.zeros([feature_num, 1])) b = tf.Variable([-.3]) db = tf.matmul(X, tf.reshape(W, [-1, 1])) + b hyp = tf.sigmoid(db) cost0 = y * tf.log(hyp) cost1 = (1 - y) * tf.log(1 - hyp) cost = (cost0 + cost1) / -sample_num loss = tf.reduce_sum(cost) optimizer = tf.train.GradientDescentOptimizer(0.1) train = optimizer.minimize(loss) init = tf.global_variables_initializer() sess = tf.Session() sess.run(init) print(0, sess.run(W).flatten(), sess.run(b).flatten()) sess.run(train, {X: train_X, y: train_y}) print(1, sess.run(W).flatten(), sess.run(b).flatten()) sess.run(train, {X: train_X, y: train_y}) print(2, sess.run(W).flatten(), sess.run(b).flatten())

2条回答
• 2021-03-08 10:51

学习率太大了，产生了梯度爆炸。

我的实现用了`5e-4`

讨论(0)
• 2021-03-08 11:02

经过一番搜索，找到了问题所在。

在选取迭代方式的那一句：

``optimizer = tf.train.GradientDescentOptimizer(0.1)``

这里`0.1`的学习率过大，导致不知什么原因在损失函数中出现了`log(0)`的情况，结果导致了损失函数的值为`nan`，解决方法是减小学习率，比如降到`1e-5`或者`1e-6`就可以正常训练了，我根据自己的情况把学习率调整为了1e-3，程序完美运行。

附上最终拟合结果：

讨论(0)