2016-11-10 125 views
0

我想学习tensorflow,目前正试图做一个简单的逻辑回归模型。这里是我从我能找到的不同例子拼接在一起的代码。逻辑回归调试tensorflow

with tf.Session() as sess: 
    # Training data 
    input = tf.constant(tra) 
    target = tf.constant(np.transpose(data[:,1]).astype(np.float64)) 

    # Set model weights 
    W = tf.Variable(np.random.randn(10, 1).astype(np.float64)) 

    # Construct model 
    mat=tf.matmul(input,W) 
    pred = tf.sigmoid(mat) 

    # Compute the error 
    yerror = tf.sub(pred, target) 
    # We are going to minimize the L2 loss. The L2 loss is the sum of the 
    # squared error for all our estimates of y. This penalizes large errors 
    # a lot, but small errors only a little. 
    loss = tf.nn.l2_loss(yerror) 

    # Gradient Descent 
    update_weights = tf.train.GradientDescentOptimizer(0.05).minimize(loss) 

    # Initializing the variables 
    tf.initialize_all_variables().run() 

    for _ in range(50): 
     # Repeatedly run the operations, updating the TensorFlow variable. 
     sess.run(update_weights) 

     print(loss.eval()) 

因此,代码运行,但错误的每个“sess.run(update_weights)” itteration后剂量没有改善,我曾与不同势步长尝试。

我不知道该设置是否相关吗?

我有点不确定如何调试它,因为一切的计算都在运行命令完成。训练数据很好。如果你们中的一些人能够看到我在这整个会议中做错了什么,或者就如何调试这个问题提出建议。

非常感谢。

回答

0

好吧,我做了一些测试,发现它有'目标'变量的尺寸问题。我不得不specifi它是AMX 1点矩阵(其中,m是教育训练实例的数目)这与指定的形状的常数变量进行:

target = tf.constant(np.transpose(data[:,1]).astype(np.float64), shape=[m,1]) 

也是gradiant体面没有这样做好直到我规范化功能。

0

虽然你正在做的是一个合理的事情做回归,这可能不会很好地在分类任务。此外,这不是典型的逻辑回归。对于逻辑回归,您可以将所有数据样本的总和最大化为log prob(correct label|input)。这是通过使用softmax层来实现的。

有一些有用的数学属性,它有助于调试。例如,如果你输入的是完全随机的,那么损失应该是log (N)。如果您将所有权重设置为零,那应该是损失。如果您标记样本,例如1/3正数和2/3在二元分类中为负数,那么不考虑任何输入的模型(只是一个偏差项)应该只返回log(2/3),因此您可以调试您正在获取的某些数据程度。

+0

谢谢评论一些问题: 我可以把任何随机数还是应随机高斯均值为0,STD 1?并且是日志中的N(N)我拥有的功能数量还是训练示例数量? –

+0

如果权重都为零,权重是多少并不重要,但是否则是,您可以输入与输出无关的任何内容。 “N”是指类的数量。 – drpng