softmax利用人工标注
时间: 2025-01-02 12:26:06 浏览: 3
### 使用Softmax函数处理人工标注数据
在机器学习中,尤其是分类任务里,Softmax函数用于将模型输出的原始分数(logits)转换成概率分布。对于具有多个类别的人工标注数据集而言,Softmax可以有效地帮助构建一个多类别的分类器。
假设有一个神经网络作为分类模型,在最后一层之前会产生针对各个可能类别的得分向量$\mathbf{z}$。此时应用Softmax变换可得:
$$\sigma(\mathbf{z})_i = \frac{\exp(z_i)}{\sum_{j=1}^{n}\exp(z_j)}, i = 1,\cdots,n $$
这里$n$表示总共有多少个不同的标签种类[^1]。
当面对带有真实标签的数据样本$(\mathbf{x}, y)$时——其中$\mathbf{x}$代表特征输入而$y∈\{0,...,C−1\}$对应于实际所属类别编号——可以通过交叉熵损失衡量预测结果与事实之间的差异程度:
$$L=-\sum _{{c=1}}^{C}{t_c}\ln(p_c)$$
此处${p_c}=σ({z_c})$, ${t_c}$是一个one-hot编码形式的目标变量;即仅当$c=y$时取值为1其余均为零。
下面给出一段Python代码片段展示如何利用PyTorch框架实现上述逻辑并训练一个简单的全连接前馈网络来进行多类别分类任务:
```python
import torch
from torch import nn, optim
class SimpleClassifier(nn.Module):
def __init__(self, input_dim, hidden_dim, output_dim):
super(SimpleClassifier, self).__init__()
self.fc1 = nn.Linear(input_dim, hidden_dim)
self.relu = nn.ReLU()
self.fc2 = nn.Linear(hidden_dim, output_dim)
def forward(self, x):
out = self.fc1(x)
out = self.relu(out)
logits = self.fc2(out) # 输出未经过激活函数的结果
return logits
def train(model, data_loader, criterion, optimizer, device='cpu'):
model.train()
for inputs, targets in data_loader:
inputs, targets = inputs.to(device), targets.to(device)
outputs = model(inputs)
loss = criterion(outputs, targets)
optimizer.zero_grad()
loss.backward()
optimizer.step()
input_size = 784 # 假定MNIST手写数字图片展平后的大小
hidden_size = 500
num_classes = 10 # MNIST共十个类别
learning_rate = 0.001
model = SimpleClassifier(input_size, hidden_size, num_classes).to('cuda')
criterion = nn.CrossEntropyLoss() # 内置了softmax操作以及负对数似然计算
optimizer = optim.Adam(model.parameters(), lr=learning_rate)
# 这里的data_loader应该由用户自己准备,它应当返回批次化的输入张量和对应的整型标签
train(model=model,
data_loader=data_loader,
criterion=criterion,
optimizer=optimizer,
device='cuda')
```
此段程序定义了一个简易版的两层感知机,并采用Adam优化算法最小化基于交叉熵的成本函数。值得注意的是`nn.CrossEntropyLoss()`已经包含了Softmax运算及其后续所需的负对数似然估计步骤。
阅读全文