在学习深度学习前,我们首先需要搭建一个软件开发平台,我们使用的平台是Pytorch加OpenCV,因此我们需要先安装这两个包。
一. 安装Pytorch以及OpenCV
1. 安装d2l包,方便调取《动手学深度学习》中经常使用的函数和类
在终端输入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
2. 安装vscode并添加python、Jupyter等扩展插件,选择合适的python解释器(这里没有使用虚拟环境,因此不用安装anaconda)
3. 安装使用Juypter,按ctrl+shift+p,在界面上输入>create,选择Create: 新Jupyter Notebook,然后就进入到notebook中
打印hello world测试运行
4. 安装opencv
在终端运行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版本。
5. 安装pytorch
在终端运行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分别表示这三个数据结构以及对其的简单操作
- 标量用普通小写字母表示,使用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基本机制和部分矩阵操作 :
1. 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. 矩阵求和运算
# 创建一个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)
即在哪个轴上求和则哪个轴消失,只剩剩下的轴
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也不会被跟踪)