深度学习基础概念(一):Tensor
一、Tensor概述:
1.概念
Tensor也叫张量,是由相同类型的元素组成的多维矩阵。在PyTorch中会将数据封装成张量,便于GPU的加速运行。
2.特点
动态计算图:PyTorch 支持动态计算图,这意味着在每一次前向传播时,计算图是即时创建的。
GPU 支持:PyTorch 张量可以通过
.to('cuda')移动到 GPU 上进行加速计算。自动微分:通过
autograd模块,PyTorch 可以自动计算张量运算的梯度,这对深度学习中的反向传播算法非常重要。
3.数据类型
数据类型:浮点型、整数、布尔,浮点数和整数又分为8位、16位、32位、64位
二、 Tensor的创建:
1.基本创建方式
1.通过tensor():可以指定数据的dtype,device
2.通过Tensor():构造函数,该API根据形状创建张量,默认类型为float32
示例:
import torch
import numpy
def test1():
#1.用标量创建(给出一个具体的数字)
t1 = torch.tensor(5)
#2.用numpy的随机数创建,可以自行设定随机数种子
torch.manual_seed(1)
t2 = torch.tensor(np.random.randn(3,5))
#3.给出具体的一个列表,给出具体的类型和设备
t3 = torch.tensor([]1,2,3,4],dtype=torch.int32,device='cuda')
#4.给出形状,Tensor根据形状创建
t4 = torch.Tensor(3.2)
#5用arange创建
t5 = torch.arange(1,10,2)
#linspace创建
t6= totch.linspace(1,10,5)
torch.Tensor与torch.tensor的区别:

2.tensor切换设备的三种方式
1.tensor创建时指定device属性
2.使用to()方法转换设备
3.使用cuda()切换CUDA,如果要切到CPU,则使用cpu()
示例:
#1.指定device
t1 = torch.tensor([]1,2,3,4],dtype=torch.int32,device='cuda')
#2.to方法t2 = torch.tensor([1,2,3,4,5,6])
t2 = t2.to("cuda")
#cuda()方法
t2 = t2.cuda()
三、Tensor的操作
1.torch与numpy的转换
torch -> numpy :使用numpy()方法,该方法为浅拷贝,
numpy -> torch : 使用tensor()方法,该方法为深拷贝,也可用from_numpy():为浅拷贝
示例:
import torch
def test2:
t1 = torch.tensor([1,2,3,4,5])
#转换为numpy
n1 = t1.numpy()
#转换为torch
n2 = torch.tensor(t1)
n3 = torch.from_numpy(n1)
2.item()方法
当tensor中只有一个元素时,可以使用该方法获取元素,有多个元素时,使用该方法报错
示例;
#一个元素时
t1 = torch.tensor([18])
print(t1.item())
输出为18
#当多个元素时
t1 = torch.tensor([19,20])
print(t1.item())
程序报错:
3. tensor的运算
1.add,sub,mul,div等,计算结果时不影响原数据
2.add_,sub_.mul_,div_,计算结果时会影响原数据
示例:
tensor.manual_seed(0)
t1 = tensor.randint(1,10,(2,3))
print('原数据',t1)
print(‘add运算后’,t1.add(1))
print('原数据',t1)
print('_add运算后',t1.add_(1))
两个相同维度的矩阵,对应位置元素相乘,得到一个新的矩阵,这种方式称:阿达玛积
Cij = Aij * Bij (i表示行,j表示列)
运算符号;mul()或*
矩阵运算:矩阵(m,p)与矩阵(q,n)想乘, 得到(m,n)矩阵
运算符号:matmul()
4.tensor 形状的转换
1.reshape方法
可以用于将张量转换为不同的形状,但要确保转换后的形状与原形状具有相同的元素数量。
示例:
data = torch.randint(0, 10, (4, 3))
print(data)
# 1. 使用reshape改变形状
data = data.reshape(2, 2, 3)
print(data)# 2. 使用-1表示自动计算
data = data.reshape(2, -1)
print(data)
2. view方法
view进行形状变换的要求:
张量在内存中是连续的;
返回的是原始张量视图,不重新分配内存,效率更高;
如果张量在内存中不连续,view 将无法执行,并抛出错误。
内存的连续性:
张量的内存布局决定了其元素在内存中的存储顺序。对于多维张量,内存布局通常按照最后一个维度优先的顺序存储,即先存列,后存行。例如,对于一个二维张量 A,其形状为 (m, n),其内存布局是先存储第 0 行的所有列元素,然后是第 1 行的所有列元素,依此类推。
示例:
def test1():
t1 = torch.tensor([[1,2,3],[4,5,6]])
print(t1.is_contiguous())
t2 = t1.view(3,2)
print(t2.is_contiguous())
t3 = t1.t()
print(t3)
print(t3.is_contiguous())
3.transpose与permute方法
transpose:只能交换张量的两个维度
permute(input,dims),张量的维度转换,input要转换的张量,dims:是一个维度顺序
重排后张量可能是非连续的
示例:
t1 = torch.randint(1,10,(3,4,5))
print(t1)
t2 = torch.transpose(t1,0,1)
print("transpose维度转换:",t2)
t3 = torch.permute(t1,(1,2,0))
print(''permute维度转换:",t3)
print(t3.shape)
print(t3.is_contiguous())


DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐






所有评论(0)