首页 文章

使用Tensorflow的逻辑回归进行二进制分类

提问于
浏览
0

我只是一个ML课程,我正试图在tensorflow上变得更好 . 为此,我购买了Nishant Shukhla(ML with tensorflow)的书,并试图用不同的数据集运行2特征示例 .

使用书中的假数据集,我的代码运行正常 . 但是,对于我在ML课程中使用的数据,代码拒绝收敛 . 它的学习率非常小,但确实会收敛,但学到的权重是错误的 . 还附加要素数据的图 . 它不应该是特征缩放问题,因为两个特征上的值在30-100个单位之间变化 .

我真的在努力应对不透明的张量流 - 任何帮助都会受到赞赏:

""" Solution for simple logistic regression model
"""
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'

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

# Define paramaters for the model
learning_rate = 0.0001
training_epochs = 300

data = np.loadtxt('ex2data1.txt', delimiter=',')
x1s = np.array(data[:,0]).astype(np.float32)
x2s = np.array(data[:,1]).astype(np.float32)
ys = np.array(data[:,2]).astype(np.float32)

print('Plotting data with + indicating (y = 1) examples and o \n indicating (y = 0) examples.\n')
color = ['red' if l == 0 else 'blue' for l in ys]
myplot = plt.scatter(x1s, x2s, color = color)

# Put some labels
plt.xlabel("Exam 1 score")
plt.ylabel("Exam 2 score")

# Specified in plot order
plt.show()

# Step 2: Create datasets
X1 = tf.placeholder(tf.float32, shape=(None,), name="x1")
X2 = tf.placeholder(tf.float32, shape=(None,), name="x2")
Y = tf.placeholder(tf.float32, shape=(None,), name="y")
w = tf.Variable(np.random.rand(3,1), name='w', dtype='float32',trainable=True)
y_model = tf.sigmoid(w[2]*X2 + w[1]*X1 + w[0])
cost = tf.reduce_mean(-tf.log(y_model*Y + (1-y_model)*(1-Y)))
train_op = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

writer = tf.summary.FileWriter('./graphs/logreg', tf.get_default_graph())
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    prev_error = 0.0;
    for epoch in range(training_epochs):
        error, loss = sess.run([cost, train_op], feed_dict={X1:x1s, X2:x2s, Y:ys})
        print("epoch = ", epoch, "loss = ", loss)
        if abs(prev_error - error) < 0.0001:
            break
        prev_error = error

    w_val = sess.run(w, {X1:x1s, X2:x2s, Y:ys})
    print("w learned = ", w_val)

writer.close()
sess.close()

1 回答

  • 0

    X1和X2的范围均为~20-100 . 但是,一旦我缩放它们,解决方案就会很好地融合 .

相关问题