【学习AI-相关路程-mnist手写数字分类-python-硬件:jetson orin NX-自我学习AI-基础知识铺垫-遇到问题(1) 】
- 1、前言
- 2、先行了解
-
-
- [(1)学习基础知识-了解jetson orin nx 设备](#(1)学习基础知识-了解jetson orin nx 设备)
- (2)学习python&AI的相关知识
- (3)了解mnist相关资料&数据集
- (4)百花争鸣-更优的方案
- (5)做这件事的流程
- (6)环境配置
-
- 3、应用相关
- 4、数学部分&原理部分
-
-
-
- [1. 结构组成](#1. 结构组成)
- [2. 关键特点](#2. 关键特点)
- [3. 学习过程](#3. 学习过程)
- [4. 训练目标](#4. 训练目标)
- [5. 优缺点](#5. 优缺点)
-
-
- [5、问题描述:module 'torch' has no attribut '_six'](#5、问题描述:module 'torch' has no attribut '_six')
- 6、发现问题过程:预测模型总是相同数字。
- 7、细节补充
-
- [1、尝试手动添加 _six.py文件](#1、尝试手动添加 _six.py文件)
-
- [方案 1:手动添加 `_six.py` 文件](#方案 1:手动添加
_six.py
文件) - [方案 2:降级 `torch` 和 `torchvision` 版本](#方案 2:降级
torch
和torchvision
版本) -
- [1. 卸载现有的 `torch` 和 `torchvision`](#1. 卸载现有的
torch
和torchvision
) - [2. 安装兼容的 `torch` 和 `torchvision` 版本](#2. 安装兼容的
torch
和torchvision
版本)
- [1. 卸载现有的 `torch` 和 `torchvision`](#1. 卸载现有的
- [方案 3:修改 `torchvision` 源代码](#方案 3:修改
torchvision
源代码) - [方案 4:方案3的变体,增加或修改 `_six.py` 的原始内容](#方案 4:方案3的变体,增加或修改
_six.py
的原始内容)
- [方案 1:手动添加 `_six.py` 文件](#方案 1:手动添加
- 8、总结
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)领域,以下是一些建议,帮助有效地开始学习:
-
打好编程基础:
- Python是AI和机器学习领域最常用的编程语言。你可以从基本的语法开始,逐步学习高级概念。
- 熟悉常用的AI库和框架,如TensorFlow、PyTorch、scikit-learn等。
-
强化数学基础:
- 线性代数:理解矩阵、向量等概念,这对理解神经网络非常重要。
- 微积分:学习导数、积分等知识,帮助你理解优化算法。
- 概率与统计:掌握概率分布、统计推断等,应用于模型评估和数据分析。
-
学习机器学习基础:
- 了解监督学习、无监督学习和强化学习的基本概念。
- 学习常见的算法,如线性回归、逻辑回归、决策树、支持向量机等。
-
深入了解深度学习:
- 学习神经网络的原理和结构,包括前馈网络和反馈网络。
- 掌握卷积神经网络(CNN)、循环神经网络(RNN)、生成对抗网络(GAN)等。
-
实践操作:
- 使用TensorFlow 或PyTorch构建并训练模型。
- 在Kaggle等平台参与比赛,解决实际问题,积累经验。
-
利用在线资源和课程:
- Coursera:吴恩达的"机器学习"课程和"深度学习专项课程"。
- edX:提供MIT和哈佛的相关课程。
- Fast.ai:实用的深度学习课程,注重实践。
-
阅读经典书籍:
- 《机器学习》------周志华著
- 《深度学习》------Ian Goodfellow等著
- 《模式识别与机器学习》------Christopher M. Bishop著
-
关注行业动态:
- 订阅AI领域的博客、新闻和播客,如arXiv、Medium上的AI专栏等。
- 参加研讨会、线上线下的AI社区活动,扩展人脉。
-
制定学习计划:
- 设定短期和长期目标,规划学习路径。
- 定期复盘,调整学习策略。
-
动手项目:
- 从简单的项目开始,如手写数字识别、图像分类等。
- 尝试自己构思并实现一个完整的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)。
而且中文也能搜到很多资料。
(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)。以下是可能的原因和解决方案:
-
CUDA 和 cuDNN 版本不匹配:
- 原因:Jetson 平台上的 CUDA 和 cuDNN 版本需要与您的深度学习框架(如 TensorFlow、PyTorch)兼容。如果版本不匹配,可能会导致模型无法正确运行。
- 解决方案 :确保您安装的 CUDA 和 cuDNN 版本与所使用的深度学习框架兼容。可以参考 NVIDIA 的 JetPack SDK 文档,确认正确的版本组合。
-
TensorFlow/PyTorch 安装问题:
-
原因:在 Jetson Orin NX 上安装深度学习框架时,如果安装步骤不正确,可能导致框架功能异常。
-
解决方案:使用 NVIDIA 提供的预编译版本或官方指南进行安装。例如,使用以下命令安装适用于 Jetson 的 PyTorch:
bashsudo 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
-
-
模型保存和加载的问题:
- 原因:如果模型在其他平台上训练,然后在 Jetson Orin NX 上运行,可能由于序列化格式或兼容性问题,导致模型参数未正确加载。
- 解决方案:尝试在 Jetson Orin NX 上重新训练模型,或者确保模型保存和加载使用了相同的框架和版本。
-
数据预处理差异:
- 原因:在不同的平台上,数据加载和预处理方式可能有所不同,导致输入数据不正确。
- 解决方案:检查数据预处理代码,确保在 Jetson Orin NX 上的数据处理与原始环境一致。
-
GPU 计算能力和配置:
- 原因:Jetson 设备的计算能力与桌面 GPU 有所不同,可能需要调整模型或设置。
- 解决方案:确认代码中正确使用了 GPU,并且未超出设备的内存限制。可以通过减少批次大小(batch size)或简化模型来适应设备性能。
-
依赖库版本问题:
- 原因:某些依赖库(如 NumPy、SciPy)的版本可能与深度学习框架不兼容。
- 解决方案:检查并更新依赖库,确保其版本与所用框架兼容。建议使用虚拟环境来管理依赖关系。
-
性能模式设置:
-
原因:Jetson 设备可能默认处于省电模式,限制了 GPU 性能。
-
解决方案:使用以下命令将设备设置为最大性能模式:
bashsudo nvpmodel -m 0 sudo jetson_clocks
-
-
硬件资源不足:
- 原因:模型可能过于复杂,导致在嵌入式设备上无法正确运行。
- 解决方案:尝试使用更小的模型或进行模型压缩,如剪枝或量化。
-
浮点精度问题:
- 原因:Jetson 设备可能使用了 FP16 等低精度计算,导致精度下降。
- 解决方案:确保模型使用 FP32 精度,或者在模型代码中明确指定所需的精度模式。
-
检查日志和错误信息:
- 原因:运行过程中可能有警告或错误信息提示问题所在。
- 解决方案:查看控制台输出或日志文件,寻找异常信息。如有需要,添加更多的日志输出来调试。
建议的下一步行动:
- 运行官方示例代码:在 Jetson Orin NX 上运行 MNIST 的官方示例,验证环境和框架是否正常工作。
- 验证数据和标签:确保数据集加载正确,标签没有偏差或错误。
- 重现问题:尝试在简单的模型上重现问题,缩小问题范围。
- 更新系统和驱动 :使用
sudo apt update
和sudo apt upgrade
更新系统,确保所有软件都是最新的。 - 咨询社区和文档:参考 NVIDIA 官方论坛和文档,获取针对 Jetson Orin NX 的支持和建议。
7、细节补充
1、尝试手动添加 _six.py文件
方案 1:手动添加 _six.py
文件
这种方法是在现有 torch
2.0.0 环境中添加 _six.py
文件,来保持兼容性。
-
找到
_six.py
文件-
如果有一个旧版本的 PyTorch 环境,可以直接找到该文件。通常路径为:
<python_env>/lib/python3.x/site-packages/torch/_six.py
。 -
可以使用以下命令在系统中搜索这个文件:
bashfind / -name _six.py
-
-
将
_six.py
文件复制到当前 PyTorch 环境-
找到当前 PyTorch 2.0.0 安装的路径:
bashpython3 -c "import torch; print(torch.__file__)"
这会打印
torch
模块的路径,例如/home/user/.local/lib/python3.8/site-packages/torch/__init__.py
。 -
将
_six.py
文件复制到 PyTorch 模块路径中,例如:bashsudo cp /path/to/old/torch/_six.py /home/user/.local/lib/python3.8/site-packages/torch/
-
方案 2:降级 torch
和 torchvision
版本
将 torch
和 torchvision
降级到 2.0.0 之前的版本。这种方式更为安全和稳定,因为手动添加文件可能会导致其他兼容性问题。
1. 卸载现有的 torch
和 torchvision
bash
pip uninstall torch torchvision
2. 安装兼容的 torch
和 torchvision
版本
-
如果是 CPU 版本
bashpip install torch==1.7.1 torchvision==0.8.2 -f https://download.pytorch.org/whl/torch_stable.html
-
如果是 Jetson ARM 版本
下载合适的
.whl
文件,并手动安装。由于 Jetson Orin NX 的 CUDA 环境支持,可以尝试安装兼容 Jetson 的较低版本:-
PyTorch 1.7.1 和 torchvision 0.8.2:
bashwget 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
文件:bashpip install torch-1.7.1-cp38-cp38-linux_aarch64.whl pip install torchvision-0.8.2-cp38-cp38-linux_aarch64.whl
-
-
安装完成后测试版本
bashpython3 -c "import torch; print(torch.__version__); import torchvision; print(torchvision.__version__)"
方案 3:修改 torchvision
源代码
如果有能力修改源代码,可以将 torchvision
中引用 _six.py
的地方改为新的实现方式。
- 找到报错的文件
datasets/mnist.py
中torch._six
的引用。 - 替换为 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 目录
-
将上述内容保存为
_six.py
文件。 -
找到当前 PyTorch 安装的路径(可以通过以下命令获取):
bashpython3 -c "import torch; print(torch.__file__)"
假设输出路径为
/home/username/.local/lib/python3.8/site-packages/torch
。 -
将
_six.py
文件放入上述torch
安装目录中:bashcp _six.py /home/username/.local/lib/python3.8/site-packages/torch/
手动添加 _six.py
文件并修改 torchvision
中的引用可以解决临时兼容性问题,但不建议长期使用。如果可能,推荐尽量使用兼容的 torch
和 torchvision
版本。
8、总结
写文章就是思考的过程总结,讲自己做的过程和查找的问题进修整理,也是一种重新思考的时候,自己这里说了很多自己遇到的问题,对于新手我认为就会这样,我们需要知道很多事情,铺垫很多,才能做好这件事。