深度学习1:PyTorch张量tensor的基本使用

深度学习是一种机器学习方法,同时与人工智能研究的范畴。

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,[32200400])#32张200*400的图像
y= torch.randint(-2,6,[32400300])#32张400*300的图像
z=torch.dot(x,y)#32张200*300的图像

6.5 matmul()-多个维度矩阵相乘(多维)

x = torch.randint(0,6,[57200400])#5*7张200*400的图像
y= torch.randint(-2,6[57400300])#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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值