初探Linux环境配置与pyTorch学习

初探Linux环境配置与pyTorch学习

文章目录

  • 初探Linux环境配置与pyTorch学习
    • 初探Linux
      • Install vmware and ubuntu
      • Swap sourses and typewriting
      • Learn basic command
    • Learn git
      • Learn .gitignore and git lfs
        • gitignore
          • 忽略规则优先级
          • 忽略规则匹配语法
          • 实例
          • 不生效情况
      • git lfs
        • lfs作用
        • lfs使用
        • lfs实际应用
    • G++与Vim
      • the commad of g++
      • the error
      • learn vim
      • use header files and print helloworld
    • Opencv
      • install opencv
      • learn to code to invoke the webcam
    • Anaconda and Pytorch
      • install anaconda
      • create virtul environment
    • Ardupilot Sitl 仿真环境
      • 搭建开发环境
      • 启动仿真环境(map,console
    • Yolo算法
      • install yolov5 code and pretrained model
      • install dataset and weight files
    • 双系统Ubuntu与重装
      • install ubuntu
      • 卸载与重装
      • Install Nvidia and cuda
    • 神经网络
      • 神经元模型
        • 结构
        • 效果
      • 单层神经网络(感知器
      • 双层神经网络(多层感知器
        • 结构
        • 训练
      • 多层神经网络(深度学习
    • Pytorch
      • torch
        • Tensor的概念
        • Tensor的创建
        • Tensor 的运算
        • dataloader类
      • torchvision
        • 数据调用
        • Torchvision.transforms
          • 数据类型变换
          • 图像变换操作
          • 多变换操作组合
      • 卷积神经网络 Torch.nn
      • Torch.autograd
        • 相关概念
        • 基本使用
    • 手写mnist数据集
      • code
    • 参考文献

初探Linux

Install vmware and ubuntu

Swap sourses and typewriting

Learn basic command

  • ls :列出当前目录文件(不包括隐含文件)

  • ls -a :列出当前目录文件(包括隐含文件)

  • ls -l :列出当前目录下文件的详细信息

  • cd … :回当前目录的上一级目录

  • cd - 回上一次所在的目录

  • cd ~ 或 cd :回当前用户的宿主目录

  • mkdir : 目录名 创建一个目录

  • rm :文件名 文件名 删除一个文件或多个文件

  • rm -rf :非空目录名 删除一个非空目录下的一切

  • fdisk fdisk -l :查看系统分区信息

  • fdisk fdisk /dev/sdb :为一块新的SCSI硬盘进行分区

  • chown chown root /home :把/home的属主改成root用户

  • chgrp chgrp root /home :把/home的属组改成root组

  • Useradd :创建一个新的用户

  • Groupadd :组名 创建一个新的组

  • Passwd :用户名 为用户创建密码

  • Passwd -d:用户名 删除用户密码也能登陆

  • Passwd -S:用户名 查询账号密码

  • Usermod -l :新用户名 老用户名 为用户改名

  • Userdel–r :用户名 删除用户一切

Learn git

codemeaning
mkdir test创建目录
cd test进入目录
git init初始化仓库
ls ;ls -ah查看目录
touch test.c新建项目
add添加到缓存
commit -m “words”提交到库
log提交历史
status查看仓库状态
checkout – file回到最近修改状态
rm ;rm -rf file删除
reset+checkout恢复文件
checkout -b dev创建分支+切换
merge合并
branch -a查看分支
branch -D删除分支
branch -m修改分支名
clone远程仓库关联到本地
push origin branch修改提交
fetch origin branch下载远程代码到本地
git merge origin/branch远程与本地合并

Learn .gitignore and git lfs

gitignore
忽略规则优先级

1. 从命令行中读取可用的忽略规则

2. 当前目录定义的规则

3. 父级目录定义的规则,依次递推

4. $GIT_DIR/info/exclude 文件中定义的规则

5. core.excludesfile中定义的全局规则

忽略规则匹配语法
  • 空格不匹配任意文件,可作为分隔符,可用反斜杠转义

  • 开头的文件标识 注释,可以使用反斜杠进行转义

  • ! 开头的模式标识否定,该文件将会再次被包含,如果排除了该文件的父级目录,则使用 ! 也不会再次被包含。可以使用反斜杠进行转义

  • / 结束的模式只匹配文件夹以及在该文件夹路径下的内容,但是不匹配该文件

  • / 开始的模式匹配项目跟目录

  • 如果一个模式不包含斜杠,则它匹配相对于当前 .gitignore 文件路径的内容,如果该模式不在 .gitignore 文件中,则相对于项目根目录

  • ** 匹配多级目录,可在开始,中间,结束

  • ?通用匹配单个字符

  • * 通用匹配零个或多个字符

  • [] 通用匹配单个字符列表

实例

bin/: 忽略当前路径下的bin文件夹,该文件夹下的所有内容都会被忽略,不忽略 bin 文件

/bin: 忽略根目录下的bin文件

/*.c: 忽略 cat.c,不忽略 build/cat.c

debug/*.obj: 忽略 debug/io.obj,不忽略 debug/common/io.obj 和 tools/debug/io.obj

**/foo: 忽略/foo, a/foo, a/b/foo等

a/**/b: 忽略a/b, a/x/b, a/x/y/b等

!/bin/run.sh: 不忽略 bin 目录下的 run.sh 文件

*.log: 忽略所有 .log 文件

config.php: 忽略当前路径的 config.php 文件

不生效情况

1. 已纳入版本管理

solve:删除本地缓存

```

git rm -r --cached .

git add .

git commit -m ‘update .gitignore’

```

2. 添加文件被忽略

- 强制添加

```

$ git add -f App.class

```

- 检查gitignore

```

$ git check-ignore -v filename.

```

git lfs

lfs作用

Large File Storge,可以帮助我们管理比较大的文件,git lfs对于需要追踪的文件只会保存一个指向该文件的指针,而不是在本地仓库中保存每次提交的版本,节省了本地磁盘空间,缩小了git的传输时间。

它通过将大文件存储在Git仓库之外的服务器上,并使用指向这些文件的指针来跟踪和管理这些文件。这样可以避免Git仓库变得庞大和不稳定。Git LFS支持大文件的版本控制和协作,使得与大型二进制文件(如图像、音频和视频文件等)一起使用Git变得更加灵活和高效。

lfs使用

- 跟踪大文件

```

git lfs track “*.zip”

```

- 提交前审核

~~~

git lfs ls-files

~~~

lfs实际应用

- 加快克隆速度

如果克隆包含大量 LFS 文件的仓库,显式使用 git lfs clone 命令可提供更好的性能

- 加快拉取速度

git lfs pull 命令批量下载 Git LFS 文件

G++与Vim

the commad of g++

commandmeaning
-o outputfile file.cpp编译为可执行文件
-c编译为对象文件
-o outputfile file1.o file2.o链接对象文件

对象文件和可执行文件的主要区别在于链接的程度:对象文件包含了部分链接的代码,而可执行文件包含了完全链接的代码。在一些大型项目中,源代码可能被分割成多个文件,然后分别编译成对象文件,最后再链接成一个可执行文件。这样的做法可以提高编译的效率,因为当某个源文件被修改时,只需要重新编译那个文件,而不需要重新编译整个项目。

g++ -o test1 hello.cpp helloworld.cpp

g++ -c hello.cpp

g++ -c helloworld.cpp

g++ -o test2 hello.o helloworld.o

g++ -o test3 hello.o helloworld.cpp

g++ -o test4 hello.cpp //wrong

the error

  • question 1: unable to install g++(软件包有未依赖的关系)

  • solve :swap sources;

  • question 2 :unable to edit helloworld.cpp

  • solve :learn vim ( --,-- ; gedit is better )

  • question 3 :unable to compile and run

  • solve :learn g++ about linking cpp files

  • question 4 :push helloworld 文件夹到github 时 error: 源引用规格 helloworld 没有匹配

  • solve :创建本地仓库和分支没有add 文件

  • question 5:本地上传helloworld文件到远程github仓库后,本地修改readme上传git hub出现问题—> git pull 整合远程变更又出现问题—>偏离分支:当本地的分支落后于远程分支时,本地分支又自行修改项目文件生成了新的提交

  • solve : git config pull.rebase false # 合并 + git pull

    learn vim

commandmeaning
ESC命令模式
gg / G/ 5+G首行/末行/第五行
yy / p/ dd复制/粘贴/剪切
u / ctrl + r撤销/取消撤销
+i / +a编辑模式
:/ wq/ q!末行模式/保存退出/强制退出

use header files and print helloworld

 

Opencv

install opencv

1. install cmake

2. use gedit

3. install pkg-config

- question 1 : 装着装着虚拟机就死机了?

- solve : 强制重启,太智能了我直接执行下一个操作居然帮我帮上个死机没完成的操作自动执行

- question 2 : 检验时执行 pkg-config opencv --modversion 报错

- solve : 缺失了opencv.pc这个配置信息文件

手动创建opencv.pc

~~~

cd /usr/local/lib
sudo mkdir pkgconfig
cd pkgconfig
sudo touch opencv.pc

添加以下信息

prefix=/usr/local
exec_prefix=${prefix}
includedir=/usr/local/include
libdir=/usr/local/libName: OpenCV
Description: Open Source Computer Vision Library
Version: 4.4.0
Libs: -L${exec_prefix}/lib -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_dnn_objdetect -lopencv_dpm -lopencv_face -lopencv_photo -lopencv_freetype -lopencv_fuzzy -lopencv_hdf -lopencv_hfs -lopencv_img_hash -lopencv_line_descriptor -lopencv_optflow -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_surface_matching -lopencv_tracking -lopencv_datasets -lopencv_text -lopencv_dnn -lopencv_plot -lopencv_xfeatures2d -lopencv_shape -lopencv_video -lopencv_ml -lopencv_ximgproc -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_flann -lopencv_xobjdetect -lopencv_imgcodecs -lopencv_objdetect -lopencv_xphoto -lopencv_imgproc -lopencv_core
Libs.private: -ldl -lm -lpthread -lrt
Cflags: -I${includedir}
~~~
-	question 3:编译时出现 fatal error :opencv2/opencv.hpp:没有那个文件或目录
-	solve : 将/usr/local/include/opencv4/opencv2扔到/usr/local/include/下
-	question 4 :上面的 solve 没有 solve
-	quesiton ........
-	sovle :卸载
-	question 5 : 上面的 solve 没有solve

main error:

  • error 1 :检测opencv版本报错

  • solve :手动创建opencv.

  • error 2 : 编译fatal error :opencv2/opencv.hpp:没有那个文件或目录

  • solve :将opencv2文件夹链接到include文件夹下

 

sudo ln -s /usr/include/opencv4/opencv2 /usr/include/
  • error 3 :上述代码仍无法解决问题

  • solve :代码路径不准确

 

sudo ln -s /usr/local/include/opencv4/opencv2 /usr/local/include/
  • error 4 : 编译通过生成目标文件,不能生成链接文件 报错 no input files

  • solve :g++用法错误

    g++ -o webcam.o //wrong
    g++ webcam.o -o webcam //wright

ps:百度搜不到解决方案,还得是gpt。
这个错误通常是因为你没有在编译命令中指定要编译的源文件。例如,如果你想编译一个名为hello.cpp的源文件,你应该使用以下命令:

g++ hello.cpp -o hello

在这个命令中,hello.cpp是要编译的源文件,-o选项指定了输出文件的名称,hello是输出文件的名称。如果你在命令中没有指定要编译的源文件,编译器就会报“no input files”的错误。确保你在命令中指定了正确的源文件名,并且文件存在于当前工作目录中。

  • error 5 :g++用法正确后报错undefined reference to`cv::VideoCapture::VideoCapture(int, int)’

  • solve :链接时没有包含OpenCV库文件。要解决这个问题,需要在编译命令中包含OpenCV库文件

    g++ yourfile.cpp -o yourfile pkg-config --cflags --libs opencv

  • error 6 :成功编译成可执行文件,但运行时报错error while loading shared libraries: libopencv_highgui.so.3.4: cannot open shared object file: No such file or directory

  • solve :有几个库找不到,用locate定位这几个库

 

sudo apt install mlocate
locate libopencv_highgui.so.3.4

找到后添加路径

cd /etc/ld.so.conf.d
sudo vim opencv.conf    //加入路径
sudo ldconfig

learn to code to invoke the webcam

 

Anaconda and Pytorch

install anaconda

error :“conda”无法找到命令

solve :导入路径才能使用

sudo gedit ~/.bashrc

export PATH=“/home/用户名/anaconda3/bin:$PATH”

source ~/.bashrc

create virtul environment

commandmeaning
conda env list存在的虚拟环境
conda create -n your_env_name python=x.x创建虚拟环境
conda activate your_env_nam进入虚拟环境
conda deactivate env_name退出虚拟环境
conda remove -n your_env_name --all删除虚拟环境

Ardupilot Sitl 仿真环境

搭建开发环境

安装anaconda后再重启SITL仿真

  • error :再次无法打开consolo和map

  • solve :安装opencv-python,wxpython,matplotlib库

  • error :安装wxpython时报错

  • error: Could not build wheels for wxPython

TRY1 :创建python=3.8的虚拟环境安装//fail ——>

TRY2 :创建python=3.6的虚拟环境安装//fail

TRY3 :安装旧版本的wxpython//fail

TRY4 :创建python=3.9的虚拟环境安装//successful ——>

成功打开console和map

启动仿真环境(map,console

  • error :运行奇慢无比

Tools/environment_install/install-prereqs-ubuntu.sh-y

  • solve :挂着下一个晚上,第二天重下

  • error:Failed to load module

1. TRY 1 ://fail

sudo -H pip2 install --upgrade MAVProxy pymavlink future lxml

error :-H无法找到命令与目录

solve :在sudo命令中,-H标志是用来设置HOME环境变量为目标用户的家目录。这个标志是有效的,但是在某些情况下,可能会遇到"-H: 没有那个文件或目录"的错误。这通常是因为系统中的sudoers文件配置问题导致的。

如果遇到了这个问题,可能需要检查一下系统的sudoers文件配置。可以使用visudo命令来编辑sudoers文件,确保其中包含以下内容:

Defaults env_keep += “HOME” //failed

2. TRY 2 ://fail

sudo pip2 install --upgrade MAVProxy pymavlink future lxml

  • error :pip2无法找到命令与目录

  • solve :

sudo apt-get install python-pip

  • error: If executing pip with sudo, you may want sudo’s -H flag

sudo chown root /home/gonglai/.cache/pip/http

sudo chown root /home/gonglai/.cache/pip

  • error :Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade

- solve :

3. TRY 3 ://fail

From csdn:

python几个包未安装好,需要删除后重装

pip3 uninstall MAVProxy pymavlink future lxml

sudo -H pip2 install --upgrade MAVProxy pymavlink future lxml

4. TRY 4 ://fail

From csdn:

mavproxy未安装好

sudo apt-get install python3-dev python3-opencv python3-wxgtk4.0 python3-pip python3-matplotlib python3-lxml python-pygame

pip3 install PyYAML mavproxy --user

echo ‘export PATH=“$PATH:$HOME/.local/bin”’ >> ~/.bashrc

5. TRY 5 ://fail

From csdn:

更换python版本,旧版本的mavproxy貌似不支持python3

添加python2到索引,并设置python2为默认的python版本

sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1

sudo update-alternatives --config python

6. TRY 6 ://fail——>创建虚拟环境后需要重新安装依赖包

Tools/environment_install/install-prereqs-ubuntu.sh-y

创建虚拟环境

7. TRY 7 ://wrong choice

重装

成功

- Solve:

1. 创建python=3.9的虚拟环境

2. 安装依赖包

3. 找到缺少的python库 opencv-python wxpython matplotlib

  • error:运行几次后报错

运行`sim_vehicle.py --map --console`出现sim_vehicle.py无法找到文件与目录

Solve:

/Tools/autotest/sim_vehicle.py --frame singlecopter --map –console

Yolo算法

install yolov5 code and pretrained model

install dataset and weight files

1. 下载数据集

- 解压.gz文件报错:EOF tar: 归档文件中异常的 EOF

- solve:在windows下安装压缩为rar文件重新上传到网盘

2. 训练数据集

- 训练过程中killed

- solve:减小BATCH_SIZE ( 每epoch一次训练样本数量 )( 32——>8 );减小epoch数量 ( 100——>10 )

3.测试训练后的权重

 

双系统Ubuntu与重装

install ubuntu

• error 1: file /boot/vmlinuz-linus not found

• solve :以dd镜像模式写入U盘(推荐是iso镜像

• error 2 :Ubuntu系统开机异常:ACPI Error:AE_NOT_FOUND

• solve :——>显卡不能完全支持操作系统中包含的开源驱动程序:在linux那一行最后三个—换成nomodeset;按ctrl+x

• solve :——>开机f2进入bios ,关闭安全启动模式:Secure Boot:Disable ,关闭独显。

分区大小
boot/efi1G
swap两倍内存
/150-200G不少于100G
/home剩下所有

卸载与重装

删除Ubuntu启动引导项

1.Win + R 输入cmd打开终端,输入 diskpart 进入磁盘工具

2.输入 list disk 查看磁盘,输入 select disk 0

3.输入 list partition ,输入 select partition n (Windows EFI分区,一般为260M)

4.输入 assign letter=J(分配盘符)

5.管理员模式打开记事本

6.打开 J盘/EFI 文件夹,删除Ubuntu文件夹

Install Nvidia and cuda

 

神经网络

神经元模型

结构

- 神经元模型是一个包含输入,输出与计算功能的模型。输入可以类比为神经元的树突,而输出可以类比为神经元的轴突,计算则可以类比为细胞核。中间的箭头线。这些线称为“连接”。每个上有一个“权值”。

- 连接是神经元中最重要的东西。每一个连接上都有一个权重。一个神经网络的训练算法就是让权重的值调整到最佳,以使得整个网络的预测效果最好。

- 我们使用a来表示输入,用w来表示权值。一个表示连接的有向箭头可以这样理解:在初端,传递的信号大小仍然是a,端中间有加权参数w,经过这个加权后的信号会变成a*w,因此在连接的末端,信号的大小就变成了a*w。

- 在其他绘图模型里,有向箭头可能表示的是值的不变传递。而在神经元模型里,每个有向箭头表示的是值的加权传递。

- 神经元 ——>单元 / 节点

效果

神经元模型的使用可以这样理解:

我们有一个数据,称之为样本。样本有四个属性,其中三个属性已知,一个属性未知。我们需要做的就是通过三个已知属性预测未知属性。

具体办法就是使用神经元的公式进行计算。三个已知属性的值是a1,a2,a3,未知属性的值是z。z可以通过公式计算出来。

这里,已知的属性称之为特征,未知的属性称之为目标。假设特征与目标之间确实是线性关系,并且我们已经得到表示这个关系的权值w1,w2,w3。那么,我们就可以通过神经元模型预测新样本的目标。

单层神经网络(感知器

1. 两个层次 :输入 / 输出

2. 需要计算的层次 :计算层 ——>一个计算层

3. 产生效果:线性分类

4. 偏置节点:没有输入 ——常数

双层神经网络(多层感知器

结构

- 增加中间层 两层计算层

- 隐藏层的参数矩阵的作用就是使得数据的原始坐标空间从线性不可分,转换成了线性可分。

- g(W(1) * a(1) + b(1)) = a(2); g(W(2) * a(2) + b(2)) = z;

- 非线性分类任务

训练

- 损失:机器学习模型训练的目的,就是使得参数尽可能的与真实的模型逼近。具体做法是这样的。首先给所有参数赋上随机值。我们使用这些随机生成的参数值,来预测训练数据中的样本。样本的预测目标为yp,真实目标为y。那么,定义一个值loss,这个值称之为损失(loss),我们的目标就是使对所有训练数据的损失和尽可能的小。

- 如果将先前的神经网络预测的矩阵公式带入到yp中(因为有z=yp),那么我们可以把损失写为关于参数(parameter)的函数,这个函数称之为损失函数(loss function)。下面的问题就是求:如何优化参数,能够让损失函数的值最小。

- 此时这个问题就被转化为一个优化问题。一个常用方法就是高等数学中的求导,但是这里的问题由于参数不止一个,求导后计算导数等于0的运算量很大,所以一般来说解决这个优化问题使用的是梯度下降算法。梯度下降算法每次计算参数在当前的梯度,然后让参数向着梯度的反方向前进一段距离,不断重复,直到梯度接近零时截止。一般这个时候,所有的参数恰好达到使损失函数达到一个最低值的状态。

- 在神经网络模型中,由于结构复杂,每次计算梯度的代价很大。因此还需要使用反向传播算法。反向传播算法是利用了神经网络的结构进行的计算。不一次计算所有参数的梯度,而是从后往前。首先计算输出层的梯度,然后是第二个参数矩阵的梯度,接着是中间层的梯度,再然后是第一个参数矩阵的梯度,最后是输入层的梯度。计算结束以后,所要的两个参数矩阵的梯度就都有了。

- 优化问题只是训练中的一个部分。机器学习问题之所以称为学习问题,而不是优化问题,就是因为它不仅要求数据在训练集上求得一个较小的误差,在测试集上也要表现好。因为模型最终是要部署到没有见过训练数据的真实场景。提升模型在测试集上的预测效果的主题叫做泛化(generalization),相关方法被称作正则化(regularization)。神经网络中常用的泛化技术有权重衰减等。

多层神经网络(深度学习

 

Pytorch

torch

Tensor的概念

张量 ,最基础的运算单位 ,一个多维矩阵,一个可以运行在gpu上的多维数据

Tensor的创建

1. torch.FloatTensor(2,3) / torch.FloatTensor([2,3,4,5])

2. torch.randn(2,3) //2*3随机数

3. torch.range(1,10,2) ——> tensor([1,3,5,7,9])

4. torch.zeros/ones/empty ——>全为0/全为1/定义大小的空tensor

5. 从NumPy数组创建

import numpy as np

numpy_array = np.array([1, 2, 3])

tensor_from_numpy = torch.from_numpy(numpy_array)

Tensor 的运算

1. torch.abs/add/div/pow ——>绝对值/求和/求商/求幂

2. torch.clamp(变量,上边界,下边界)

3. torch.mm/mv ——>矩阵相乘/与矩阵*向量 //一维向量默认为列向量

4. .T 转置矩阵

  1. torch数据读取

    1. dataset类
  • 自定义数据集

import torch

from torch.utils.data import Dataset

# 自定义一个名称为MyDataset的数据集(继承pytorch内置的Dataset类)

class MyDataset(Dataset):

# 重写构造函数(输入2个tensor类型的参数:数据/数据集合,数据对应的标签/集合)

def __init__(self, data_tensor, target_tensor):

self.data_tensor = data_tensor

self.target_tensor = target_tensor

# 重写len方法:返回数据集大小

def __len__(self):

return self.data_tensor.size(0) # 一般情况输进来的数据都是集合

# 上重写getitem方法:基于索引,返回对应的数据及其标签,组合成1个元组返回

def __getitem__(self, index):

return self.data_tensor[index], self.target_tensor[index]

  • 调用数据集

# 生成数据集和标签集 (数据元素长度=标签元素长度)

data_tensor = torch.randn(10, 3) # 10行3列数据,可以理解为10个元素,每个元素个一维的3个元素列表

target_tensor = torch.randint(2, (10,)) # 标签是0或1的10个元素 # 对应语法:torch.randint(low, high, size)

# 将数据封装成自定义数据集的Dataset

my_dataset = MyDataset(data_tensor, target_tensor)

# 调用方法:查看数据集大小

print(‘Dataset size:’, len(my_dataset))

# 使用索引调用数据

print('tensor_data[0]: ', my_dataset[0])

dataloader类

from torch.utils.data import DataLoader

tensor_dataloader = DataLoader(dataset=xxx, # 传入的数据集, 必须参数,必须是Dataset 类型

batch_size=x, # int 类型,每个 batch 有多少个样本

shuffle=x, # bool 类型,在每个 epoch 开始的时候,是否对数据进行重新打乱;

num_workers=x) # int 类型,加载数据的进程数,0 意味着所有的数据都会被加载进主进程,默认为 0

torchvision

数据调用

Torchvision 库就是常用数据集 + 常见网络模型 + 常用图像处理方法

torchvision.datasets所支持的所有数据集,它都内置了相应的数据集接口

# 以MNIST为例

import torchvision

mnist_dataset = torchvision.datasets.MNIST(root=‘./data’, //指定保存数据集位置

train=True, //是否加载训练集数据

transform=None, //图像预处理

target_transform=None,//图像标签预处理

download=True//True 自动下载)

Torchvision.transforms
数据类型变换

- .ToTensor() ——>将 PIL.Image 或 Numpy.ndarray 数据转化为Tensor格式

- .ToPILImage(mode=()) ——>将 Tensor 或 Numpy.ndarray 格式的数据转化为 PIL.Image ;mode=none :输入数据维度1/2/3/4 ——>数据类型/LA/RGB/RGBA

图像变换操作

1. 对PIL.Image和 对Tensor都支持的变换操作

- Resize

torchvision.transforms.Resize(size, interpolation=2)(PIL Image对象/tensor对象) //size 若是 int整数 较短边匹配到size另一边按比例缩放

- .CenterCrop / .RandomCrop /.FiveCrop 中心剪裁 / 随机剪裁 / 从中心和四角剪裁

torchvision.transforms.CenterCrop(size)(PIL Image对象/tensor对象)

torchvision.transforms.RandomCrop(size, padding=None)(PIL Image对象/tensor对象)

torchvision.transforms.FiveCrop(size)(PIL Image对象/tensor对象)

- RandomHorizontalFlip / RandomVerticalFlip 以某概率随机水平翻转图像和某概率随机垂直翻转图像

torchvision.transforms.RandomHorizontalFlip(p=0.5)(PIL Image对象/tensor对象)

2. 仅针对Tensor的操作

- 标准化

1. 标准化是指每一个数据点减去所在通道的平均值,再除以所在通道的标准差

2. 三维数据的前2维,可以说是长宽(面积大小),第三维习惯称之为通道

3. 图像数据的通道指的是图像在不同颜色通道上的信息。在RGB图像中,通常有三个通道,分别代表红色(R)、绿色(G)和蓝色(B)。每个通道包含了图像在对应颜色上的信息,可以表示图像中不同颜色的亮度和色彩。在灰度图像中只有一个通道,代表了图像的亮度信息。

transforms.normalize(mean_vals, std_vals,inplace=False)

output = (input - mean) / std ;

mean:各通道的均值;

std:各通道的标准差;

inplace:是否原地操作

例:

from PIL import Image

from torchvision import transforms

# 原图

orig_img = Image.open(‘TP02.jpg’)

display(orig_img)

# 图像转化为Tensor

img_tensor = transforms.ToTensor()(orig_img)

# 标准化

# 定义标准化操作

# norm_oper = transforms.Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5)) # RGB三通道,所以mean和std都是3个值

tensor_norm = transforms.Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5))(img_tensor)

# 再把标准化后的Tensor转化为图像

img_norm = transforms.ToPILImage()(tensor_norm)

display(img_norm)

多变换操作组合

compose 类

torchvision.transforms.Compose(transforms)

卷积神经网络 Torch.nn

Torch.autograd

相关概念

- 在训练模型时,通常需要计算函数(通常是损失函数)相对于模型参数的导数或梯度。PyTorch中的autograd包提供了自动微分功能,它能够自动地追踪对张量的所有操作并进行微分。

- 损失函数:损失函数的计算代表了模型预测值与真实标签之间的差异或者不一致程度。在训练模型时,我们希望模型的预测结果能够尽可能地接近真实标签,因此损失函数的计算可以帮助我们衡量模型预测的准确程度。

- 模型参数的导数或梯度:“模型参数的导数”和“梯度”指的是损失函数相对于模型参数的变化率。在训练模型时,我们希望找到使损失函数最小化的模型参数值。为了实现这一目标,我们需要了解损失函数对模型参数的变化敏感程度,即损失函数对模型参数的导数或梯度。通过计算导数或梯度,我们可以知道在当前模型参数值下,沿着哪个方向对参数进行微小调整可以使损失函数减小,从而引导模型向更优的参数值迭代。

基本使用

- requires_grad=True 追踪计算历史

- 1、使用 .detach(): 创建一个内容相同但不需要梯度的新张量。

x_detached = x.detach()

2、使用 torch.no_grad(): 在该上下文管理器中执行的所有操作都不会追踪梯度。

with torch.no_grad():y = x + 2

- .backward() 计算所有requires_grad=True的张量的梯度

手写mnist数据集

code

import torch

import torchvision

from torchvision import datasets,transforms

from torch.autograd import Variable

import numpy as np

import matplotlib.pyplot as plt

#torchvision.transforms: 常用的图片变换,例如裁剪、旋转等;

# transform=transforms.Compose(

# [transforms.ToTensor(),#将PILImage转换为张量

# transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))#将[0, 1]归一化到[-1, 1]

# #前面的(0.5,0.5,0.5) 是 R G B 三个通道上的均值, 后面(0.5, 0.5, 0.5)是三个通道的标准差

# ])

transform = transforms.Compose([

transforms.ToTensor(),

transforms.Lambda(lambda x: x.repeat(3,1,1)),

transforms.Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5))

]) # 修改的位置

data_train = datasets.MNIST(root=“./data/”,

transform=transform,

train = True,

download = True)

data_test = datasets.MNIST(root=“./data/”,

transform = transform,

train = False)

data_loader_train=torch.utils.data.DataLoader(dataset=data_train,

batch_size=64,#每个batch载入的图片数量,默认为1,这里设置为64

shuffle=True,

#num_workers=2#载入训练数据所需的子任务数

)

data_loader_test=torch.utils.data.DataLoader(dataset=data_test,

batch_size=64,

shuffle=True)

#num_workers=2)

#预览

#在尝试过多次之后,发现错误并不是这一句引发的,而是因为图片格式是灰度图只有一个channel,需要变成RGB图才可以,所以将其中一行做了修改:

images,labels = next(iter(data_loader_train))

# dataiter = iter(data_loader_train) #随机从训练数据中取一些数据

# images, labels = dataiter.next()

img = torchvision.utils.make_grid(images)

img = img.numpy().transpose(1,2,0)

std = [0.5,0.5,0.5]

mean = [0.5,0.5,0.5]

img = img*std+mean

print([labels[i] for i in range(64)])

plt.imshow(img)

import math

import torch

import torch.nn as nn

class Model(nn.Module):

def __init__(self):

super(Model, self).__init__()

#构建卷积层之后的全连接层以及分类器

self.conv1 = nn.Sequential(

nn.Conv2d(3,64,kernel_size=3,stride=1,padding=1),

nn.ReLU(),

nn.Conv2d(64,128,kernel_size=3,stride=1,padding=1),

nn.ReLU(),

nn.MaxPool2d(stride=2,kernel_size=2)

)

self.dense = torch.nn.Sequential(

nn.Linear(14*14*128,1024),

nn.ReLU(),

nn.Dropout(p=0.5),

nn.Linear(1024,10)

)

def forward(self,x):

x=self.conv1(x)

x=x.view(-1,14*14*128)

x=self.dense(x)

return x

model = Model()

cost = nn.CrossEntropyLoss()

optimizer = torch.optim.Adam(model.parameters())

print(model)

n_epochs = 5

for epoch in range(n_epochs):

running_loss = 0.0

running_correct = 0

print(“Epoch {}/{}”.format(epoch,n_epochs))

print(“-”*10)

for data in data_loader_train:

X_train,y_train = data

X_train,y_train = Variable(X_train),Variable(y_train)

outputs = model(X_train)

_,pred=torch.max(outputs.data,1)

optimizer.zero_grad()

loss = cost(outputs,y_train)

loss.backward()

optimizer.step()

running_loss += loss.data

running_correct += torch.sum(pred == y_train.data)

testing_correct = 0

for data in data_loader_test:

X_test,y_test = data

X_test,y_test = Variable(X_test),Variable(y_test)

outputs = model(X_test)

_,pred=torch.max(outputs.data,1)

testing_correct += torch.sum(pred == y_test.data)

print(“Loss is:{:4f},Train Accuracy is:{:.4f}%,Test Accuracy is:{:.4f}”.format(running_loss/len(data_train),100*running_correct/len(data_train)

,100*testing_correct/len(data_test)))

data_loader_test = torch.utils.data.DataLoader(dataset=data_test,

batch_size = 4,

shuffle = True)

X_test,y_test = next(iter(data_loader_test))

inputs = Variable(X_test)

pred = model(inputs)

_,pred = torch.max(pred,1)

print(“Predict Label is:”,[i for i in pred.data])

print(“Real Label is:”,[i for i in y_test])

img = torchvision.utils.make_grid(X_test)

img = img.numpy().transpose(1,2,0)

std = [0.5,0.5,0.5]

mean = [0.5,0.5,0.5]

img = img*std+mean

plt.imshow(img)

参考文献

[1]kevin小新. Ubuntu22.04系统安装软件、显卡驱动、cuda、cudnn、pytorch

[2]illikang. 神经网络——最易懂最清晰的一篇文章.

[3]Fakeoccupational. ubuntu 编译安装支持CUDA的OpenCV+其他opencv细节(需要特定版本gcc).

[4]Fakeoccupational. linux CUDAtoolkit+cudnn+tensorrt 的安装

[5]Vaccae. pyTorch入门(一)——Minist手写数据识别训练全连接网络.

[6]振华OPPO. Ubuntu20.04部署yolov5目标检测算法,无人车/无人机应用

[7]大豆子.Pixhawk无人机-ArduPilot 软件SITL仿真模拟飞行(SITL+MAVProxy)

[8]Alone-阮泽宇. 基于Linux(Ubuntu)系统下使用g++和Makefile编译C语言程序

[9]Bren-yi. Ubuntu下Python环境管理及切换.

[10]Akaxi-1. 基于Ubuntu下Yolov5的目标识别.

[11]机器想学习. 系统安装ubuntu 22.04 LTS(一步到位)

[12]写bug那些事. 狂肝两万字带你用pytorch搞深度学习.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/599439.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【每日面试题】精选java面试题之redis

Redis是什么?为什么要使用Redis? Redis是一个开源的高性能键值对存储数据库。它提供了多种数据结构,包括字符串、列表、集合、有序集合、哈希表等。Redis具有快速、可扩展、持久化、支持多种数据结构等特点,适用于缓存、消息队列…

Java/JDK下载安装与环境配置详解

本文将详细介绍如何下载、安装Java开发工具包(JDK)以及进行环境配置,以便在计算机上顺利运行Java程序。内容包括JDK的下载、安装、环境变量配置、验证安装与配置等。 一、Java简介 Java是一种广泛使用的计算机编程语言,具有跨平…

uni-app 中使用定时器和取消定时器

uni-app 中使用定时器和清除定时器 uni-app 中我们应该如何使用定时器呢?在结束后我们该如何让清除定时器? 下面我们就来分享一下吧。 1、 定义一个 data(){return{timer: null} } 2、设置定时器 //选择适合需求的定时器 this.timer setTimeout( ()…

Django 7 实现Web便签

一、效果图 二、会用到的知识 目录结构与URL路由注册request与response对象模板基础与模板继承ORM查询后台管理 三、实现步骤 1. terminal 输入 django-admin startapp the_10回车 2. 注册, 在 tutorial子文件夹settings.py INSTALLED_APPS 中括号添加 "the…

ffmpeg 5.0版本调试 ffmpeg 5.01 static版本

ffmpeg 5.0版本调试 写法:ffmpeg -rtsp_transport tcp -re -i rtsp://admin:BYTtest2019192.168.1.2:554/h264/ch1/main/av_stream -q 5 -f mpegts -fflags nobuffer -c:v mpeg1video -an -s 960x540 http://127.0.0.1:12345/demo本地写法 ffmpeg -timeout 5000000…

JRTClient打开谷歌

网站默认已经启动https访问,这时候JRTClient发布wss需要浏览器信任证书才能访问打印。为此在JRTClient内部发布了HTTPS服务,有时候浏览器信任的证书会丢失或者被清理掉,这时候需要手工信任下,当然用JRTBrowser就不用信任证书&…

数据库设计——DQL

D Q L \huge{DQL} DQL ⭐⭐⭐⭐⭐ DQL:数据库查询语言,用来查询数据库中的记录,非常的重要,对于数据库的操作修改相对来讲还是较少部分,绝大多数操作都是数据查询。 整体的语法结构: 基本查询 示例&#…

FPGA项目(14)——基于FPGA的数字秒表设计

1.功能设计 设计内容及要求: 1.秒表最大计时范围为99分59. 99秒 2.6位数码管显示,分辨率为0.01秒 3.具有清零、启动计时、暂停及继续计时等功能 4.控制操作按键不超过二个。 2.设计思路 所采用的时钟为50M,先对时钟进行分频,得到100HZ频率…

rtsp学习记录

目录 学习资料个人rtsp仓库文章视频标准 学习资料 个人rtsp仓库 文档,标准,文章等: https://gitee.com/fedorayang/rtsp.git 文章 百度百科RTSP: https://baike.baidu.com/item/RTSP/1276768?frge_ala 流媒体协议之RTSP详解: https://zhuanlan.zhihu.com/p/622028835?ut…

xtu oj 1374 连分数

题目描述 xb1a1b2a2b3a3⋯ 比如 n3,a11,a22,a33,b13,b22,b31时 x3122132113 给定n,ai,i1,2,…,n,请求x,并按最简方式表示x。 输入 第一个行是一个整数T(1≤T≤100),表示样例的个数。 以后每个样例的第一行为整数n(1≤n≤9); 第二行为n个整数&#…

联合union

//————联合&#xff1a;union 1.联合的定义 联合也是一种特殊的自定义类型 //#include<stdio.h> //union Un//Un为联合标签 //{ // int a; // char c; //}; //struct St //{ // int a; // int b; //}; //int main() //{ // union Un u; // printf(…

219.【2023年华为OD机试真题(C卷)】机械绘图(模拟-JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-机械绘图二.解题思路三.题解代码Python题解代码…

编程基础 - 初识Linux

编程基础 - 初识Linux 返回序言及专栏目录 文章目录 编程基础 - 初识Linux前言一、Linux发展简介二、现代Linux三、Linux系统各发行版小结 前言 为什么要学习Linux呢&#xff1f;我这Windows用得好好的&#xff0c;简单易用傻瓜式、用的人还超多&#xff01;但是我要告诉你的…

使用阿里云oss图片处理实现大尺寸图片加载优化

背景 为方便客户减少图片的处理&#xff0c;h5端需要加载20m的大尺寸图片 思路 格式转换为webp 图片分割 懒加载 编码实战 import React, { useEffect, useState } from react; import LazyLoad from react-lazyload; import { View, Image } from tarojs/components; imp…

Transformer模型中前置Norm与后置Norm的区别

主要介绍原始Transformer和Vision Transformer中的Norm层不同位置的区别。 文章目录 前言 不同位置的作用 总结 前言 在讨论Transformer模型和Vision Transformer (ViT)模型中归一化层位置的不同&#xff0c;我们首先需要理解归一化层&#xff08;Normalization&#xff09;在…

阿里云大模型「让照片跳舞」刷屏朋友圈,有哪些信息值得关注?

介绍 大家好&#xff0c;我分享聊聊阿里通义千问APP中全民舞王功能。 网络热舞结合AI视频&#xff0c;这是以后不用学习跳舞&#xff1f; 可以尝试下效果&#xff0c;一张图片生成视频。 APP快速使用 搜索下载通义千问APP 打开APP&#xff0c;选中一张照片来跳舞。 这里…

了解webpack

1 概念 webpack是一个模块打包工具&#xff0c;他将各种不同类型的文件最终都打包成.js、.css、.png、.jpg4个类型的静态资源。 2 特点 模块化开发 用webpack之前&#xff0c;项目都是在html中引入一个个js文件来开发&#xff1b;而在webpack中&#xff0c;一切皆模块&#xf…

我的2023年总结:往前看,别回头

2023年已经结束&#xff0c;我借此机会回顾一下我的2023年&#xff0c;同时也为2024年立好flag。 文章目录 2023印象深刻的实战经历技术成长与规划技术分享与交流CSDN博客参加百度apollo技术讨论会 深入学习Redis源码多彩的生活张杰演唱会《漫长的季节》&#xff1a;往前看&am…

bat批处理文件_输出内容到文本

文章目录 1、echo str > test.txt&#xff08;覆盖原有内容&#xff09;2、echo str >> test.txt&#xff08;不覆盖原有内容&#xff0c;追加&#xff09; 1、echo str > test.txt&#xff08;覆盖原有内容&#xff09; 2、echo str >> test.txt&#xff0…

js根据二进制流获取文件类型

js根据二进制流获取文件类型 在JavaScript中,可以使用FileReader对象来读取二进制数据并判断其文件类型。 下面是一段示例代码: function getFileType(file) {return new Promise((resolve, reject) => {const reader = new FileReader();// 当加载完成时调用onload事件处…