tf.sigmoid()在用于更大的值时溢出

时间:2018-03-26 21:26:57

标签: python matlab tensorflow logistic-regression sigmoid

我一直在尝试使用我在Matlab(由Andrew ng在Coursera上的ML课程)中学到的张量流在python中创建一个单变量逻辑回归模型。模型收敛但仅在初始theta0和theta1变量定义较小(约1.00)时,如果初始值设置为100.00,则将收敛值返回为nan。 当学习率增加时也会发生同样的事情。 python代码是

import tensorflow as tf
import numpy as np
import os
import matplotlib.pyplot as plt


os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
epoch = 100000


x_data = (np.random.rand(100)*100).astype(np.float64)
y_data = np.vectorize(lambda y: 0.00 if y < 50.00 else 1.00)(x_data)

theta0 = tf.Variable(1, dtype=tf.float64)
theta1 = tf.Variable(-1, dtype=tf.float64)

hypothesis = theta0 + (theta1 * x_data)
hypothesis = tf.sigmoid(hypothesis)

term1 = -(y_data * tf.log(hypothesis))
term2 = -((1-y_data) * tf.log(1-hypothesis))

loss = tf.reduce_mean(term1 + term2)

optimizer = tf.train.GradientDescentOptimizer(0.006).minimize(loss)
init_var = tf.global_variables_initializer()

train_data = []
with tf.Session() as sess:
    sess.run(init_var)
    for i in range(epoch):
        train_data.append(sess.run([optimizer, theta0, theta1, loss])[1:])
        if i%100==0:
            print("Epoch ", i, ":", sess.run([theta0, theta1, loss]))

对所描述的代码和更正行为的解释,甚至是针对上述目的的更好的代码都将深表赞赏。

1 个答案:

答案 0 :(得分:1)

您应该使用tf.nn.sigmoid_cross_entropy_with_logits而不是使用sigmoid然后执行日志来计算损失。 sigmoid_cross_entropy_with_logits有一些内部逻辑可以帮助防止数字下溢/溢出。