TensorFlow-Course项目教程:使用TensorFlow实现逻辑回归
引言:从线性回归到逻辑回归
在机器学习领域,线性回归和逻辑回归是最基础也是最重要的两种算法。线性回归用于预测连续值输出,而逻辑回归则专门用于解决二分类问题。本教程将详细介绍如何使用TensorFlow实现逻辑回归模型,并以MNIST数据集中的数字0和1分类为例进行实践。
数据集准备:MNIST子集
我们使用的数据集是著名的MNIST手写数字数据集,但只选取其中的数字0和1两类样本:
- 原始MNIST包含55000个训练样本和10000个测试样本
- 每个样本是28×28像素的灰度图像
- 我们将图像展平为784维的特征向量
- 通过筛选只保留标签为0和1的样本
这种二分类问题的设置使得我们可以专注于逻辑回归的核心概念,而不必一开始就处理复杂的多分类问题。
逻辑回归理论基础
从线性到非线性
线性回归使用线性函数$y=W^{T}x$进行预测,而逻辑回归需要预测的是二元标签$y\in{0,1}$。为了实现这一目标,我们引入了Sigmoid函数:
$$ P(y=1|x)=h_{W}(x)=\frac{1}{1+exp(-W^{T}x)}=Sigmoid(W^{T}x) $$
Sigmoid函数将线性预测结果映射到(0,1)区间,可以解释为样本属于正类的概率。
损失函数设计
逻辑回归使用交叉熵作为损失函数:
$$ Loss(W) = \sum_{i}{y^{(i)}log\frac{1}{h_{W}(x^{i})}+(1-y^{(i)})log\frac{1}{1-h_{W}(x^{i})}} $$
这个损失函数的特点是:
- 当y=1时,只有第一项起作用,鼓励预测概率接近1
- 当y=0时,只有第二项起作用,鼓励预测概率接近0
- 整体上,它惩罚预测概率与真实标签的偏差
TensorFlow实现详解
数据预处理
首先我们需要从MNIST数据集中提取0和1两类样本:
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", reshape=True, one_hot=False)
# 数据整理
data = {}
data['train/image'] = mnist.train.images
data['train/label'] = mnist.train.labels
# 筛选0和1的训练样本
index_list_train = []
for sample_index in range(data['train/label'].shape[0]):
label = data['train/label'][sample_index]
if label == 1 or label == 0:
index_list_train.append(sample_index)
# 重构训练数据结构
data['train/image'] = mnist.train.images[index_list_train]
data['train/label'] = mnist.train.labels[index_list_train]
同样的处理也应用于测试集,确保训练和评估使用相同分布的数据。
模型构建
逻辑回归在TensorFlow中可以简单地实现为一个全连接层加Softmax:
import tensorflow as tf
# 定义占位符
image_place = tf.placeholder(tf.float32, shape=([None, num_features]), name='image')
label_place = tf.placeholder(tf.int32, shape=([None,]), name='gt')
label_one_hot = tf.one_hot(label_place, depth=2, axis=-1)
# 模型结构 - 相当于逻辑回归
logits = tf.contrib.layers.fully_connected(
inputs=image_place,
num_outputs=2, # 二分类输出
scope='fc'
)
# 定义损失函数
with tf.name_scope('loss'):
loss = tf.reduce_mean(
tf.nn.softmax_cross_entropy_with_logits(
logits=logits,
labels=label_one_hot
)
)
# 定义准确率计算
with tf.name_scope('accuracy'):
correct_pred = tf.equal(
tf.argmax(logits, 1),
tf.argmax(label_one_hot, 1)
)
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))
这里有几个关键点需要注意:
- 使用全连接层作为逻辑回归的实现
- 输出维度设为2,虽然理论上二分类可以只输出1个值,但实践中常用两个输出
- 使用softmax_cross_entropy_with_logits计算损失,它内部已经包含了softmax操作
训练过程
训练过程采用标准的mini-batch梯度下降:
- 从训练集中随机抽取一个小批量样本
- 计算当前参数下的损失和梯度
- 使用优化器更新参数
- 定期在验证集上评估模型性能
扩展思考
虽然本教程专注于二分类问题,但逻辑回归的思想可以自然地扩展到多分类场景:
- 输出层神经元数量等于类别数
- 仍然使用softmax激活函数
- 交叉熵损失函数形式保持不变
这种扩展实际上就是多类逻辑回归,也称为softmax回归,它是许多复杂分类模型的基础构建块。
总结
通过本教程,我们系统地学习了:
- 逻辑回归的基本原理和数学表达
- 如何在TensorFlow中实现逻辑回归模型
- 针对MNIST数据集进行二分类任务的具体实践
逻辑回归虽然简单,但它包含了机器学习中许多核心概念:概率建模、损失函数、梯度下降等。理解这些基础概念对于后续学习更复杂的深度学习模型至关重要。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考