• pytorch 手写数字识别1


    目录

    1.       概述
    2.       加载图片
    3.       绘图部分
    4.       backward

    前言:

           这里以一个手写数字识别的例子,简单了解一下pytorch 实现神经网络的过程.

    本章重点讲一下加载数据过程

    参考:

    课时9 手写数字识别初体验-1_哔哩哔哩_bilibili

    Pytorch中的backward函数 - 知乎


    一  概述

        整体流程如下,分为四步

     


    二   加载图片

         如下为加载minist 数据集过程

        

    1. # -*- coding: utf-8 -*-
    2. """
    3. Created on Thu Nov 24 17:17:19 2022
    4. @author: chengxf2
    5. """
    6. import torchvision
    7. from matplotlib import pyplot as plt
    8. import torch
    9. import torchvision.transforms as transforms
    10. import torchvision.datasets
    11. from util import plot_curve,plot_image
    12. '''
    13. root : 需要下载地址的根目录位置
    14. train: True 下载训练集trainin.pt False 下载test.pt
    15. transform: 一系列作用在PIL 图片上的转换操作,返回一个转换版本
    16. dowenload: 是否下载到root 指定的位置
    17. transforms.Compose():
    18. 将多个预处理依次累加在一起, 每次执行transform都会依次执行其中包含的多个预处理程序
    19. transforms.ToTensor():
    20. 在做数据归一化之前必须要把PIL Image转成Tensor
    21. transforms.Normalize([0.5], [0.5]):
    22. 归一化,这里的两个0.5分别表示对张量进行归一化的 全局平均值和方差,
    23. 因为图像是灰色的只有一个通道,所以分别指定一了一个值,如果有多个通道,
    24. 需要有多个数字,如3个通道,就应该是Normalize([m1, m2, m3], [n1, n2, n3])
    25. '''
    26. def load_data(batch =512):
    27. transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize([0.1307], [0.3018])])
    28. train_dataset = torchvision.datasets.MNIST('mnist_data', train=True, transform=transform, download=True)
    29. test_dataset = torchvision.datasets.MNIST('mnist_data/', train=False, transform=transform, download=False)
    30. train_loader = torch.utils.data.DataLoader(train_dataset, batch_size = batch, shuffle=True)
    31. test_loader = torch.utils.data.DataLoader(test_dataset)
    32. print("\n --end--",type(train_loader))
    33. return train_loader, test_loader
    34. def show(data):
    35. #递归所有的元素
    36. for step, (x,y) in enumerate(data):
    37. print("\n step ",step,y.shape) #512
    38. ###单独取一个###
    39. x,y = next(iter(train_loader))
    40. print(x.shape, y.shape)
    41. print(x.min(), x.max(),type(x)) #Tensor
    42. plot_image(x,y,'image sample')
    43. if __name__ =="__main__":
    44. train_loader , test_loader = load_data()
    45. show(train_loader)

    三  绘图部分


    1. # -*- coding: utf-8 -*-
    2. """
    3. Created on Mon Nov 21 17:16:16 2022
    4. @author: chengxf2
    5. """
    6. import torch
    7. from matplotlib import pyplot as plt
    8. def plot_curve(data):
    9. #画训练过程的loss
    10. fig = plt.figure()
    11. N= len(data)
    12. plt.plot(range(N),data, color='green')
    13. plt.legend(['value'], loc='up right')
    14. plt.xlabel('step')
    15. plt.ylabel('value')
    16. plt.show()
    17. def plot_image(img, label, name):
    18. #画图片
    19. fig = plt.figure()
    20. for i in range(6):
    21. plt.subplot(2,3,i+1) #t(nrows ncols plot_number)
    22. plt.tight_layout() #会自动调整子图参数,使之填充整个图像区域
    23. plt.imshow(img[i][0]*0.3081+0.1307,interpolation ='none')
    24. plt.title("{}:{}".format(name, label[i].item()))
    25. plt.xticks([])
    26. plt.yticks([])
    27. plt.show()
    28. '''
    29. 生成one-hot
    30. Tensor.scatter_(dim, index, src, reduce=None) → Tensor
    31. Parameters
    32. scatter_(dim, index, src): 将src中所有的值分散到self 中,填法是按照index中所指示的索引来填入。
    33. dim (int) – the axis along which to index
    34. dim=0,按照index行索引的指示来进行散射
    35. dim=1 ,按照index列索引的指示来进行散射
    36. index (LongTensor) – the indices of elements to scatter, can be either empty or of the same dimensionality as src. When empty, the operation returns self unchanged.
    37. src (Tensor or float) – the source element(s) to scatter. 要填进去的元素
    38. reduce (str, optional) – reduction operation to apply, can be either 'add' or 'multiply'. 用的相对较少。
    39. '''
    40. def one_hot(label, depth=10):
    41. N = label.size(0)
    42. print("\n n:",N)
    43. out = torch.zeros(N, depth)
    44. idx = torch.LongTensor(label).view(-1,1)
    45. out.scatter_(dim=1, index=idx, value=1)
    46. print("\n out ",out)
    47. return out
    48. #label =[1,2,5]
    49. #label = torch.LongTensor(label)
    50. #one_hot(label)

    四  Pytorch 中的backward 

         Numpy ,pytorch 可以自己实现反向传播算法,也可以使用pytorch给的API,通过动态图自动

    求导

     这里面给出3个例子3.1  

    3.1 简单的LR 模型

          

       \hat{y}=xw^T

      L=\frac{(\hat{y}-y)^2}{2}

      梯度:

       \frac{\partial L}{\partial w}=(\hat{y}-y)x

    1. Created on Tue Nov 22 14:58:50 2022
    2. @author: chengxf2
    3. """
    4. import torch
    5. from torch.autograd import Variable
    6. '''
    7. 自动求梯度例子1
    8. '''
    9. def grad():
    10. x = torch.tensor([2.0,1.0],requires_grad=True)
    11. w = torch.tensor([1.0,2.0],requires_grad=True)
    12. y = torch.matmul(w, x.T)
    13. L = (y-1.0)**2/2.0
    14. print("\n L ",L)
    15. L.backward()
    16. print(w.grad)
    17. grad()

      bias tensor(3., grad_fn=)
      tensor([6., 3.])

  • 相关阅读:
    掌握 Kubernetes 故障排除技巧:kubectl命令的基本指南
    CF1186B
    Springboot 项目启动类放置位置
    Shell编程规范与变量-01
    从汇编看语法糖(C++引用)和指针的区别
    LeetCode每日一题(1770. Maximum Score from Performing Multiplication Operations)
    学习嵌入式的第十六天----结构体 共用体
    STC单片机17——adc 8032
    带你轻松解密白盒测试
    SpringBoot基础篇 (1)
  • 原文地址:https://blog.csdn.net/chengxf2/article/details/127969536