前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >torch02:logistic regression--MNIST识别

torch02:logistic regression--MNIST识别

作者头像
MachineLP
发布2022-05-09 15:05:16
2040
发布2022-05-09 15:05:16
举报
文章被收录于专栏:小鹏的专栏

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

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

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

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

(2)获取训练数据:使用已有的,或者使用自己的数据集:(可参考:https://cloud.tencent.com/developer/article/1997099

(3)定义模型。

(4)定义损失函数。

(5)定义优化算法。

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

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

代码部分:

代码语言:javascript
复制
# 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基础

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-05-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档