Pytorch进行MNIST分类总结

Pytorch进行分类任务总结

作为Pytorch初学者,利用MNIST数据集作为基本数据集,使用Pytorch进行搭建模型训练,本文档目的在记录Pytorch进行深度学习系统搭建流程,使用时能随时查阅。

1. 数据获取

导入必要的库

import numpy as np
import torch
from torchvision.datasets import mnist # 导入 pytorch 内置的 mnist 数据

from torch import nn
from torch.autograd import Variable
def data_tf(x):
    x = np.array(x, dtype='float32') / 255
    x = (x - 0.5) / 0.5 # 标准化处理
    x = x.reshape((-1,)) # 拉平
    x = torch.from_numpy(x)
    return x

train_set = mnist.MNIST('data/mnist', train=True, transform=data_tf, download=False) # 载入数据集,申明定义的数据变换
test_set = mnist.MNIST('data/mnist', train=False, transform=data_tf, download=False)

可以先将MNIST数据集下载到本地,直接导入数据即可,本文建立的是全连接网络,因此输入图像数据需要实用reshape拉成一个一维向量。

数据量太大时,使用数据迭代器,每次生成一个批次的数据。

from torch.utils.data import DataLoader
# 使用 pytorch 自带的 DataLoader 定义一个数据迭代器
train_data = DataLoader(train_set, batch_size=64, shuffle=True)
test_data = DataLoader(test_set, batch_size=128, shuffle=False)

获取一个批次的数据命令:

data, data_label = next(iter(train_data))

2.模型定义

Pytorch 中支持两种方式构建模型:Sequential和Module

使用Sequential建立模型

# 使用 Sequential 定义 4 层神经网络
net = nn.Sequential(
    nn.Linear(784, 400),
    nn.ReLU(),
    nn.Linear(400, 200),
    nn.ReLU(),
    nn.Linear(200, 100),
    nn.ReLU(),
    nn.Linear(100, 10)
)
#查看网络结构
print(net)

3.损失函数和优化器设置

定义损失函数:

Pytorch中提供了一些常用的损失函数

criterion = nn.CrossEntropyLoss()

定义优化器:

optimizer = torch.optim.SGD(net.parameters(), 1e-1) # 使用随机梯度下降,学习率 0.1

4.模型训练,验证

开始模型训练

# 开始训练
losses = [] #记录训练误差,用于作图分析
acces = []
eval_losses = []
eval_acces = []

for e in range(20):
    train_loss = 0
    train_acc = 0
    net.train()
    for im, label in train_data:
        im = Variable(im)
        label = Variable(label)
        # 前向传播
        out = net(im)
        loss = criterion(out, label)
        # 反向传播
        ## 梯度清零
        optimizer.zero_grad()
        ## 梯度反向传播
        loss.backward()
        ## 参数更新
        optimizer.step()
        # 记录误差
        train_loss += float(loss)
        # 计算分类的准确率
        _, pred = out.max(1)
        num_correct = (pred == label).sum()
        acc = int(num_correct) / im.shape[0]
        train_acc += acc
        
    losses.append(train_loss / len(train_data))
    acces.append(train_acc / len(train_data))
    
    # 在测试集上检验效果
    eval_loss = 0
    eval_acc = 0
    net.eval() # 将模型改为预测模式
    for im, label in test_data:
        im = Variable(im)
        label = Variable(label)
        out = net(im)
        loss = criterion(out, label)
        # 记录误差
        eval_loss += float(loss)
        # 记录准确率
        _, pred = out.max(1)
        num_correct = (pred == label).sum()
        acc = int(num_correct) / im.shape[0]
        eval_acc += acc
        
    eval_losses.append(eval_loss / len(test_data))
    eval_acces.append(eval_acc / len(test_data))
    print('epoch: {}, Train Loss: {:.6f}, Train Acc: {:.6f}, Eval Loss: {:.6f}, Eval Acc: {:.6f}'
          .format(e, train_loss / len(train_data), train_acc / len(train_data), 
                     eval_loss / len(test_data), eval_acc / len(test_data)))

5.acc和loss可视化

上述模型训练完成后,可将保持的loss和accy通过作图直观的显示出来,如下是单独显示,也可以放在一张图上显示;

import matplotlib.pyplot as plt
%matplotlib inline
plt.title('train loss')
plt.plot(np.arange(len(losses)), losses)
plt.plot(np.arange(len(acces)), acces)
plt.title('train acc')

6.保存模型

Pytorch 保存模型提供两种方式:一,将模型和参数都保存在一起,二,只将参数保存下来。

  1. 将模型和参数保存在一起
# 将参数和模型保存在一起
torch.save(net, 'save_net.pth')

​ 加载刚刚保存的模型和参数:

# 读取保存的模型
seq_net1 = torch.load('save_net.pth')
  1. 保存模型参数
# 保存模型参数
torch.save(net.state_dict(), 'save_net_params.pth')

​ 加载模型参数,注意:加载模型参数之前需要重新定义一次模型:

net2.load_state_dict(torch.load('save_net_params.pth')) #net2为新定义的模型

7.模型和参数查看

查看模型的每一层:

#方法一
print(net)
#方法二
for layer in net:
    print(layer)

查看模型的参数:

#查看第1层的weight
net[0].weight
#查看第1层的bias
net[0].bias

8.参考

  1. https://pytorch-cn.readthedocs.io/zh/latest/#pytorch
  2. https://github.com/L1aoXingyu/pytorch-beginner

如有问题,请指正,谢谢!

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
PyTorch是一个开源的机器学习框架,支持Python编程语言。在机器学习领域中,深度学习是一个热门的课题,而PyTorch框架则是实现深度学习的工具之一,被广泛用于图像识别、自然语言处理、语音识别等领域。 MNIST是一个著名的手写数字数据集,一共包含60,000个训练集和10,000个测试集,每个图像的大小都是28x28的灰度图像。分类MNIST数据集深度学习的入门练习之一,而在PyTorch分类MNIST数据集十分便捷。 首先要做的就是导入需要的库,如torch、torchvision等。其次需要对数据进行预处理,包括读取数据、定义数据转换、构建数据加载器等。在PyTorch中,可以使用torchvision.datasets.MNIST函数来读取MNIST数据集,可以使用torchvision.transforms来对数据进行压缩、翻转、裁剪等预处理,最后利用torch.utils.data.DataLoader函数将数据封装成批次。 接着就是定义模型PyTorch模型的定义非常灵活,可以直接继承nn.Module来自己构建网络结构。在分类MNIST数据集中,可以使用卷积神经网络(CNN)来进行训练。CNN是针对图像等二维数据的深度学习方法,可以提取图像的局部特征,并减少模型的参数量,增加模型的泛化能力。 训练模型的核心就是定义损失函数和优化器。PyTorch中常用的损失函数是交叉熵损失,可以使用torch.nn.CrossEntropyLoss进行定义,而优化器则可以选择Adam、SGD等方法。 最后就是模型的训练和测试。训练阶段使用for循环对每个批次的数据进行计算并反向传播,优化模型参数;测试阶段则是利用训练好的模型对新的数据进行预测,并计算模型的准确率。可以使用torch.save函数将训练好的模型保存下来,以便之后的使用。 总之,PyTorchMNIST分类可以通过简单的几步实现。在实际应用中,可以针对不同的数据集和任务,利用PyTorch快速搭建和训练自己的深度学习模型

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值