逻辑回归适用于对一件事情分类,比如分类新闻类型等等
具体的代码如下,注释已经写的很详细,这里的代码是对图像一个像素一个像素地判断它是一个什么类型图像,如果你不是这种类型,那么主要模型LogisticRegression 也是不变的,输入数据修改一下即可
MNIST 数据集包含手写的数字(从0到9),也就是说这里代码判断图片是0-9
import torch # 导入 PyTorch 库,提供了多种深度学习的模块和类
import torch.nn as nn # 导入 PyTorch 的神经网络模块
import torchvision.datasets as dsets # 导入 torchvision 库的数据集模块
import torchvision.transforms as transforms # 导入 torchvision 库的转换模块
from torch.autograd import Variable # 导入 PyTorch 的自动梯度模块
input_size = 784 # 图像大小为 28x28,所以输入大小为 784
num_classes = 10 # 分类任务类别数量,因为 MNIST 是数字 0-9,所以类别数为 10
num_epochs = 10 # 训练轮数
batch_size = 50 # 批训练的数据个数
learning_rate = 0.001 # 学习率
# 加载 MNIST 数据集,root 为数据集的存储位置,transform 定义了数据预处理的方式,download 判断如果数据集不存在是否需要下载
train_dataset = dsets.MNIST(root='./data', train=True, transform=transforms.ToTensor(), download=True)
test_dataset = dsets.MNIST(root='./data', train=False, transform=transforms.ToTensor())
# 使用 DataLoader 封装数据集,方便批量处理和打乱数据
train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False)
# 定义逻辑回归模型
class LogisticRegression(nn.Module):
def __init__(self, input_size, num_classes):
super(LogisticRegression, self).__init__() # 调用 nn.Module 的初始化函数
self.linear = nn.Linear(input_size, num_classes) # 定义线性层,即全连接层
def forward(self, x): # 定义前向传播函数
out = self.linear(x) # 通过线性层得到输出
return out
model = LogisticRegression(input_size, num_classes) # 实例化模型
criterion = nn.CrossEntropyLoss() # 定义交叉熵损失函数,适合分类任务
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate) # 定义优化器,这里使用 SGD
# 训练模型
for epoch in range(num_epochs):
for i, (images, labels) in enumerate(train_loader):
images = Variable(images.view(-1, 28*28)) # 调整图片的形状以匹配模型的输入形状
labels = Variable(labels) # 将标签转化为 Variable
optimizer.zero_grad() # 清除之前计算的梯度
outputs = model(images) # 前向传播得到输出
loss_value = criterion(outputs, labels) # 根据预测的输出和真实标签计算损失
loss_value.backward() # 反向传播,计算梯度
optimizer.step() # 更新模型参数
if (i+1) % 100 == 0: # 每训练 100 批数据打印一次训练进度
print ('Epoch: [%d/%d], Step: [%d/%d], Loss: %.4f' % (epoch+1, num_epochs, i+1, len(train_dataset)//batch_size, loss_value.item()))
# 测试模型
correct = 0
total = 0
for images, labels in test_loader:
images = Variable(images.view(-1, 28*28)) # 调整图片的形状以匹配模型的输入形状
outputs = model(images) # 通过模型得到预测输出
_, predicted = torch.max(outputs.data, 1) # 根据模型的输出得到预测的类别
total += labels.size(0) # 计算总的样本数
correct += (predicted == labels).sum().item() # 计算预测正确的样本数
print('Accuracy of the model on the 10000 test images: %d %%' % (100 * correct / total)) # 打印模型在测试集上的准确率