用Pytorch实现逻辑回归分类

1、代码实现

步骤

  1. 获得数据
  2. 建立逻辑回归模型
  3. 定义损失函数
  4. 计算损失函数
  5. 求解梯度
  6. 梯度更新
  7. 预测测试集
import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt
from torch.autograd import Variable
import torchvision.datasets as dataset
import torchvision.transforms as transforms
from torch.utils.data import DataLoader

input_size = 784  # 输入到逻辑回归模型中的输入大小
num_classes = 10  # 分类的类别个数
num_epochs = 10  # 迭代次数
batch_size = 50  # 批量训练个数
learning_rate = 0.01  # 学习率


# 下载训练数据和测试数据
train_dataset = dataset.MNIST(root='./data', train=True, transform=transforms.ToTensor(), download=True)
test_dataset = dataset.MNIST(root='./data',train=False, transform=transforms.ToTensor)

# 使用DataLoader形成批处理文件
train_loader = DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False)

# 创建逻辑回归类模型  (sigmoid(wx+b))
class LogisticRegression(nn.Module):
    def __init__(self,input_size,num_classes):
        super(LogisticRegression,self).__init__()
        self.linear = nn.Linear(input_size,num_classes)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        out = self.linear(x)
        out = self.sigmoid(out)
        return out

# 设定模型参数
model = LogisticRegression(input_size, num_classes)
# 定义损失函数,分类任务,使用交叉熵
criterion = nn.CrossEntropyLoss()
# 优化算法,随机梯度下降,lr为学习率,获得模型需要更新的参数值
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)


# 使用训练数据训练模型
for epoch in range(num_epochs):
	# 批量数据进行模型训练
    for i, (images, labels) in enumerate(train_loader):
    	# 需要将数据转换为张量Variable
        images = Variable(images.view(-1, 28*28))
        labels = Variable(labels)
		
		# 梯度更新前需要进行梯度清零
        optimizer.zero_grad()

		# 获得模型的训练数据结果
        outputs = model(images)
		
		# 计算损失函数用于计算梯度
        loss = criterion(outputs, labels)

		# 计算梯度
        loss.backward()
	
		# 进行梯度更新
        optimizer.step()

		# 每隔一段时间输出一个训练结果
        if (i+1) % 100 == 0:
            print('Epoch:[%d %d], Step:[%d/%d], Loss: %.4f' % (epoch+1,num_epochs,i+1,len(train_dataset)//batch_size,loss.item()))

# 训练好的模型预测测试数据集
correct = 0
total = 0
for images, labels in test_loader:
    images = Variable(images.view(-1, 28*28))  # 形式为(batch_size,28*28)
    outputs = model(images)
    _,predicts = torch.max(outputs.data,1)  # _输出的是最大概率的值,predicts输出的是最大概率值所在位置,max()函数中的1表示维度,意思是计算某一行的最大值
    total += labels.size(0)
    correct += (predicts==labels).sum()

print('Accuracy of the model on the 10000 test images: %d %%' % (100 * correct / total))

2、踩过的坑

  1. 在代码中下载训练数据和测试数据的时候,两段代码是有区别的:
train_dataset = dataset.MNIST(root='./data', train=True, transform=transforms.ToTensor(), download=True)
test_dataset = dataset.MNIST(root='./data',train=False, transform=transforms.ToTensor)

第一段代码中多了一个download=True,这个的作用是,如果为True,则从Internet下载数据集并将其存放在根目录中。如果数据已经下载,则不会再次下载。

在第二段代码中没有加download=True,加了的话在使用测试数据进行预测的时候会报错。

代码中transform=transforms.ToTensor()的作用是将PIL图像转换为Tensor,同时已经进行归一化处理。

  1. 代码中设置损失函数:
criterion = nn.CrossEntropyLoss()
loss = criterion(outputs, labels)

一开始的时候直接使用:

loss = nn.CrossEntropyLoss()
loss = loss(outputs, labels)

这样也会报错,因此需要将loss改为criterion。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是使用 PyTorch 实现逻辑回归的代码示例: ```python import torch import torch.nn as nn import torch.optim as optim import numpy as np # 定义数据 X = torch.tensor([[1.0, 2.0], [2.0, 3.0], [3.0, 4.0], [4.0, 5.0]]) y = torch.tensor([[0.0], [0.0], [1.0], [1.0]]) # 定义模型 class LogisticRegression(nn.Module): def __init__(self, input_dim, output_dim): super(LogisticRegression, self).__init__() self.linear = nn.Linear(input_dim, output_dim) self.sigmoid = nn.Sigmoid() def forward(self, x): out = self.linear(x) out = self.sigmoid(out) return out model = LogisticRegression(input_dim=2, output_dim=1) # 定义损失函数和优化器 criterion = nn.BCELoss() optimizer = optim.SGD(model.parameters(), lr=0.1) # 训练模型 num_epochs = 1000 for epoch in range(num_epochs): # 前向传播 outputs = model(X) loss = criterion(outputs, y) # 反向传播和优化 optimizer.zero_grad() loss.backward() optimizer.step() # 打印损失值 if (epoch+1) % 100 == 0: print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, loss.item())) # 预测 with torch.no_grad(): predicted = model(X).round() print('Predicted Values:', predicted) ``` 上述代码中: - `X` 和 `y` 分别表示输入和输出数据; - `LogisticRegression` 类定义了模型,其中包含一个线性层和一个 sigmoid 函数,用于计算输出; - `BCELoss` 是二元交叉熵损失函数,用于计算损失值; - `SGD` 是随机梯度下降优化器,用于优化模型; - `num_epochs` 表示训练的次数; - 在训练过程中,首先进行前向传播计算,然后计算损失值,接着进行反向传播和优化; - 在训练结束后,使用训练好的模型进行预测,输出预测结果。 注意:在实际应用中,需要对数据进行预处理和归一化等操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值