每日信息:Pytorch实现逻辑回归分类
本文实例为大家分享了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,同时已经进行归一化处理。
2.代码中设置损失函数:
criterion = nn.CrossEntropyLoss() loss = criterion(outputs, labels)
一开始的时候直接使用:
loss = nn.CrossEntropyLoss() loss = loss(outputs, labels)
这样也会报错,因此需要将loss改为criterion。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
X 关闭
X 关闭
- 1转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 2充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 3好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 4名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?
- 5亚马逊云科技成立量子网络中心致力解决量子计算领域的挑战
- 6京东绿色建材线上平台上线 新增用户70%来自下沉市场
- 7网红淘品牌“七格格”chuu在北京又开一家店 潮人新宠chuu能红多久
- 8市场竞争加剧,有车企因经营不善出现破产、退网、退市
- 9北京市市场监管局为企业纾困减负保护经济韧性
- 10市场监管总局发布限制商品过度包装标准和第1号修改单