torch02:logistic regression--MNIST识别

MachineLP的Github(欢迎follow):https://github.com/MachineLP

MachineLP的博客目录:小鹏的博客目录

本小节使用torch搭建逻辑回归模型,训练和测试:

(1)定义模型超参数:输入大小、类别数量、迭代次数、批量大小、学习率。

(2)获取训练数据:使用已有的,或者使用自己的数据集:(可参考:https://blog.csdn.net/u014365862/article/details/80506147

(3)定义模型。

(4)定义损失函数。

(5)定义优化算法。

(6)训练->测试->保存模型。

---------------------------------我是可爱的分割线---------------------------------

代码部分:

# coding=utf-8
import torch
import torch.nn as nn
import torchvision
import torchvision.transforms as transforms


# 训练模型的超参数
input_size = 784
num_classes = 10
num_epochs = 5
batch_size = 100
learning_rate = 0.001

# MNIST 数据集 (样本,标签)
train_dataset = torchvision.datasets.MNIST(root='./data', 
                                           train=True, 
                                           transform=transforms.ToTensor(),
                                           download=True)

test_dataset = torchvision.datasets.MNIST(root='./data', 
                                          train=False, 
                                          transform=transforms.ToTensor())

# 构建数据管道, 使用自己的数据集请参考:https://blog.csdn.net/u014365862/article/details/80506147
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)

# 搭建逻辑回归模型, 主要体现在后边的loss上,使用交叉熵
model = nn.Linear(input_size, num_classes)

# 损失函数和优化算法
# nn.CrossEntropyLoss() computes softmax internally
criterion = nn.CrossEntropyLoss()  
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)  

# train_loader的大小,也就是含有多少个bach。
total_step = len(train_loader)
# 训练模型
# 在整个数据集上迭代的次数
for epoch in range(num_epochs):
    # 每次取一个bach进行训练。
    for i, (images, labels) in enumerate(train_loader):
        # 将数据reshape到模型需要的大小。
        images = images.reshape(-1, 28*28)
        
        # 前向传播
        outputs = model(images)
        # 计算模型的loss
        loss = criterion(outputs, labels)
        
        # 后向传播,更新模型参数
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        # 每100个batch,打印一次结果
        if (i+1) % 100 == 0:
            print ('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}' 
                   .format(epoch+1, num_epochs, i+1, total_step, loss.item()))

# 模型测试
# 在测试阶段,不用计算梯度
with torch.no_grad():
    correct = 0
    total = 0
    for images, labels in test_loader:
        images = images.reshape(-1, 28*28)
        outputs = model(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum()

    print('Accuracy of the model on the 10000 test images: {} %'.format(100 * correct / total))

# 保存模型
torch.save(model.state_dict(), 'model.ckpt')

总结:

torch搭建模型训练的流程和TF基本一致,相比来说torch更简洁一些,TF稍微繁琐一些,单这不影响你是TF的铁粉。

如何你想训练其他模型,只需要把上面模型部分替换掉就可以了,这是一个简单的实现,里边有很多功能没加,想更快的提升自己的能力,可以考虑自己基于torch搭建一个通用训练框架。


torch系列:

1. torch01:torch基础



使用MNIST数据集中的0,1数据完成logistic regression 任务 导入相关包 In [1]: import torch import torchvision as tv import torchvision.transforms as transforms import torch.nn as nn In [2]: # 定义是否使用GPU device = torch.device("cuda" if torch.cuda.is_available() else "cpu") # 定义数据预处理方式 transform = transforms.ToTensor() 利用框架自带数据集读取方式读取 MNIST数据集 In [3]: # download 第一次可设置为Ture trainset = tv.datasets.MNIST( root='./data/', train=True, download=True, transform=transform) 从训练集中取出0、1标签的数据构成此次任务的训练集(train_input,train_label) In [4]: train_input = [] train_label = [] for data, label in trainset: if label == 0 or label == 1: train_input.append(data) train_label.append(label) 创建自己的训练数据集,需要补充完成 In [5]: class TensorDataset(torch.utils.data.Dataset): """ 创建自己的dataset类 继承torch.utils.data.Dataset。 Dataset wrapping data and target tensors. Each sample will be retrieved by indexing both tensors along the first dimension. Arguments: data_tensor (Tensor): contains sample data. target_tensor (Tensor): contains sample targets (labels). """ ​ def __init__(self, data_tensor, target_tensor): self.data_tensor = data_tensor self.target_tensor = target_tensor # 这个方法是必须要有的,用于按照索引读取每个元素的具体内容 def __getitem__(self, index): return self.data_tensor[index], self.target_tensor[index] # #return很关键,return回哪些内容,那么我们在训练时循环读取每个batch时, # 就能获得哪些内容 ##这个函数也必须要写,它返回的是数据集的长度 def __len__(self): return self.data_tensor.size(0) 定义训练批处理数据 In [ ]: # batch_size 根据自己计算资源设计,shuffle设置为True,查询设置的原因。 trainloader = torch.utils.data.DataLoader( TensorDataset(train_input, train_label), batch_size = 128, shuffle = True, ) 利用pytorch框架的nn.Module 模块完成logistic regression class logistic_regression(nn.Module): ''' 逻辑回归模型 ''' def __init__(self): super(logistic_regression, self).__init__() " 添加logistic regression层 " def forward(self,
最新发布
03-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MachineLP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值