python - 使用TensorFlow创建逻辑回归模型训练结果为nan
问题描述
在TensorFlow中,我想创建一个逻辑回归模型,代价函数如下:
使用的数据集截图如下:

我的代码如下:
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])) + bhyp = tf.sigmoid(db)cost0 = y * tf.log(hyp)cost1 = (1 - y) * tf.log(1 - hyp)cost = (cost0 + cost1) / -sample_numloss = 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())
运行结果截图如下:

可以看到,在迭代两次之后,得到的W和b都变成了nan,请问是哪里的问题?
问题解答
回答1:经过一番搜索,找到了问题所在。
在选取迭代方式的那一句:
optimizer = tf.train.GradientDescentOptimizer(0.1)
这里0.1的学习率过大,导致不知什么原因在损失函数中出现了log(0)的情况,结果导致了损失函数的值为nan,解决方法是减小学习率,比如降到1e-5或者1e-6就可以正常训练了,我根据自己的情况把学习率调整为了1e-3,程序完美运行。
附上最终拟合结果:

相关文章:
1. android - Manifest.xml自己生成的GMS服务怎么删掉呢?2. java - git项目迁移到SVN怎么实现的?哪位大神指点指点3. css - 手机app中rem的基准值计算错误4. 站点内容复制额外增加的版权申明,真的很反人类。试问产品自己在用这个站点吗?5. 请问永久和临时重定向有什么区别6. 提示内部服务错误什么问题7. 关于thinkphp 5.1中,ajax提交数据url的格式写法,加花括号就出错,请老师指点8. 老师 我是一个没有学过php语言的准毕业生 我希望您能帮我一下9. 为什么要通过常量的方式拐弯抹角的写呢,直接写DSN之类的不好吗10. 绘制图表的问题

网公网安备