• 我的NVIDIA开发者之旅-Jetson Nano 2gb教你怎么训练模型(完整的模型训练套路)


    我的NVIDIA开发者之旅” | 征文活动进行中.......

    模型的保存和加载

    pytorch的安装方法这里就不写了,之前的文章有记录,nvidia官网的资料已经很详细了附上连接(注意你的Jetpack版本就好了,一般玄学的问题都出现在这里)

    PyTorch for Jetson - version 1.11 now available - Jetson & Embedded Systems / Jetson Nano - NVIDIA Developer Forums

     安装pychrom的方法之前的文章也有完整的记录,基本环境也就是这些。今天用到的也就是pytorch。

    神经网络的训练一般要进行的步骤:

    加载数据集,并做预处理。
    预处理后的数据分为 feature 和 label 两部分,feature 送到模型里面,label 被当做 ground-truth。
    model 接收 feature 作为 input,并通过一系列运算,向外输出 predict。
    通过以 predict 和 predict 为变量,建立一个损失函数 Loss,Loss 的函数值是为了表示 predict 与 ground-truth 之间的差距。
    建立 Optimizer 优化器,优化的目标就是 Loss 函数,让它的取值尽可能最小,loss 越小代表 Model 预测的准确率越高。
    Optimizer 优化过程中,Model 根据规则改变自身参数的权重,这是个反复循环和持续的过程,直到 loss 值趋于稳定,不能在取得更小值。

    CIFAR-10 和 CIFAR-100 是 8000 万张微小图像数据集的标记子集。它们由Alex Krizhevsky,Vinod Nair和Geoffrey Hinton收集。

    CIFAR-10 数据集

    CIFAR-10 数据集由 10 个类中的 60000 张 32x32 彩色图像组成,每个类包含 6000 张图像。有 50000 张训练图像和 10000 张测试图像。

    数据集分为五个训练批次和一个测试批次,每个批次包含 10000 张图像。测试批次正好包含从每个类中随机选择的 1000 张图像。训练批次包含随机顺序的剩余图像,但某些训练批次可能包含来自一个类的图像多于另一个类的图像。在它们之间,训练批次正好包含来自每个类的 5000 张图像。

    运行代码后,会自动下载数据集,并存放在当前目录下的 data 文件中。

    1. # 这是一个示例 Python 脚本。
    2. # 按 Shift+F10 执行或将其替换为您的代码。
    3. # 按 Double Shift 在所有地方搜索类、文件、工具窗口、操作和设置。
    4. def print_hi(name):
    5. # 在下面的代码行中使用断点来调试脚本。
    6. print(f'Hi, {name}') # 按 Ctrl+F8 切换断点。
    7. # 按间距中的绿色按钮以运行脚本。
    8. if __name__ == '__main__':
    9. print_hi('PyCharm')
    10. # 访问 https://www.jetbrains.com/help/pycharm/ 获取 PyCharm 帮助
    11. import torch
    12. from torch.utils.data import DataLoader
    13. #import torch.nn as nn
    14. from torch import nn
    15. from model import *
    16. torch.cuda.is_available()
    17. print('CUDA available: ' + str(torch.cuda.is_available()))
    18. a = torch.cuda.FloatTensor(2).zero_()
    19. print('Tensor a = ' + str(a))
    20. b = torch.randn(2).cuda()
    21. print('Tensor b = ' + str(b))
    22. c = a + b
    23. print('Tensor c = ' + str(c))
    24. import torchvision
    25. train_data = torchvision.datasets.CIFAR10("root=../data",train=True,transform=torchvision.transforms.ToTensor(),download=True)
    26. test_date = torchvision.datasets.CIFAR10("root=../data",train=False,transform=torchvision.transforms.ToTensor(),download=True)
    27. trian_data_size = len(train_data)
    28. test_data_size = len(test_date)
    29. #train_data_size=10,xunlianshujujide changduwei10
    30. print("xunlianshujujjidechangduwei:{}".format(trian_data_size))
    31. print("ceshishujujjidechangduwei:{}".format(test_data_size))
    32. #liyongdataloader laijiazaishujuji
    33. train_dataloader = DataLoader(train_data,batch_size=64)
    34. test_dataloader = DataLoader(test_date,batch_size=64)
    35. #Build neural network
    36. tudui = Tudui()
    37. # sunshihanshu
    38. loss_fn = nn.CrossEntropyLoss()
    39. #youhuaqi
    40. # learning_rate = 0.01
    41. #1e-2=1x (10)^(-2) = 1/100 =0.01
    42. learning_rate = 1e-2
    43. optimizer = torch.optim.SGD(tudui.parameters(),lr=learning_rate)
    44. #shezhixunliandechishu
    45. #jiluxunliandechichu
    46. total_train_setp = 0
    47. ##jiluceshide cichu
    48. total_test_step = 0
    49. # xunlianndelunsh
    50. epoch = 10
    51. for i in range(epoch):
    52. print("---------di{}lunxunlianstart".format(i+1))
    53. #xunliankaishi
    54. for data in train_dataloader:
    55. imgs, targets = data
    56. outputs = tudui(imgs)
    57. loss = loss_fn(outputs,targets)
    58. #youhuaqijianmoxing
    59. optimizer.zero_grad()
    60. loss.backward()
    61. optimizer.step()
    62. total_train_setp = total_train_setp + 1
    63. print("xunliancishu:{},loss:{}".format(total_test_step, loss.item()))

    epoch 和 iteration 的区别,iteration 指的是单次 mini-batch 训练,而 epoch 和数据集的大小还有 batch size 有关。
    CIFAR-10 训练集图片数量是 50000,batch size 的大小是 100,所以要经过 500 次 iteration 才算走完一个 epoch。
    epoch 可以大致当成神经网络把训练集所有的照片从头看到尾都过一遍。

    运行结果如下图。

    1. ljx@ljx-desktop:~/PycharmProjects/pythonProject$ cat model.py
    2. import torch
    3. from torch import nn
    4. class Tudui(nn.Module):
    5. def __init__(self):
    6. super(Tudui, self).__init__()
    7. self.model = nn.Sequential(
    8. nn.Conv2d(3, 32, 5, 1, 2),
    9. nn.MaxPool2d(2),
    10. nn.Conv2d(32, 32, 5, 1, 2),
    11. nn.MaxPool2d(2),
    12. nn.Conv2d(32, 64, 5, 1, 2),
    13. nn.MaxPool2d(2),
    14. nn.Flatten(),
    15. nn.Linear(64 * 4 * 4, 64),
    16. nn.Linear(64, 10)
    17. )
    18. def forward(self, x):
    19. x = self.model(x)
    20. return x
    21. if __name__ == '__main__':
    22. tudui = Tudui()
    23. input = torch.ones((64, 3, 32, 32))
    24. output = tudui(input)
    25. print(output.shape)

    Jetson nano用来测试这个是很吃力的,希望各位同学还是换个性能强悍的nx或者orin试试。

  • 相关阅读:
    【微服务34】分布式事务Seata源码解析二:Seata Server启动时都做了什么【云原生】
    【ERROR】ERR_PNPM_NO_IMPORTER_MANIFEST_FOUND No package.json
    那个写出最烂代码的程序员,不但进了Google,还财务自由了!
    Java学习之路
    百度集团副总裁吴甜解读跨模态大模型技术创新,发布AI作画神器文心·一格
    vuex报错 Cannot destructure property ‘commit‘ of ‘undefined
    从0到1做一个产品需要注意的基本点
    开源一个反sql注入的asp.net core中间件
    C++对象模型学习笔记
    31个常用的python实现
  • 原文地址:https://blog.csdn.net/weixin_46151178/article/details/125408858