深度学习是一种机器学习方法,同时与人工智能研究的范畴。
1. 深度学习的基础网络
深度学习在不同任务中构建不同的网络,可以根据基础神经网络的组合构成复杂的神经网络,以下为基础神经网络:
(1)全连接神经网络(FCNN):最常用的神经网络,通常用于数值拟合或者分类,又称分类网络
(2)卷积神经网络(CNN):最著名的神经网络,通常用于提取图像特征,其后往往跟着一个全连接网络,对提取的特征进行分类
(3)循环神经网络(RNN):通常用于处理序列数据,实例:早期的文本处理
(4)基于注意力机制的神经网络(Attention Mechanism-based Neural Network):基于Transformer发展而形成的网络模型
2. Pytorch的开发环境(PyCharm和PyTorch安装)
可见其他笔记,这里不过多赘述
3.张量基础
张量可以理解为是多维数组的推广,零阶张量是标量(一般数值),一阶张量是一维数组(向量),二阶张量是二维数组…
3.1 张量的定义
在pytorch中,通常用一维张量表示向量,二维张量表示矩阵或者一张单通道图像,三维张量表示一个特征图或者一张彩色图片,用四维张量表示一个批量的特征图或者彩色图像,用五维张量表示带时间或者视频的数据
#可以通过[[]]数中括号的个数来判断是几阶张量
import torch
x = torch.tensor(2)#0阶张量
x = torch.tensor([2,3])#1阶张量
x = torch.tensor([[2,3],[4,5]])#2阶张量
x = torch.tensor([[2,3,4],[4,5,6],[7,8,9]])#2阶张量
3.2 随机生成张量
x = torch.randn(a,b,c,d)#标准正态分布,均值为0,方差为1
x = torch.rand(a,b,c,d)#从[0,1)均匀分布中抽取一组随机数
x = torch.randint(a,b,[e,f,c,d])#指定范围[a,b)中的整数
3.3 张量的数据类型
print(x.dtype)#使用该属性输出x的数据类型
x = torch.tensor([2,3]) #int64
x = torch.Tensor([2,3]) #float32
x = torch.tensor([2,3.])#float32
x = torch.ByteTensor([2,3])#unit8
x = torch.CharTensor([2,3])#int8
x = torch.ShortTensor([2,3])#int16
x = torch.IntTensor([2,3])#int32
x = torch.LongTensor([2,3])#int64
x = torch.FloatTensor([2,3])#float32
x = torch.DoubleTensor([2,3])#float64
#float32的不同表达方式
x = torch.Tensor([2,3]#默认生成)
x = torch.FloatTensor([2,3])#显式声明
x = torch.tensor([2,3]),dtype=torch.float32)#语句声明数据
x = torch.tensor([2,3]).float()#通过定义转换
3.4 张量形状
形状为toch.Size([300,400])的张量可以表示为灰度图,高为300,宽为400;
形状为toch.Size([3,300,400])的张量可以表示为RGB图像,其中3为通道数
形状为toch.Size([32,3,300,400])的张量可以表示为批量图像,32为批量的大小(batch_size)
print(x.size())#使用该属性输出x的张量形状
3.5 张量切片
print(x[::,start:end:step,...])#第二维上,从start到end-1,每step取新值;其中“step”或者“:step”可以省略,默认step为1
print(x[x<=0])
3.6 全0全1张量
x1 = torch.zeros_like(x)
x1 = torch.ones_like(x)
4. 张量的数学函数
4.1 sum()–求和
print(x.sum())#求x中所有元素之和
print(x.sum(dim=a))#沿着第a+1维元素相加
print(sum(x,dim=a))#沿着第a+1维元素相加
4.2 min()和max()–求最小值和最大值
print(x.min())#求x中最小元素的值
print(x.min(dim=0))#求第1维上x最小值
print(min(x,dim=0))#求第1维上x最小值
print(x.min(dim=0)[0])#由最小值构成的张量
print(x.min(dim=0)[1])#由最小值索引构成的张量
4.3 mean()和sqrt()–求平均值和开方运算
注意:1.mean()函数只对浮点数有效
print(x.float().mean())#求所有元素的平均值
print(x.float().mean(dim=0))#求第1维元素平均值
print(x.float().sqrt())#求所有元素进行逐个开方
4.4 argmax()和argmin()–返回最大(小)值的索引
注意:1.argmax()函数多用于处理分类结果,可以获取最可能类别的索引
print(x.argmax(dim=0))第1维上最大值索引构成的张量
4.5 to()方法
将张量转移到指定的设备上(GPU/CPU)
x.to('cuda')
x.to('cpu')
4.6 item()函数
对于只有一个元素的张量,提取元素值,转为一般数值
x = torch.tensor([[[2]]])
5. 张量的变形
5.1 reshape()和view()方法–改变形状
x = torch.randint(0,6,[10,20])#10*20
x1 = x.reshape(10,4,5)#10*4*5
x1 = x.view(10,4,5)#10*4*5
#在reshape()中,使用参数-1,可以自动计算维度
x1 = x.reshape(1,-1)
5.2 unsqueeze()和squeeze()–升维和降维
注意:1.方法用于张量增加(减去)一个长度为1的维
x = torch.randint(0,6,[10,20])#10*20
x1 = x.unsqueeze(0)#1*10*20
x1 = x.squeeze(0)#20
5.3 transpose()和t()和permute()函数–转置
注意:1.t()只能用于2阶张量
#transpose()--只罗列交换维度
x = torch.randint(0,6,[2,4,6,8])#2*4*6*8
x1 = x.transpose(0,3)#交换第1维和第4维#8*4*6*2
#t()--只用于2维交换维度
x = torch.randint(0,6,[2,4])#2*4
x1 = x.t()#4*2
#permute()--罗列所有的维度
x1 = x.permute(3,1,2,0)
6. 张量的常用运算
6.1 张量基本数学运算
x = torch.randint(0,6,[2,4])
y = 3
print(x+y)
6.2 dot()-点积运算(1维)
注意:1.用于实现两个同等长度的1维张量的点积运算(元素相乘,再求和)
x = torch.randint(0,6,[4])
y= torch.randint(-2,6,[4])
z=torch.dot(x,y)
6.3 mm()-矩阵相乘(2维)
x = torch.randint(0,6,[2,3])#2*3
y= torch.randint(-2,6,[3,4])#3*2
z=torch.dot(x,y)#2*2
6.4 bmm()-批量矩阵相乘(3维)
注意:1.batch_size必须相等;2.矩阵相乘
x = torch.randint(0,6,[32,200,400])#32张200*400的图像
y= torch.randint(-2,6,[32,400,300])#32张400*300的图像
z=torch.dot(x,y)#32张200*300的图像
6.5 matmul()-多个维度矩阵相乘(多维)
x = torch.randint(0,6,[5,7,200,400])#5*7张200*400的图像
y= torch.randint(-2,6[5,7,400,300])#5*7张400*300的图像
z=torch.dot(x,y)#5*7张200*300的图像
6.6 常用数学函数
y = torch.round(x)#四舍五入
y = torch.exp(x)#e的x次方
y = torch.log(x)#ln(x)
y = torch.log10(x)#lg(x)
y = torch.pow(x,2)#x的2次幂
6.7 张量的广播机制
将一个数据复制为多个数据,进而支持不同形状的两个张量进行运算
x = torch.randint(1,5,[3,1])#3*1 eg:([[3],[2],[3]])-->([[3,3,3,3],[2,2,2,2],[3,3,3,3]])
y = torch.randint(1,5,[1,4])#1*4
print(x+y)#3
6.8 张量与其他对象转换
#张量转数组
a = [[4,1,0],[0,4,2]]
a = np.array(a)
b = torch.tensor(a)
b = torch.from_numpy(a)
#数组转张量
x = torch.randint(1,5,[3,1])
a = np.array(x)
b = x.numpy(a)
#张量转列表
x = torch.randint(1,5,[3,1])
print(x.tolist())
#图片转张量(to_pil——image())
img = Image.open(img_path).convert('RGB')#图片转rgb
img1 = np.array(img)#rgb转数组
img1 = torch.ByteTensor(img1)#数组转张量
img2 = to_pil_image(np.array(img1),mode='RGB')#张量转pil图像
6.9 cat()-张量的拼接
x1 = torch.randint(1,5,[3,1])#3*1
x2 = torch.randint(1,5,[3,2])#3*2
x = torch.cat([x1,x2],dim=1)#3*3