【学习AI-相关路程-mnist手写数字分类-python-硬件:jetson orin NX-自我学习AI-基础知识铺垫-遇到问题(1) 】

【学习AI-相关路程-mnist手写数字分类-python-硬件:jetson orin NX-自我学习AI-基础知识铺垫-遇到问题(1) 】

1、前言

本片博文,我想为大家展示一下,使用jetson orin nx 这个硬件平台上,展示学习minst手写阿拉伯数字的过程,当然也算自己的记录。

自己也在这个过程中,也上网查了很多博文吧,目前在中文世界里,感觉有些文章写的不太好,我希望以自己的方式,将整个过程记录下来,主要是操作过程,实操是先于理论的,这样我们有了完成这件事成就感后,就可以测试各种各样的事情,反过来如果先看来很对资料,没有实际操作,就会有一种空的感觉,因为没有做什么实际事情,虽然自己也是先看资料。不过这个过程,(算是在思考做事情的时候)思考我虽然没有好的想法,但是至少思考了吧,这话听着有点绕。

我们的目的是:通过现有资源学习Ai相关知识。

2、先行了解

(1)学习基础知识-了解jetson orin nx 设备

基于不同测试环境,我们可能需要的不知识,本次我们使用的jetson orin nx这个英伟达的设备,虽然不同设备都可以运行AI,但是本次的话,基于设备的原因,我们还是需要了解下,并且我之前也总结了一下资料,以供参考,当然也可以去英伟达官网去了解。

链接:【在英伟达nvidia的jetson-orin-nx-工控机入门了解-自我学习-资料记录-熟悉了解】

(2)学习python&AI的相关知识

平台敲定后,应该是学习python和AI,自己之前也是学过一些python,是有一定基础的,但确实,不是自己主要的工作时候使用编程语言。但编程语言这个东西,有一两门之后,其他学起来就快很多了。

关于学习AI相关知识,要入门人工智能(AI)领域,以下是一些建议,帮助有效地开始学习:

  1. 打好编程基础

    • Python是AI和机器学习领域最常用的编程语言。你可以从基本的语法开始,逐步学习高级概念。
    • 熟悉常用的AI库和框架,如TensorFlow、PyTorch、scikit-learn等。
  2. 强化数学基础

    • 线性代数:理解矩阵、向量等概念,这对理解神经网络非常重要。
    • 微积分:学习导数、积分等知识,帮助你理解优化算法。
    • 概率与统计:掌握概率分布、统计推断等,应用于模型评估和数据分析。
  3. 学习机器学习基础

    • 了解监督学习、无监督学习和强化学习的基本概念。
    • 学习常见的算法,如线性回归、逻辑回归、决策树、支持向量机等。
  4. 深入了解深度学习

    • 学习神经网络的原理和结构,包括前馈网络和反馈网络。
    • 掌握卷积神经网络(CNN)、循环神经网络(RNN)、生成对抗网络(GAN)等。
  5. 实践操作

    • 使用TensorFlowPyTorch构建并训练模型。
    • 在Kaggle等平台参与比赛,解决实际问题,积累经验。
  6. 利用在线资源和课程

    • Coursera:吴恩达的"机器学习"课程和"深度学习专项课程"。
    • edX:提供MIT和哈佛的相关课程。
    • Fast.ai:实用的深度学习课程,注重实践。
  7. 阅读经典书籍

    • 《机器学习》------周志华著
    • 《深度学习》------Ian Goodfellow等著
    • 《模式识别与机器学习》------Christopher M. Bishop著
  8. 关注行业动态

    • 订阅AI领域的博客、新闻和播客,如arXiv、Medium上的AI专栏等。
    • 参加研讨会、线上线下的AI社区活动,扩展人脉。
  9. 制定学习计划

    • 设定短期和长期目标,规划学习路径。
    • 定期复盘,调整学习策略。
  10. 动手项目

    • 从简单的项目开始,如手写数字识别、图像分类等。
    • 尝试自己构思并实现一个完整的AI应用。

(3)了解mnist相关资料&数据集

另外就是了解本次咱们学习的项目,中文名字大概叫:"mnist手写数字识别"。这个项目可以说是,入门学习AI的经典项目之一了,它主要是用AI训练一个模型,然后让AI来预测手写体的数字。

如果你不断查资料,那么最终一定会查到如下网站,也就是提供阿拉伯数字手写体的网站。

链接:https://yann.lecun.com/exdb/mnist/

简单说,这个网站为你 准备了一共7W张手写体阿拉伯数字(has a training set of 60,000 examples, and a test set of 10,000 examples)。

而且中文也能搜到很多资料。

链接:https://so.csdn.net/so/search?spm=1001.2101.3001.4498&q=mnist%E6%89%8B%E5%86%99%E6%95%B0%E5%AD%97%E5%88%86%E7%B1%BBpytorch&t=&u=&urw=

(4)百花争鸣-更优的方案

mnist这个手写数字分类,实在有多人做了,所以一定需要注意的是,大家做事的方式可能完全不一样,你会发现你在看资料的过程中,一会儿这个文章这样说,一会儿另一个文章又说了另一种方式,比如CNN的方式,其实只是大家解题思路不一样而已,但又是八仙过海,各显神通的故事。

另外就是代码对我们这样的初学者来说,可能需要多看,会些python编程语言和理解AI相关代码需要很长的路途。

(5)做这件事的流程

我们学习本项目的时候,其实和之前做屏幕识别项目的本质,其实大致一致的,只不过不用自己准备相关训练素材了。

链接:【学习AI-相关路程-工具使用-自我学习-jetson&模型训练-图片识别-使用模型检测图片-基础样例 (5)】

  • 阶段 1: 硬件设置
  • 阶段 2: 软件准备
  • 阶段 3: 数据准备
  • 阶段 4: 模型设计和训练
  • 阶段 5: 优化和部署
  • 阶段 6: 应用集成
  • 阶段 7: 监控和维护

(6)环境配置

对于我们新手而言,最初的工作,可能很大部分,都需要会花在确认环境上。环境对不对,配置好不好,真的会影响最后结果吧,从我目前测试了来看,80%的时候都卡在配置上,也是数据和模型小的原因,反而没花太多时间,或者还没有尝试足够多。

3、应用相关

自己之前在学屏幕识别的时候,想着实际应用下,想和qt进行结合,查到大概有三种方式,如下。

1,将qt变为python的编译环境

第一种,就是直接使用python的qt环境,相关文章也很多,也有很多方式,之前切换编程语言,自己之前项目都是c++的,冷不丁切还是需要适应是的。

2,c++项目调用python

第二种,就是还是使用c++环境,就像插入插件的方式,将python作为插件的部分放到代码中,需要的时候,拿过来调用。

3,c++和python进行混编

第三种,也是就是说在直接c++和python直接一起混合编译。

说了这么多,想表达的是,如果简单和qt进行结合的话还是有很多方式的。

4,其他应用方式

另外实际应用,也不一定必须要和qt一起使用,看你自己实际需求。

4、数学部分&原理部分

这里也就是本次实验,我们将会使用一种叫,三层全连接神经网络(BPnetwork),以下是相关说明。

三层全连接神经网络,也称为三层前馈神经网络或三层感知机,是一种典型的反向传播(Backpropagation, BP)神经网络 。它由输入层隐藏层输出层三个层次构成,每一层的节点(神经元)与上一层的所有节点相连,因此称为"全连接"。

1. 结构组成
  • 输入层(Input Layer):这一层接收原始数据作为网络的输入。输入层的节点数通常等于输入特征的数量。例如,对于一个28x28的灰度图像来说,输入层的节点数是784(28x28 = 784个像素)。

  • 隐藏层(Hidden Layer):这是网络中的中间层,也称为特征提取层。在三层BP网络中,只有一层隐藏层。隐藏层节点数可以自由设定,常见做法是根据输入输出维度和任务复杂度调整其节点数。隐藏层通过激活函数对输入进行非线性变换,增强模型的表达能力。

  • 输出层(Output Layer):这一层的输出是最终的预测结果。输出层的节点数取决于任务类型。例如,对于一个二分类问题,输出层通常只有一个节点,而对于多分类问题,输出层的节点数等于类别的数量。

2. 关键特点
  • 激活函数:隐藏层通常使用非线性激活函数,如Sigmoid、ReLU或Tanh等,使网络能够拟合非线性关系。输出层的激活函数根据任务选择,比如二分类问题常用Sigmoid,多分类问题常用Softmax。

  • 全连接:每一层的每个神经元都与前一层的所有神经元相连接,并通过加权求和和激活函数转换输入数据。

3. 学习过程

BP神经网络的学习过程分为前向传播反向传播两个阶段:

  • 前向传播:输入层的数值通过全连接的权重传递到隐藏层,经过激活函数处理后,再传递到输出层,最终得到输出结果。这个阶段是从输入到输出的逐层计算。

  • 反向传播:BP网络通过计算预测值与真实值之间的误差(通常通过损失函数计算,如均方误差或交叉熵),然后通过梯度下降算法逐层反向传播误差,更新每个连接权重,以最小化误差。

4. 训练目标

通过多次前向和反向传播,调整网络的参数,使得网络能够在给定数据上准确地进行预测。

5. 优缺点
  • 优点

    • 结构简单,适合小规模数据和简单任务。
    • 可通过反向传播算法高效更新参数。
  • 缺点

    • 对大规模数据表现不佳。
    • 隐藏层的数量较少,可能限制模型的表达能力。
    • 需要大量调参(如学习率、隐藏层神经元数目)来获得较好的性能。

5、问题描述:module 'torch' has no attribut '_six'

(1)问题说明

这个问题之前就其实存在,当时尝试了很多办法,不知道如何解决,虽然当时知道是"与 torch 和 torchvision 版本兼容性相关的问题",但是在自己识别屏幕想项目上,如果不使用torchvision的特殊版本,那个就过不去,就会使用CPU,但是本项目就是报错如下。

(2)关联问题说明

这是之前的文章,当时想要解决使用GPU问题。
【学习AI-相关路程-工具使用-自我学习-jetson&模型训练-问题补充-无法使用GPU问题-CUDA is available: False-补充说明 (6)】

最后想来想去,还是现已这个为主,比较使用屏幕那个,用cpu也可以的。

(3)问题原因

说回本问题,有两个可能的原有。

  • torch 和 torchvision 版本不匹配。
  • torchvision 的某个版本依赖于 torch 的 _six 属性,而较新的 torch 版本中已经移除了 _six。

(4)解决方式

1、确保和确认torch 和 torchvision 版本兼容

运行以下命令,查看当前安装的 torch 和 torchvision 版本:

shell 复制代码
python3 -c "import torch; print(torch.__version__); import torchvision; print(torchvision.__version__)"

主要是查看两个torch 和 torchvision 版本的兼容。

2、升级或者降级torch 和 torchvision 版本

我这里之前为了使GPU能过,后来才知道,相当于使用特定版本。

在 torch 2.0.0 版本及以后不再包含 _six.py 文件,而一些 torchvision 版本仍然依赖这个文件。

  • (1)兼容torch 和 torchvision 版本
shell 复制代码
pip3 install --upgrade torch torchvision
  • (2)安装特定版本
    至于如何安装版本可以看我以往讲的相关文章。

【学习AI-相关路程-工具使用-自我学习-jetson&模型训练-问题补充-无法使用GPU问题-CUDA is available: False-补充说明 (6)】

shell 复制代码
pip3 install torch==1.7.1 torchvision==0.8.2

或者 安装其他版本组合

shell 复制代码
pip3 install torch==1.8.0 torchvision==0.9.0

3、检查依赖项

既然问题报错,缺少什么_six的,那么安装网上,补上这个是不是就看可以了这也是一个办法,按照网上查到的,主要是这个太旧了,被删除的原因。

所以我们尝试更新 six和 pillow ,这块自己尝试了,没有成功。

shell 复制代码
pip3 install --upgrade six pillow

或者

直接在自己相关文件夹里加入相应文件,但是有可能放在位置不对,也没成功。

自己在找到的链接说明里试了一下,没成功。

链接:https://blog.csdn.net/QKK612501/article/details/130532389

4、重新卸载和安装

自己之前主要是想,保证之前屏幕识别那个没有问题,所以才卡住了,既然之前没有GPU也能用,其实也还好,当然重新按照,只能算是一种方式,有可能能解决问题。

  • (1)卸载当前的torch 和 torchvision 版本
shell 复制代码
pip3 uninstall torch torchvision
  • (2)重新安装torch 和 torchvision 版本
shell 复制代码
pip3 install torch==1.8.0 torchvision==0.9.0

根据 JetPack 版本选择对应的 PyTorch 和 torchvision 版本。这里我使用的是 JetPack 5.1.2,可以使用如下版本,如果硬件设备不一样,需要自行确认相关版本:

shell 复制代码
# 下载并安装 PyTorch
wget https://nvidia.box.com/shared/static/p57jwntn4yjg5e8tdw9xz3z0h8g2p0g4.whl -O torch-2.0.0+nv23.08-cp38-cp38-linux_aarch64.whl
pip install torch-2.0.0+nv23.08-cp38-cp38-linux_aarch64.whl

# 下载并安装 torchvision
wget https://nvidia.box.com/shared/static/qxtknlkyccnpys29s7mrw5p4v7flxo5z.whl -O torchvision-0.15.1+nv23.08-cp38-cp38-linux_aarch64.whl
pip install torchvision-0.15.1+nv23.08-cp38-cp38-linux_aarch64.whl

6、发现问题过程:预测模型总是相同数字。

这里自己在第一次尝试生产模型过程中,发现每次识别都是8,后来通过查找,才发现是torch 和 torchvision 版本问题。

使用的是 Jetson Orin NX,这是一款基于 NVIDIA GPU 的嵌入式设备。在这种平台上运行深度学习模型,可能会遇到一些特定的问题,导致模型预测结果异常(如总是预测为 8)。以下是可能的原因和解决方案:

  1. CUDA 和 cuDNN 版本不匹配

    • 原因:Jetson 平台上的 CUDA 和 cuDNN 版本需要与您的深度学习框架(如 TensorFlow、PyTorch)兼容。如果版本不匹配,可能会导致模型无法正确运行。
    • 解决方案 :确保您安装的 CUDA 和 cuDNN 版本与所使用的深度学习框架兼容。可以参考 NVIDIA 的 JetPack SDK 文档,确认正确的版本组合。
  2. TensorFlow/PyTorch 安装问题

    • 原因:在 Jetson Orin NX 上安装深度学习框架时,如果安装步骤不正确,可能导致框架功能异常。

    • 解决方案:使用 NVIDIA 提供的预编译版本或官方指南进行安装。例如,使用以下命令安装适用于 Jetson 的 PyTorch:

      bash 复制代码
      sudo apt-get install python3-pip libopenblas-base libopenmpi-dev
      pip3 install --pre torch torchvision torchaudio --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v5
  3. 模型保存和加载的问题

    • 原因:如果模型在其他平台上训练,然后在 Jetson Orin NX 上运行,可能由于序列化格式或兼容性问题,导致模型参数未正确加载。
    • 解决方案:尝试在 Jetson Orin NX 上重新训练模型,或者确保模型保存和加载使用了相同的框架和版本。
  4. 数据预处理差异

    • 原因:在不同的平台上,数据加载和预处理方式可能有所不同,导致输入数据不正确。
    • 解决方案:检查数据预处理代码,确保在 Jetson Orin NX 上的数据处理与原始环境一致。
  5. GPU 计算能力和配置

    • 原因:Jetson 设备的计算能力与桌面 GPU 有所不同,可能需要调整模型或设置。
    • 解决方案:确认代码中正确使用了 GPU,并且未超出设备的内存限制。可以通过减少批次大小(batch size)或简化模型来适应设备性能。
  6. 依赖库版本问题

    • 原因:某些依赖库(如 NumPy、SciPy)的版本可能与深度学习框架不兼容。
    • 解决方案:检查并更新依赖库,确保其版本与所用框架兼容。建议使用虚拟环境来管理依赖关系。
  7. 性能模式设置

    • 原因:Jetson 设备可能默认处于省电模式,限制了 GPU 性能。

    • 解决方案:使用以下命令将设备设置为最大性能模式:

      bash 复制代码
      sudo nvpmodel -m 0
      sudo jetson_clocks
  8. 硬件资源不足

    • 原因:模型可能过于复杂,导致在嵌入式设备上无法正确运行。
    • 解决方案:尝试使用更小的模型或进行模型压缩,如剪枝或量化。
  9. 浮点精度问题

    • 原因:Jetson 设备可能使用了 FP16 等低精度计算,导致精度下降。
    • 解决方案:确保模型使用 FP32 精度,或者在模型代码中明确指定所需的精度模式。
  10. 检查日志和错误信息

    • 原因:运行过程中可能有警告或错误信息提示问题所在。
    • 解决方案:查看控制台输出或日志文件,寻找异常信息。如有需要,添加更多的日志输出来调试。

建议的下一步行动

  • 运行官方示例代码:在 Jetson Orin NX 上运行 MNIST 的官方示例,验证环境和框架是否正常工作。
  • 验证数据和标签:确保数据集加载正确,标签没有偏差或错误。
  • 重现问题:尝试在简单的模型上重现问题,缩小问题范围。
  • 更新系统和驱动 :使用 sudo apt updatesudo apt upgrade 更新系统,确保所有软件都是最新的。
  • 咨询社区和文档:参考 NVIDIA 官方论坛和文档,获取针对 Jetson Orin NX 的支持和建议。

7、细节补充

1、尝试手动添加 _six.py文件

方案 1:手动添加 _six.py 文件

这种方法是在现有 torch 2.0.0 环境中添加 _six.py 文件,来保持兼容性。

  1. 找到 _six.py 文件

    • 如果有一个旧版本的 PyTorch 环境,可以直接找到该文件。通常路径为:<python_env>/lib/python3.x/site-packages/torch/_six.py

    • 可以使用以下命令在系统中搜索这个文件:

      bash 复制代码
      find / -name _six.py
  2. _six.py 文件复制到当前 PyTorch 环境

    • 找到当前 PyTorch 2.0.0 安装的路径:

      bash 复制代码
      python3 -c "import torch; print(torch.__file__)"

      这会打印 torch 模块的路径,例如 /home/user/.local/lib/python3.8/site-packages/torch/__init__.py

    • _six.py 文件复制到 PyTorch 模块路径中,例如:

      bash 复制代码
      sudo cp /path/to/old/torch/_six.py /home/user/.local/lib/python3.8/site-packages/torch/

方案 2:降级 torchtorchvision 版本

torchtorchvision 降级到 2.0.0 之前的版本。这种方式更为安全和稳定,因为手动添加文件可能会导致其他兼容性问题。

1. 卸载现有的 torchtorchvision
bash 复制代码
pip uninstall torch torchvision
2. 安装兼容的 torchtorchvision 版本
  1. 如果是 CPU 版本

    bash 复制代码
    pip install torch==1.7.1 torchvision==0.8.2 -f https://download.pytorch.org/whl/torch_stable.html
  2. 如果是 Jetson ARM 版本

    下载合适的 .whl 文件,并手动安装。由于 Jetson Orin NX 的 CUDA 环境支持,可以尝试安装兼容 Jetson 的较低版本:

    • PyTorch 1.7.1 和 torchvision 0.8.2:

      bash 复制代码
      wget https://nvidia.box.com/shared/static/1nc79v8dvla3cl4dzms0oaw1jzwkdzlp.whl -O torch-1.7.1-cp38-cp38-linux_aarch64.whl
      wget https://nvidia.box.com/shared/static/xbvls9fuvcw3kj9uv4ci1pnz7jdbj2bi.whl -O torchvision-0.8.2-cp38-cp38-linux_aarch64.whl
    • 安装下载的 .whl 文件:

      bash 复制代码
      pip install torch-1.7.1-cp38-cp38-linux_aarch64.whl
      pip install torchvision-0.8.2-cp38-cp38-linux_aarch64.whl
  3. 安装完成后测试版本

    bash 复制代码
    python3 -c "import torch; print(torch.__version__); import torchvision; print(torchvision.__version__)"

方案 3:修改 torchvision 源代码

如果有能力修改源代码,可以将 torchvision 中引用 _six.py 的地方改为新的实现方式。

  1. 找到报错的文件 datasets/mnist.pytorch._six 的引用。
  2. 替换为 Python 自带的 six 模块,通常用 from six import string_classes 替代。

这种方法要求对源代码有修改权限,且理解修改的内容,较为复杂,不推荐。

方案 4:方案3的变体,增加或修改 _six.py 的原始内容

(1)以下是 _six.py 文件的原始内容,可以将其保存为 _six.py,并放入 torch 模块目录中(如:/path/to/torch/_six.py):

python 复制代码
import sys
import six

string_classes = (str, bytes)
int_classes = (int,)
file_classes = (six.StringIO, six.BytesIO)

PY37 = sys.version_info >= (3, 7)

if not PY37:
    class ModuleType(type(sys)):
        def __getitem__(self, name):
            return getattr(self, name)

    sys.modules[__name__].__class__ = ModuleType

(2). 将 _six.py 文件放入 PyTorch 目录

  1. 将上述内容保存为 _six.py 文件。

  2. 找到当前 PyTorch 安装的路径(可以通过以下命令获取):

    bash 复制代码
    python3 -c "import torch; print(torch.__file__)"

    假设输出路径为 /home/username/.local/lib/python3.8/site-packages/torch

  3. _six.py 文件放入上述 torch 安装目录中:

    bash 复制代码
    cp _six.py /home/username/.local/lib/python3.8/site-packages/torch/

手动添加 _six.py 文件并修改 torchvision 中的引用可以解决临时兼容性问题,但不建议长期使用。如果可能,推荐尽量使用兼容的 torchtorchvision 版本。

8、总结

写文章就是思考的过程总结,讲自己做的过程和查找的问题进修整理,也是一种重新思考的时候,自己这里说了很多自己遇到的问题,对于新手我认为就会这样,我们需要知道很多事情,铺垫很多,才能做好这件事。

相关推荐
ragnwang2 分钟前
C++ Eigen常见的高级用法 [学习笔记]
c++·笔记·学习
湫ccc1 小时前
《Opencv》基础操作详解(3)
人工智能·opencv·计算机视觉
Jack_pirate1 小时前
深度学习中的特征到底是什么?
人工智能·深度学习
微凉的衣柜1 小时前
微软在AI时代的战略布局和挑战
人工智能·深度学习·microsoft
GocNeverGiveUp1 小时前
机器学习1-简单神经网络
人工智能·机器学习
Schwertlilien2 小时前
图像处理-Ch2-空间域的图像增强
人工智能
Web阿成2 小时前
3.学习webpack配置 尝试打包ts文件
前端·学习·webpack·typescript
雷神乐乐2 小时前
Spring学习(一)——Sping-XML
java·学习·spring
智慧化智能化数字化方案2 小时前
深入解读数据资产化实践指南(2024年)
大数据·人工智能·数据资产管理·数据资产入表·数据资产化实践指南