用pytorch做手写数字识别,识别l率达97.8%

pytorch做手写数字识别

效果如下:

工程目录如下

第一步  数据获取

下载MNIST库,这个库在网上,执行下面代码自动下载到当前data文件夹下

from torchvision.datasets import MNIST
import torchvision

mnist = MNIST(root=‘./data‘,train=True,download=True)

print(mnist)
print(mnist[0])
print(len(mnist))
img = mnist[0][0]
img.show()

  

dataset.py文件,读取数据并做预处理

‘‘‘
准备数据集
‘‘‘

import torch
from torch.utils.data import DataLoader
from torchvision.datasets import MNIST
import torchvision

def mnist_dataset(train):

    func = torchvision.transforms.Compose([
        torchvision.transforms.ToTensor(),
        torchvision.transforms.Normalize(mean=(0.1307,),std=(0.3081,))
    ])

    #1.准备Mnist数据集
    return MNIST(root=‘./data‘,train=train,download=False,transform=func)

def get_dataloader(train = True):
    mnist = mnist_dataset(train)
    return DataLoader(mnist,batch_size=128,shuffle=True)

if __name__ == ‘__main__‘:
    for (images,labels) in get_dataloader():
        print(images.size())
        print(labels.size())
        break

  

models.py文件,定义训练的模型类

‘‘‘
定义模型
‘‘‘

import torch.nn as  nn
import torch.nn.functional as F

class MnistModel(nn.Module):

    def __init__(self):
        super(MnistModel,self).__init__()
        self.fc1 = nn.Linear(1*28*28,100)
        self.fc2 = nn.Linear(100,10)

    def forward(self,image):
        image_viewd = image.view(-1,1*28*28) #[batch_size,1*28*28]
        fc1_out = self.fc1(image_viewd) #[batch_size,100]
        fc1_out_relu = F.relu(fc1_out) #[batch_size,100]
        out = self.fc2(fc1_out_relu) #[batch_size,10]

        return F.log_softmax(out,dim=-1)  #带权损失计算交叉熵

cong.py文件,定义一些常亮,设置使用cpu还是GPU  

‘‘‘
项目配置
‘‘‘

import torch

train_batch_size = 128
test_batch_size = 100
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

  

train.py文件,模型训练文件,保存模型

"""
进行模型的训练
"""
from dataset import get_dataloader
from models import MnistModel
from torch import optim
import torch.nn.functional as F
import conf
from tqdm import tqdm
import numpy as np
import torch
import os
from test import eval

#1. 实例化模型,优化器,损失函数
model = MnistModel().to(conf.device)
optimizer = optim.Adam(model.parameters(),lr=1e-3)

#2. 进行循环,进行训练
def train(epoch):
    train_dataloader = get_dataloader(train=True)
    bar = tqdm(enumerate(train_dataloader),total=len(train_dataloader))
    total_loss = []
    for idx,(input,target) in bar:
        input = input.to(conf.device)
        target = target.to(conf.device)
        #梯度置为0
        optimizer.zero_grad()
        #计算得到预测值
        output = model(input)
        #得到损失
        loss = F.nll_loss(output,target)
        #反向传播,计算损失
        loss.backward()
        total_loss.append(loss.item())
        #参数的更新
        optimizer.step()
        #打印数据
        if idx%10 ==0 :
            bar.set_description_str("epcoh:{} idx:{},loss:{:.6f}".format(epoch,idx,np.mean(total_loss)))
            torch.save(model.state_dict(),"./models/model.pkl")
            torch.save(optimizer.state_dict(),"./models/optimizer.pkl")

if __name__ == ‘__main__‘:
    for i in range(10):
        train(i)
        eval()

test.py文件,模型测试文件,测试模型准确率  

‘‘‘
进行模型评估
‘‘‘

from dataset import get_dataloader
from models import MnistModel
from torch import optim
import torch.nn.functional as F
import conf
from tqdm import tqdm
import numpy as np
import torch
import os

def eval():
    #实例化模型,优化器,损失函数
    model = MnistModel().to(conf.device)

    if os.path.exists("./models/model.pkl"):
        model.load_state_dict(torch.load("./models/model.pkl"))

    test_dataloader = get_dataloader(train=False)
    total_loss = []
    total_acc = []
    with torch.no_grad():
        for input, target in test_dataloader:  # 2. 进行循环,进行训练
            input = input.to(conf.device)
            target = target.to(conf.device)
            # 计算得到预测值
            output = model(input)
            # 得到损失
            loss = F.nll_loss(output, target)
            # 反向传播,计算损失
            total_loss.append(loss.item())

            # 计算准确率
            ###计算预测值
            pred = output.max(dim=-1)[-1]
            total_acc.append(pred.eq(target).float().mean().item())
    print("test loss:{},test acc:{}".format(np.mean(total_loss), np.mean(total_acc)))

# if __name__ == ‘__main__‘:
#     # for i in range(10):
#     #     train(i)
#     eval()

  

原文地址:https://www.cnblogs.com/LiuXinyu12378/p/11392033.html

时间: 2024-10-09 19:31:56

用pytorch做手写数字识别,识别l率达97.8%的相关文章

【转】机器学习教程 十四-利用tensorflow做手写数字识别

模式识别领域应用机器学习的场景非常多,手写识别就是其中一种,最简单的数字识别是一个多类分类问题,我们借这个多类分类问题来介绍一下google最新开源的tensorflow框架,后面深度学习的内容都会基于tensorflow来介绍和演示 请尊重原创,转载请注明来源网站www.shareditor.com以及原始链接地址 什么是tensorflow tensor意思是张量,flow是流. 张量原本是力学里的术语,表示弹性介质中各点应力状态.在数学中,张量表示的是一种广义的"数量",0阶张量

Andrew Ng 机器学习课程笔记 ———— 通过初步的神经网络实现手写数字的识别(尽力去向量化实现)

上一篇我总结了自己在学完逻辑回归后,实现了对手写数字的初步识别 , 在学完了Andrew教授的神经网络简易教程后,趁着知识刚学完没多久,记下了自己在运用简易神经网络实现手写数字识别过程中的总结和问题 ^_^  菜鸡QP的第二篇学习笔记 ~ 错误在所难免 ,希望自己可以通过一篇篇菜鸡的笔记心得 ,取得一点点的进步 ~\(≧▽≦)/~    ) 依旧是给定 5000个20 * 20像素点的手写数字图片 ,与前几天自己完成的逻辑回归完成任务不同 ,这次自己终于要用到极富魅力的神经网络啦(虽然只是最基础

opencv实现KNN手写数字的识别

人工智能是当下很热门的话题,手写识别是一个典型的应用.为了进一步了解这个领域,我阅读了大量的论文,并借助opencv完成了对28x28的数字图片(预处理后的二值图像)的识别任务. 预处理一张图片: 首先采用opencv读取图片的构造函数读取灰度的图片,再采用大津法求出图片的二值化的阈值,并且将图片二值化. 1 int otsu(const IplImage* src_image) { 2 double sum = 0.0; 3 double w0 = 0.0; 4 double w1 = 0.0

MNIST手写数字图片识别(线性回归、CNN方法的手工及框架实现)(未完待续)

0-Background 作为Deep Learning中的Hello World 项目无论如何都要做一遍的. 代码地址:Github 练习过程中将持续更新blog及代码. 第一次写博客,很多地方可能语言组织不清,请多多提出意见..谢谢~ 0.1 背景知识: Linear regression CNN LeNet-5 AlexNet ResNet VGG 各种regularization方式 0.2 Catalog 1-Prepare 2-MNIST 3-LinearRegression 1-P

吴裕雄 python神经网络 手写数字图片识别(5)

import kerasimport matplotlib.pyplot as pltfrom keras.models import Sequentialfrom keras.layers import Dense,Activation,Flatten,Dropout,Convolution2D,MaxPooling2Dfrom keras.utils import np_utilsfrom keras.optimizers import RMSpropfrom skimage import

使用AI算法进行手写数字识别

人工智能 ??人工智能(Artificial Intelligence,简称AI)一词最初是在1956年Dartmouth学会上提出的,从那以后,研究者们发展了众多理论和原理,人工智能的概念也随之扩展.由于人工智能的研究是高度技术性和专业的,各分支领域都是深入且各不相通的,因而涉及范围极广 . 人工智能的核心问题包括建构能够跟人类似甚至超越人类的推理.知识.学习.交流.感知.使用工具和操控机械的能力等,当前人工智能已经有了初步成果,甚至在一些影像识别.语言分析.棋类游戏等等单方面的能力达到了超越

TensorFlow实战之Softmax Regression识别手写数字

     关于本文说明,本人原博客地址位于http://blog.csdn.net/qq_37608890,本文来自笔者于2018年02月21日 23:10:04所撰写内容(http://blog.csdn.net/qq_37608890/article/details/79343860).        本文根据最近学习TensorFlow书籍网络文章的情况,特将一些学习心得做了总结,详情如下.如有不当之处,请各位大拿多多指点,在此谢过. 一.相关概念 1.MNIST MNIST(Mixed

《神经网络和深度学习》系列文章一:使用神经网络识别手写数字

出处: Michael Nielsen的<Neural Network and Deep Leraning> 本节译者:哈工大SCIR硕士生 徐梓翔 (https://github.com/endyul) 声明:我们将不定期连载该书的中文翻译,如需转载请联系[email protected],未经授权不得转载. “本文转载自[哈工大SCIR]微信公众号,转载已征得同意.” 使用神经网络识别手写数字 感知机 sigmoid神经元 神经网络的结构 用简单的网络结构解决手写数字识别 通过梯度下降法学

Python scikit-learn 学习笔记—手写数字识别

这是一个手写数字的识别实验,是一个sklearn在现实中使用的案例.原例网址里有相应的说明和代码. 首先实验的数据量为1797,保存在sklearn的dataset里.我们可以直接从中获取.每一个数据是有image,target两部分组成.Image是一个尺寸为8*8图像,target是图像的类别,在我们看来类别就是手写的数字0-9. 代码一开始,将数据载入. <span style="font-family:Microsoft YaHei;"># Standard sci