一、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())

Logo

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

更多推荐