用TensorFlow进行逻辑回归(一)

这一节我们用TensorFlow定义简单的分类器。首先考虑分类器的方程式是什么是值得的。数学习的技巧是使用sigmoid函数。sigmoid函数绘制如图3-40, 通常标记为σ, 是实数域里的函数取值(0, 1)。这个特征很便利,因为我们可以将sigmoid的输出解释为事件发现的概率。 (转换离散事件到连续值是机器学习里反复出现的主题)

图3-40. 绘制sigmoid 函数.

预测离散事件的概率的方程式如下。这些方程式定义了简单的逻辑回归模型:

y 0 = σ( wx + b

y 1 = 1 − σ (wx + b

TensorFlow提供了工具函数来计算sigmoidal值的交叉熵损失。最简单的函数是tf.nn.sigmoid_cross_entropy_with_logits. ( logit是sigmoid的逆。实际上,这意味着传递参数到 sigmoid, wx + b , 而不是sigmoidal value σ wx + b 本身 )。我们推荐使用 TensorFlow的实现而不是手工定义交叉熵,因为计算交叉熵损失有许多复杂的数值问题。

#List3-44

import numpy as np

np.random.seed(456)

import tensorflow as tf

#tf.set_random_seed(456)

import matplotlib.pyplot as plt

from sklearn.metrics import accuracy_score

from scipy.special import logit

Generate synthetic data

N = 100

Zeros form a Gaussian centered at (-1, -1)

x_zeros = np.random.multivariate_normal(mean=np.array((-1, -1)), cov=.1*np.eye(2), size=(N//2,))

y_zeros = np.zeros((N//2,))

Ones form a Gaussian centered at (1, 1)

x_ones = np.random.multivariate_normal(mean=np.array((1, 1)), cov=.1*np.eye(2), size=(N//2,))

y_ones = np.ones((N//2,))

x_np = np.vstack([x_zeros, x_ones])

y_np = np.concatenate([y_zeros, y_ones])

Save image of the data distribution

plt.xlabel(r"x_1")

plt.ylabel(r"x_2")

plt.title("Toy Logistic Regression Data")

Plot Zeros

plt.scatter(x_zeros[:, 0], x_zeros[:, 1], color="blue")

plt.scatter(x_ones[:, 0], x_ones[:, 1], color="red")

plt.savefig("logistic_data.png")

x_np,y_np

模型的训练代码见List3-45 ,与线性回归模型的代码相同。

#List3-45

W = tf.Variable(tf.random.normal((2, 1)))

b = tf.Variable(tf.random.normal((1,)))

W,b

x=tf.cast(x_np,tf.float32)

y=tf.cast(y_np,tf.float32)

learning_r=0.01

optimizer = tf.optimizers.SGD(learning_r)

n_steps = 100

Train model

for i in range(n_steps):

with tf.GradientTape() as tape:

#_, summary, loss = sess.run([train_op, merged, l], feed_dict=feed_dict)

y_logit = tf.squeeze(tf.matmul(x, W) + b)

the sigmoid gives the class probability of 1

y_one_prob = tf.sigmoid(y_logit)

Rounding P(y=1) will give the correct prediction.

y_pred = tf.round(y_one_prob)

entropy = tf.nn.sigmoid_cross_entropy_with_logits(logits=y_logit, labels=y)

Sum all contributions

l = tf.reduce_sum(entropy)

gradients=tape.gradient(l,[W,b])

optimizer.apply_gradients(zip(gradients, [W, b]))

#W=W-tf.Variable(learning_r,tf.float32)*W

#b=b-tf.Variable(learning_r,tf.float32)*b

print("loss: %f" % l)

#train_writer.add_summary(summary, i)

Get weights

w_final=W

b_final=b

Make Predictions

#y_pred_np = sess.run(y_pred, feed_dict={x: x_np})

#score = accuracy_score(y_np, y_pred_np)

#print("Classification Accuracy: %f" % score)

plt.clf()

Save image of the data distribution

plt.xlabel(r"x_1")

plt.ylabel(r"x_2")

plt.title("Learned Model (Classification Accuracy: 1.00)")

plt.xlim(-2, 2)

plt.ylim(-2, 2)

Plot Zeros

plt.scatter(x_zeros[:, 0], x_zeros[:, 1], color="blue")

plt.scatter(x_ones[:, 0], x_ones[:, 1], color="red")

x_left = -2

y_left = (1./w_final[1]) * (-b_final + logit(.5) - w_final[0]*x_left)

x_right = 2

y_right = (1./w_final[1]) * (-b_final + logit(.5) - w_final[0]*x_right)

plt.plot([x_left, x_right], [y_left, y_right], color='k')

plt.savefig("logistic_pred.png")

图3-41

相关推荐
AIminminHu1 天前
实战项目(十二:《AI画质增强与LED驱动控制:一场关于‘创造’与‘还原’的对话》):从LED冬奥会、奥运会及春晚等大屏,到手机小屏,快来挖一挖里面都有什么
人工智能·智能手机
skywalk81631 天前
在Windows10 Edge浏览器里安装DeepSider大模型插件来免费使用gpt-4o、NanoBanana等AI大模型
人工智能
汽车仪器仪表相关领域1 天前
工业安全新利器:NHQT-4四合一检测线系统深度解析
网络·数据库·人工智能·安全·汽车·检测站·汽车检测
有Li1 天前
基于神经控制微分方程的采集无关深度学习用于定量MRI参数估计|文献速递-文献分享
论文阅读·人工智能·文献·医学生
taxunjishu1 天前
DeviceNet 转 Profinet:西门子 S7 - 1500 PLC 与欧姆龙伺服电机在汽车焊装生产线夹具快速切换定位的通讯配置案例
人工智能·区块链·工业物联网·工业自动化·profinet·devicenet·总线协议转换网关
脑极体1 天前
华为,让金融智能体月映千江
人工智能·华为·金融
万俟淋曦1 天前
【ROS2】通讯机制 Topic 常用命令行
人工智能·ai·机器人·ros·topic·ros2·具身智能
武汉唯众智创1 天前
基于边缘计算的智能家居综合实训室设计方案
人工智能·智能家居·边缘计算·智能家居实训室·智能家居综合实训室·智能家居实验室·智能家居综合实验室
倔强青铜三1 天前
苦练Python第52天:一口气吃透Python的“七脉神剑”:生命周期+字符串魔术方法全解析
人工智能·python·面试
RIDDLE!1 天前
Python-OpenCV图像边缘检测算法全解析
人工智能·opencv·计算机视觉