码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • mnist手写数字识别,dnn实现代码解读


    mnist手写数字识别,dnn实现代码解读

    • 代码及注释?
    • 模型结构
    • 相关问题
      • net.train() 和 net.eval()的作用?
      • 为什么是output.max(1)
      • optim.zero_grad()、pred=model(input)、loss=criterion(pred,tgt)、loss.backward()、optim.step()的作用

    代码及注释?

    # coding: utf-8
    
    '''
    通过dnn识别手写数字集
    '''
    import os
    import sys
    sys.path.append(os.path.abspath(
        os.path.dirname(os.path.abspath(__file__)) + os.path.sep + ".."))
    
    import torch
    import torchvision
    import torch.nn as nn
    import torch.nn.functional as F
    from config import MINIST_DATASET
    
    #加载数据集--训练集
    data_train = torchvision.datasets.MNIST(root=MINIST_DATASET,
                                transform=torchvision.transforms.ToTensor(),
                                train=True,
                                download=True)
    #批量化处理数据集,一个批次64个数据--训练集
    loader_train = torch.utils.data.DataLoader(dataset=data_train,
                                                    batch_size=64,
                                                    shuffle=True)
    #加载数据集--测试集
    data_test = torchvision.datasets.MNIST(root=MINIST_DATASET,
                                transform=torchvision.transforms.ToTensor(),
                                train=False,
                                download=True)
    #批量化处理数据集,一个批次64个数据--测试集
    loader_test = torch.utils.data.DataLoader(dataset=data_test,
                                                    batch_size=64,
                                                    shuffle=True)
    
    #定义一个网络,继承自pytorch.nn.module
    class Net(nn.Module):
        #继承父亲初始化的方法,并定义两个全链接层,分别是输入784维、输出100维;输入100维输出10维
        def __init__(self):
            super(Net, self).__init__()
            self.line1 = nn.Linear(784, 100)
            self.line2 = nn.Linear(100, 10)
        #定义网络向前传播的结构
        def forward(self, x):
            #将图像的二维数据变换为一 维数据
            x = x.reshape(-1, 784)
            #将数据输入第一层神经网络,并将其输出通过激活函数激活
            x = F.relu(self.line1(x))
            #dropout层
            x = F.dropout(x, 0.2, training=self.training)
            #将数据输入第二层神经网络
            x = self.line2(x)
            #再通过激活函数
            x = F.softmax(x, dim=1)
            #模型输出一个10维的张量
            return x
    
    #模型训练
    def train_model(num, save_model=True):
        #网络实例化
        net = Net()
        #定义优化器,参数调整的方式
        optim = torch.optim.Adam(params=net.parameters())
        #定义损失函数
        loss_function = nn.CrossEntropyLoss()
    
        #开始训练,
        for epoch in range(num):
            #模型训练模式
            net.train()
            running_loss = 0
            #批次训练,每次只有64个图片参与计算
            for data, label in loader_train:
                #计算模型结果
                output = net(data)
                #计算损失值
                loss = loss_function(output, label)
                #梯度清空
                optim.zero_grad()
                #反向传播,计算每个参数的梯度
                loss.backward()
                #使用优化器调整参数
                optim.step()
                #计算一个epoch的损失值
                running_loss += loss.item()
            print("loss:{}".format(running_loss))
    
            #模型验证模式
            net.eval()
            test_correct = 0
            #批量化验证
            for data, label in loader_test:
                #使用模型计算结果
                output = net(data)
                #取出10维数据中最大值的索引,即位预测结果
                _, output = output.max(dim=1)
                #计算准确率
                test_correct += (label == output).sum().item()
            print("正确率:{}%".format(round(test_correct/100.0, 2)))
    
        if save_model:
            # 保存模型
            torch.save(net, os.path.join(base_dir, 'test.pth.tar'))
    
    
    def use_save_model():
        # 加载模型
        net = torch.load(os.path.join(base_dir, 'test.pth.tar'))
        test_correct = 0
        for data, label in loader_test:
            # 使用模型计算结果
            output = net(data)
            # 取出10维数据中最大值的索引,即位预测结果
            _, output = output.max(dim=1)
            #计算预测正确率
            test_correct += (label == output).sum().item()
        print("存储的模型分类正确率:{}%".format(round(test_correct / 100.0, 2)))
    
    
    if __name__ == '__main__':
        train_model(20, False)
    

    模型结构

    在这里插入图片描述

    相关问题

    net.train() 和 net.eval()的作用?

    参考:net.train() 和 net.eval()的作用

    为什么是output.max(1)

    参考:output.max(1)

    optim.zero_grad()、pred=model(input)、loss=criterion(pred,tgt)、loss.backward()、optim.step()的作用

    参考:optim.zero_grad()、pred=model(input)、loss=criterion(pred,tgt)、loss.backward()、optim.step()的作用

  • 相关阅读:
    03-系统篇-内存碎片
    Windows取证——隐藏术
    Spectacle源码编译方法
    通胀飙升、加息,投资者需要好的投资标的
    STL算法 ——函数对象(仿函数)【仿函数、谓词、内建函数对象、适配器】
    Hadoop的配置
    Redis注解式开发并整合ssm项目以及击穿,穿透和雪崩的介绍及解决方案
    【SpringBoot】SpringBoot+SpringSecurity+CAS实现单点登录
    数据融合的并行计算
    [译]Sentry:如何从数据存储中获得更强的一致性
  • 原文地址:https://blog.csdn.net/siper12138/article/details/126954032
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号