【问题标题】:tensorflow simple logistic regression张量流简单逻辑回归
【发布时间】:2017-09-11 14:15:23
【问题描述】:

你好

我只是想尝试使用简单逻辑回归进行二元分类。我有未标记的输出数据为 {1,0} //(他/她是否通过了考试) 成本函数返回 (NaN)。出了什么问题?

learning_rate = 0.05
total_iterator = 1500
display_per = 100

data = numpy.loadtxt("ex2data1.txt",dtype=numpy.float32,delimiter=",");

training_X = numpy.asarray(data[:,[0,1]]) # 100 x 2

training_X 包含 100 x 2 矩阵作为考试分数。例如 [98.771 4.817]

training_Y = numpy.asarray(data[:,[2]],dtype=numpy.int) # 100 x 1 

training_Y 包含 100x1 数组,[1] [0] [0] [1] 由于stackoverflow格式,我无法逐行写入

m = data.shape[0]

x_i = tf.placeholder(tf.float32,[None,2]) # None x 2                        
y_i = tf.placeholder(tf.float32,[None,1]) # None x 1                       

W = tf.Variable(tf.zeros([2,1]))  # 2 x 1 
b = tf.Variable(tf.zeros([1]))  # 1 x 1 

h = tf.nn.softmax(tf.matmul(x_i,W)+b)

cost = tf.reduce_sum(tf.add(tf.multiply(y_i,tf.log(h)),tf.multiply(1-
y_i,tf.log(1-h)))) / -m

我尝试使用简单的逻辑成本函数。它返回“NaN”。我认为我的成本函数完全是垃圾,使用了 tensorflow 示例的成本函数:

 cost = tf.reduce_mean(-tf.reduce_sum(y_i*tf.log(h), reduction_indices=1))

但效果不佳。

initializer= tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)

    print("cost: ", sess.run(cost, feed_dict={x_i:training_X, 
    y_i:training_Y}), "w: ", sess.run(W),"b: ", sess.run(b))

【问题讨论】:

  • 请问“我有未标记的输出数据为 {1,0}”是什么意思?
  • 它没有热解码。只是一个二进制文件。

标签: python numpy machine-learning tensorflow logistic-regression


【解决方案1】:

函数 tf.nn.softmax 期望 logits 的数量(最后一个维度)等于类的数量(在您的情况下为 2 {1,0})。由于您的案例中的最后一个维度是 1,因此 softmax 将始终返回 1(属于唯一可用类的概率始终为 1,因为不存在其他类)。因此h 是一个用 1 填充的张量,tf.log(1-h) 将返回负无穷大。无穷大乘以零(在某些行中为1-y_i)返回 NaN。

您应该将tf.nn.softmax 替换为tf.nn.sigmoid

一个可能的解决办法是:

h = tf.nn.sigmoid(tf.matmul(x_i,W)+b)
cost = tf.reduce_sum(tf.add(tf.multiply(y_i,tf.log(h)),tf.multiply(1-
y_i,tf.log(1-h)))) / -m

或者更好,你可以使用tf.sigmoid_cross_entropy_with_logits
在这种情况下,应按如下方式进行:

h = tf.matmul(x_i,W)+b
cost = tf.reduce_mean(tf.sigmoid_cross_entropy_with_logits(labels=y_i, logits=h))

此函数在数值上比使用tf.nn.sigmoid 后跟cross_entropy 函数更稳定,如果tf.nn.sigmoid 由于float32 的不精确性而接近0 或1,该函数可以返回NaN。

【讨论】:

  • 谢谢!!你已经解决了。希望这个答案对遇到同样问题的人有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-10
  • 2017-12-22
  • 2018-10-27
  • 2017-10-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
相关资源
最近更新 更多