Pytorch实现张量的创建与使用方法

目录
  • 张量的创建及其基本类型
    • 1.张量(Tensor)函数创建方法
    • 2.张量的类型
    • 3.张量类型的转化
  • 张量的维度及形变
    • 1.创建高维张量
    • 2.张量的形变
      • 2.1 flatten拉平: 将任意维度张量转化为一维张量
      • 2.2 reshape方法: 任意变形
  • 特殊张量的创建方法
    • 1.特殊取值的张量的创建方法
    • 2.创建指定形状的数组
  • 张量和其他类型的转化方法
  • 张量的深拷贝

张量的创建及其基本类型

1.张量(Tensor)函数创建方法

张量最基本的创建方法和Numpy中创建Array的格式一样,都是创建函数(序列)的格式:张量创建函数: torch.tensor()

import torch 

# 通过列表创建张量
t = torch.tensor([1,2])

# 通过元组创建张量
t = torch.tensor((1,2))

import numpy as np

a = np.array((1,2))
# 通过数组创建张量
t1 = torch.tensor(a)
"""
输出结果为 tensor([1,2],dtype=torch.int32)
Point: 通过上述返回结果,我们发现张量也有dtype类型
"""

2.张量的类型

张量和数组类似,都有dtype方法,可返回张量类型.我们发现,整数型的数组默认创建int32(整型)类型,而张量默认创建int64(长整型)类型。相对的,创建浮点型数组时,张量默认是float32(单精度浮点型),而Array则是默认float64(双精度浮点型)。除了数值型张量,常用的常量类型还有布尔型张量,也就是构成张量的各个元素都是布尔类型的张量。

3.张量类型的转化

张量类型的隐式转化
和NumPy中的Array相同,当张量各元素属于不同类型时,系统会自动进行隐式转化。

# 为了保证数据精度,倾向于统一转化成数据精度比较高的
# 浮点型和整数型的隐式转化
torch.tensor([1.1,2])

# 布尔型和数值型的隐式转化
torch.tensor([True,2.0])

张量类型的转化方法

当然,我们还可以使用.float(),.int()等方法对张量类型进行转化。

t = torch.tensor([1,2])

# 转化为默认浮点型(32位)
t.float()

# 转化为双精度浮点型
t.double()

# 转化为16位整数
t.short()

张量的维度及形变

张量作为一组数的结构化表示,也同样有维度的概念,简单理解,向量就是一维的数组,而矩阵则是二维的数组,以此类推,在张量中,我们还可以定义更高维度的数组。当然,张量的高维数组和Numpy中的高维Array概念类似。

1.创建高维张量

用简单序列创建一维数组
包含"简单"元素的序列可创建一维数组。

t1 = torch([1,2])
t1 

# 使用ndim属性查看张量的维度
t1.ndim

# 使用shape查看形状
t1.shape

# 和size函数相同
t1.size()

注:和Numpy不同,PyTorch中的size方法返回结果和shape属性返回结果一致。

此外,还需要注意有两个常用的函数/方法,用来查看张量的形状。

# 返回有几个(N-1)维元素
len(t1)

# 返回总共有几个数
t1.numel()

用"序列"的"序列"创建二维数组
以此类推,我们还可以用形状相同的序列组成一个新的序列,进而将其转化为二维张量

# 用list的list创建二维数组
t2 = torch([[1,2],[3,4]])

零维张量
在PyTorch中,还有一类特殊的张量,被称为零维张量。该类型只包含一个元素,但又不是单独一个数。

t0 = torch.tensor([1])  # 这个仍然是一维张量
t0 = torch.tensor(1)    # 这个是零维张量

理解零维张量:
目前我们可以将零维张量视为拥有张量属性的单独的一个数。(例如: 张量可以存在GPU上,但Python的原生数值对象不行,但零维张量就可以,尽管是零维。)从学术名称来说,Python中单独的一个数是scalars(标量),而零维的张量则是tensor。

高维张量
一般来说,三维及三维以上的张量,我们就将其称为高维张量。当然,在高维张量中,最常见的还是三维张量,我们可以将其理解为二维数组或矩阵的集合。

a1 = np.array([[1,2,2],[3,4,4]])
a2 = np.array([[5,6,6],[7,8,8]])
t3 = torch.tensor([a1,a2])
t3.shape   # 结果为torch.Size([2,2,3])   包含两个两行三列的矩阵

当然,N维张量的创建方法,我们可以先创建M个N-1维的数组,然后将其拼成一个N维的张量。关于更高维度的张量,我们将在后续遇到时再进行讲解。在张量的学习过程中,三维张量就已经足够。

2.张量的形变

张量作为数字的结构化集合,其结构也是根据需求灵活调整的。

2.1 flatten拉平: 将任意维度张量转化为一维张量

t2 = torch.tensor([[1,2]
                  ,[3,4]])
t2.flatten()   # 把张量按行排列拉平

2.2 reshape方法: 任意变形

t1 = tensor([1.2])
# 转化为两行一列的张量
t1.reshape(2,1)
"""
结果为: tensor([[1],[2]])
注意: reshape过程中维度的变化: reshape转化后的维度由该方法输入的参数"个数"决定
"""

特殊张量的创建方法

在很多数值科学计算的过程中,都会创建一些特殊取值的张量,用于模拟特殊取值的矩阵,如全0矩阵,对角矩阵等.因此,PyTorch中也存在很多创建特殊张量的函数。

1.特殊取值的张量的创建方法

全0张量

torch.tensor([2,3])  # 创建全是0的两行三列的矩阵

注: 由于zeros就已经确定的张量元素的取值,因此该函数传入的参数实际上是决定了张量的形状

全1张量

torch.ones([2,3])

单位矩阵

# 返回五行五列的单位矩阵,对角线元素全为1
torch.eyes(5)

对角矩阵
略有特殊的是,在PyTorch中,需要利用一维张量取创建对焦矩阵。

t1 = torch.tensor([1,2])
torch.dialog(t1)
"""
输出结果为: tensor([[1,0],
                   [0,2]])
"""

rand: 服从0-1均匀分布的张量

torch.rand(2,3)

randn: 服从标准正态分布的张量

torch.randn(2,3)

normal: 服从指定正态分布的张量

torch.normal(2,3,size=(2,2))  # 均值为2,标准差为3的张量

randint: 整数随机采样结果

torch.randint(1,10,[2,4]) # 在1-10之间随机抽取整数,组成两行四列的矩阵

arrange/linsapce: 生成数列

torch.arrange(5)     # 和range相同
"""
结果为:
     tensor([0,1,2,3,4])
"""
torch.arraneg(1,5,0.5)    # 从1到5(左闭右开),每隔0.5取值一次
torch.linspace(1,5,3)     # 从1到5(左右都包含),等距取3个数

empty: 生成位初始化的指定形状矩阵

torch。empty(2,3)

full: 根据指定形状,填充指定数值

torch.full([2,4],2)

2.创建指定形状的数组

当然我们还能根据指定对象的形状进行数值填充,只需要在上述函数后面加上_like即可。

t1 = torch.tensor([1,2])
t2 = torch.tensor([[1,2],[3,4]])
torch.full_like(t1,2)    # 根据t1形状,填充数值2
torch.randint_like(t2,1,10)
torch.zeros_like(t1)

Ponint: (1)更多_like函数,可查阅帮助文档

(2)需要注意一点的是,_like类型转化需要注意转化前后数据类型一致的问题;

torch.rand_like(t1)     # t1是整数,而转化后将变成浮点数,此时代码将报错

张量和其他类型的转化方法

张量,数组和列表是较为相似的三种类型对象,在实际操作过程中,经常会涉及三种对象的相互转化,在此之前张量的创建过程中,我们看到torch.tensor函数可以直接将数组或者列表转化为张量,而我们也可以将张量转化为数组或者列表。另外,前文介绍了0维张量的概念,此处也将进一步给出零维张量和数值对象的转化方法。

numpy方法: 张量转化为数组

t1.numpy()
# 当然也可以通过np.array函数直接转化为array
np.array(t1)

tolist方法: 张量转化为列表

t1.tolist()

list函数: 张量转化为列表

list(t1)

需要注意的是,此时转化的列表是由一个个零维张量构成的列表,而非张量的数值转化成的列表。

.item()方法: 转化为数值

在很多情况下,我们需要将最终计算的结果张量转化为单独的数值进行输出,此时需要使用.item方法来执行。

n = torch.tensor(1)
n.item()

张量的深拷贝

Python中其他对象类型一样,等号赋值操作实际上是浅拷贝,需要进行深拷贝,则需要使用clone方法。

s = torch.tensor([1,2])
t = s.clone()

到此这篇关于Pytorch实现张量的创建与使用方法的文章就介绍到这了,更多相关Pytorch实现张量创建使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Pytorch使用PIL和Numpy将单张图片转为Pytorch张量方式

    我就废话不多说了,大家还是直接看代码吧! #!/usr/bin/python # -*- coding: UTF-8 -*- from PIL import Image import numpy as np import torch pil_img = Image.open('/Users/songlu/Desktop/code.jpg') img = np.array(pil_img) print torch.from_numpy(img) 补充知识:pytorch mxnet 多GPU训练

  • pytorch中tensor张量数据类型的转化方式

    1.tensor张量与numpy相互转换 tensor ----->numpy import torch a=torch.ones([2,5]) tensor([[1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.]]) # ********************************** b=a.numpy() array([[1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.]], dtype=float32) numpy --

  • pytorch 实现张量tensor,图片,CPU,GPU,数组等的转换

    1, 创建pytorch 的Tensor张量: torch.rand((3,224,224)) #创建随机值的三维张量,大小为(3,224,224) torch.Tensor([3,2]) #创建张量,[3,2] 2, cpu上的tensor和GPU即pytorch创建的tensor的相互转化 b = a.cpu() # GPU → CPU a = b.cuda() #CPU → GPU 3, tensor和numpy的转化 b = a.numpy() # tensor转化为 numpy数组 a

  • Pytorch实现张量的创建与使用方法

    目录 张量的创建及其基本类型 1.张量(Tensor)函数创建方法 2.张量的类型 3.张量类型的转化 张量的维度及形变 1.创建高维张量 2.张量的形变 2.1 flatten拉平: 将任意维度张量转化为一维张量 2.2 reshape方法: 任意变形 特殊张量的创建方法 1.特殊取值的张量的创建方法 2.创建指定形状的数组 张量和其他类型的转化方法 张量的深拷贝 张量的创建及其基本类型 1.张量(Tensor)函数创建方法 张量最基本的创建方法和Numpy中创建Array的格式一样,都是创建

  • PyTorch使用GPU训练的两种方法实例

    目录 Pytorch 使用GPU训练 方法一 .cuda() 方法二 .to(device) 附:一些和GPU有关的基本操作汇总 总结 Pytorch 使用GPU训练 使用 GPU 训练只需要在原来的代码中修改几处就可以了. 我们有两种方式实现代码在 GPU 上进行训练 方法一 .cuda() 我们可以通过对网络模型,数据,损失函数这三种变量调用 .cuda() 来在GPU上进行训练 # 将网络模型在gpu上训练 model = Model() model = model.cuda() # 损失

  • Pytorch 使用不同版本的cuda的方法步骤

    由于课题的原因,笔者主要通过 Pytorch 框架进行深度学习相关的学习和实验.在运行和学习网络上的 Pytorch 应用代码的过程中,不少项目会标注作者在运行和实验时所使用的 Pytorch 和 cuda 版本信息.由于 Pytorch 和 cuda 版本的更新较快,可能出现程序的编译和运行需要之前版本的 Pytorch 和 cuda 进行运行环境支持的情况.比如笔者遇到的某个项目中编写了 CUDAExtension 拓展,而其中使用的 cuda 接口函数在新版本的 cuda 中做了修改,使得

  • PyTorch模型的保存与加载方法实例

    目录 模型的保存与加载 保存和加载模型参数 保存和加载模型参数与结构 总结 模型的保存与加载 首先,需要导入两个包 import torch import torchvision.models as models 保存和加载模型参数 PyTorch模型将学习到的参数存储在一个内部状态字典中,叫做state_dict.这可以通过torch.save方法来实现.我们导入预训练好的VGG16模型,并将其保存.我们将state_dict字典保存在model_weights.pth文件中. model =

  • asp.net实现数据从DataTable导入到Excel文件并创建表的方法

    本文实例讲述了asp.net实现数据从DataTable导入到Excel文件并创建表的方法.分享给大家供大家参考,具体如下: /// <summary> /// 把数据从DataTable导入到Excel文件里 /// </summary> /// <param name="dataTable">数据源</param> /// <param name="AbsoluteExcelFilePath">Exce

  • navicat不能创建函数解决方法分享

    第一次写MySQL FUNCTION,一直报错, Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '`company_id` int) RETURNS varchar(20) CHARSET utf8 BEGIN 本来的函数: CREATE DEFINER

  • jQuery简单创建节点的方法

    本文实例讲述了jQuery简单创建节点的方法.分享给大家供大家参考,具体如下: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> <script type="text/javascript" src="js/jquery-1

  • js中匿名函数的创建与调用方法分析

    本文实例分析了js中匿名函数的创建与调用方法.分享给大家供大家参考.具体实现方法如下: 匿名函数就是没有名字的函数了,也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数.最经常用作回调函数(callback)参数的值,很多新手朋友对于匿名函数不了解.这里就来分析一下. function 函数名(参数列表){函数体;} 如果是创建匿名函数,那就应该是: function(){函数体;} 因为是匿名函数,所以一般也不会有参数传给他. 为什么要创建匿名函数呢?在什么情况下会使用到匿

  • python类:class创建、数据方法属性及访问控制详解

    在Python中,可以通过class关键字定义自己的类,然后通过自定义的类对象类创建实例对象. python中创建类 创建一个Student的类,并且实现了这个类的初始化函数"__init__": class Student(object):     count = 0     books = []     def __init__(self, name):         self.name = name 接下来就通过上面的Student类来看看Python中类的相关内容. 类构造和

随机推荐