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

发布于 2022-09-05 02:50:41 字数 1577 浏览 22 评论 0

在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])) + 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())

运行结果截图如下:

运行结果

可以看到,在迭代两次之后,得到的Wb都变成了nan,请问是哪里的问题?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

时光磨忆 2022-09-12 02:50:41

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

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

optimizer = tf.train.GradientDescentOptimizer(0.1)

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

附上最终拟合结果:

拟合结果

少女净妖师 2022-09-12 02:50:41

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

我的实现用了5e-4

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文