赞
踩
在学习深度学习前,我们首先需要搭建一个软件开发平台,我们使用的平台是Pytorch加OpenCV,因此我们需要先安装这两个包。
在终端输入pip install d21==0.17.5
问题:安装d21包报错Could not find a version that satisfies the requirement d21==0.17.5 (from versions: none)
解决方法:在该源中找不到指定版本,需要手动切换版本下载。pip install -i https://pypi.douban.com/simple/ d2l
打印hello world测试运行
在终端运行pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python==4.5.1.48
问题:安装报错
解决方法:opencv版本与python不对应,需要安装对应版本的opencv,直接运行pip install opencv-python即可
(这里是之前已安装过的)
运行如下代码测试
- import cv2
- img = cv2.imread('D:/test/QQ.png')
- if img is None:
- print('empty image')
- exit()
-
- cv2.namedWindow('image')
- cv2.imshow('image', img)
- cv2.waitKey()
- cv2.destroyAllWindows()
问题:vscode报错no module named cv2,导入cv2包失败
解决方法:选择正确的解释器,即opencv安装的python版本。
在终端运行pip install torch-1.9.0+cu111-cp38-cp38-win_amd64.wdl
问题:安装报错
解决方法:进入pytorch官网https://pytorch.org/选择合适版本安装
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu117
(以下为已安装pytorch后显示已安装)
运行如下代码测试
- import torch # 如正常则静默
-
- a = torch.Tensor([1.]) # 如正常则静默
-
- a.cuda() # 如正常则返回"tensor([ 1.], device='cuda:0')"
-
- from torch.backends import cudnn # 如正常则静默
-
- print(cudnn.is_acceptable(a.cuda())) # 如正常则返回 "True"
标量、向量、矩阵是我们在深度学习中会经常用到的数据结构,因此在开始学习前,我们需要首先掌握这三个数据结构的基本知识以及使用Tensor分别表示这三个数据结构以及对其的简单操作
- 标量用普通小写字母表示,使用tensor表示则为只有一个元素的张量,如torch.tensor(4.0)
- 向量用粗体小写字母表示,使用一维张量表示向量,向量长度只受机器内存限制,例torch.arange(2) ([0, 1, 2]),使用中括号访问向量中的元素,如x[1](1)
- 矩阵用粗体大写字母表示,为向量从一阶推广到二阶,用二维张量表示,如torch.arange(6).reshape(2, 3) ([0, 1, 2],[3, 4, 5]),矩阵的转置A.T
tensor基本机制和部分矩阵操作 :
- x = torch.arange(3, 6).view(1, 3)
- print(x)
- y = torch.arange(4, 9).view(5, 1)
- print(y)
- print(x + y)
两个不同形状的Tensor进行运算的时候如果满足一定条件则会触发广播机制, 使得两个Tensor变为相同的形状后再进行运算,这个条件是两个张量至少有一个张 量至少一个维度为1,剩下的维度还必须与另一个张量对应的维度相同,否则就无 法触发广播机制,运算会报错。
- # 创建一个2*3*4的矩阵
- A = torch.ones(2, 3, 4)
-
- print(A)
- # 在0轴上求和
- print(A.sum(axis = 0).size())
- # 在1轴上求和
- print(A.sum(axis = 1).size())
- # 在2轴上求和
- print(A.sum(axis = 2).size())
在0轴上求和则形状为(3,4)
在1轴上求和则形状为(2,4)
在2轴上求和则形状为(2,3)
即在哪个轴上求和则哪个轴消失,只剩剩下的轴
- # 创建5*2的矩阵,矩阵元素取值为0-9
- A = torch.arange(10, dtype = torch.float32).reshape(5, 2)
- # 创建5*1的矩阵,矩阵元素取值为2-6
- B = torch.arange(2, 7, dtype = torch.float32).reshape(5, 1)
-
- print(A)
-
- print(B)
-
- print(A / B)
- # 在1轴上求和
- print(A.sum(axis = 1))
- # 与原矩阵运算
- print(A / A.sum(axis = 1, keepdims=True))
-
- print(A / A.sum(axis = 1))
此代码最后一行运行会出现运行时错误The size of tensor a (2) must match the size of tensor b (5) at non-singleton dimension 1
出现这个错误的原因是A和A.sum(axis=1)的形状不匹配,而且不满足广播机制触发的条件(即两个张量中至少有一个张量的其中一个维度为1,
且另一个维度与另一个张量对应的维度相等),因此不能进行除运算,对A进行非降维求和即可实现A / A.sum(A / A.sum(axis = 1, keepdims=True)),如倒二行代码所示。
在深度学习中,我们经常使用梯度下降法来优化模型参数,因此需要经常计算梯度。但梯度计算非常繁琐,且手动计算非常容易出错,因此我们使用Pytorch来自动求梯度。
PyTorch提供的autograd包能够根据输入和前向传播过程自动构建计算图,并执行反向传播。
创建一个张量并设置requires_grad=True,它将开始自动跟踪在该张量上的所有操作,使用.backward()即可完成所有梯度的计算,梯度会累加进.grad属性中
AutoGrad自动求梯度
- # 创建4*4的以1填充的矩阵,并开启自动求梯度
- x = torch.ones(4, 4, requires_grad=True)
- y = x + 3
- z = y ** 3
- # 计算矩阵z的平均值(对z进行降维成标量,以进行求和)
- out = z.mean()
- # 反向传播
- out.backward()
- # 打印梯度
- print(x.grad)
设置requires_grad=True后,该张量的每次计算都会被跟踪,再使用backward()即可 完成所有梯度的计算。在with torch.no_grad():语句内的计算则不会被跟踪,使用detach 函数也可使其之后的计算不再被跟踪,此外直接修改张量的值(X.data也不会被跟踪)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。