Softmax 回归简介
Softmax 回归,也称为多类逻辑回归,是一种适用于多分类问题的模型。它在输出层使用了 Softmax 函数,将输入的原始分数转化为表示各个类别概率的概率分布。具体来说,给定一个样本的特征向量,Softmax 回归将为每个类别分配一个概率,最终将概率最大的类别作为预测结果。
Softmax 函数
Softmax 函数用于将原始分数转化为概率分布。对于一个具有 K 个类别的多分类问题,给定输入向量 z = ( z 1 , z 2 , . . . , z K ) z = (z_1, z_2, ..., z_K) z=(z1,z2,...,zK),Softmax 函数的公式如下:
P ( y i = k ∣ z ) = e z k ∑ j = 1 K e z j P(y_i = k | z) = \frac{e^{z_k}}{\sum_{j=1}^{K} e^{z_j}} P(yi=k∣z)=∑j=1Kezjezk
其中, P ( y i = k ∣ z ) P(y_i = k | z) P(yi=k∣z) 表示输入属于类别 k 的概率, z k z_k zk 是输入对应类别 k 的原始分数。
Softmax 回归的实现步骤
- 导入必要的库:
import tensorflow as tf
-
准备数据:加载训练数据和标签,进行数据预处理。
-
定义模型:创建模型的权重和偏差,定义 Softmax 函数的计算。
num_features = ... # 特征数量
num_classes = ... # 类别数量
# 定义权重和偏差
W = tf.Variable(tf.random.normal(shape=(num_features, num_classes)))
b = tf.Variable(tf.zeros(shape=(num_classes,)))
# 定义 Softmax 函数
def softmax(logits):
return tf.nn.softmax(logits)
- 定义损失函数:使用交叉熵损失函数衡量预测值与真实标签之间的差异。
def cross_entropy_loss(y_true, y_pred):
return tf.reduce_mean(-tf.reduce_sum(y_true * tf.math.log(y_pred), axis=1))
- 选择优化器:选择合适的优化器来最小化损失函数。
optimizer = tf.optimizers.SGD(learning_rate=0.01)
- 训练模型:使用训练数据进行模型训练。
def train_step(inputs, labels):
with tf.GradientTape() as tape:
logits = tf.matmul(inputs, W) + b
predictions = softmax(logits)
loss = cross_entropy_loss(labels, predictions)
gradients = tape.gradient(loss, [W, b])
optimizer.apply_gradients(zip(gradients, [W, b]))
return loss
# 在训练数据上进行多个训练周期
for epoch in range(num_epochs):
for batch_inputs, batch_labels in train_dataset:
loss = train_step(batch_inputs, batch_labels)
- 评估模型:使用测试数据评估模型性能。
示例代码
import tensorflow as tf
# 准备数据
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
# 定义模型
model = tf.keras.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(10, activation='softmax')
])
# 编译模型
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 设置 TensorBoard 回调
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir="logs")
# 训练模型
model.fit(x_train, y_train, epochs=5,
validation_data=(x_test, y_test),
callbacks=[tensorboard_callback])
# python -m tensorboard.main --logdir=./