首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >PyTorch教程2-创建Tensor

PyTorch教程2-创建Tensor

原创
作者头像
皮大大
发布2024-12-10 16:07:18
发布2024-12-10 16:07:18
6260
举报
文章被收录于专栏:PyTorchPyTorch

公众号:尤而小屋 编辑:Peter 作者:Peter

大家好,我是Peter~

本文介绍如何在PyTorch中创建Tensor,这是使用PyTorch进行深度学习的第一步,也是最为基础的一步。最后介绍PyTorch中常用的数据类型,以及如何进行设置和改变。

导入库

代码语言:python
复制
import pandas as pd
import numpy as np

import torch
from torch import nn 
from torch.utils.data import DataLoader,Dataset  # utils是工具包
from torchvision import datasets
from torchvision.transforms import ToTensor

使用torch.tensor()

1、从Python列表创建Tensor:

代码语言:python
复制
lst = [1,2,3,4]

tensor1 = torch.tensor(lst)
tensor1 

tensor(1, 2, 3, 4)

代码语言:python
复制
type(tensor1)  # 查看数据类型 

torch.Tensor

2、从numpy数组创建Tensor:

代码语言:python
复制
numpy_arr = np.array([1,2,3,4])

tensor2 = torch.tensor(numpy_arr) 
tensor2

tensor(1, 2, 3, 4, dtype=torch.int32)

使用torch.from_numpy()

通过torch.from_numpy函数来生成也极其方便:

代码语言:python
复制
tensor3 = torch.from_numpy(numpy_arr)  # 使用numpy数组
tensor3

tensor(1, 2, 3, 4, dtype=torch.int32)

使用torch_rand()、torch_randn()、torch.randint()或torch.rand_like()

四者用于创建随机初始化的Tensor:

  • torch.rand():生成均匀分布的随机数
  • torch.randn():生成符合标准正态分布的随机数
  • torch.randint():生成指定区间上的随机数
  • torch.rand_like():基于某个张量的shape进行创建
代码语言:python
复制
tensor4 = torch.rand(3,2)  # 均匀分布:0-1之间
tensor4
代码语言:python
复制
    tensor([[0.0321, 0.8543],
            [0.9155, 0.5947],
            [0.9626, 0.5966]])
代码语言:python
复制
tensor5 = torch.randn(4,2)  # 标准正态分布
tensor5 
代码语言:python
复制
    tensor([[-1.9809,  0.0465],
            [-0.8754, -0.1601],
            [ 0.0491,  0.4267],
            [ 1.8975, -0.1706]])
代码语言:python
复制
tensor6 = torch.randint(1,10,[3,3])  # 在1-10的区间内生成3*3的张量数组
tensor6 
代码语言:python
复制
    tensor([[2, 3, 1],
            [8, 8, 8],
            [7, 8, 4]])
代码语言:python
复制
tensor7 = torch.rand_like(tensor5)  # 基于tensor5的shape进行创建
tensor7
代码语言:python
复制
    tensor([[0.5240, 0.0075],
            [0.8406, 0.0995],
            [0.0233, 0.9488],
            [0.3570, 0.5491]])

使用torch.empty或torch.empty_like()

二者都是用来创建空数组:

代码语言:python
复制
tensor8 = torch.empty((4,2), dtype=torch.float32)
tensor8 
代码语言:python
复制
    tensor([[6.3058e-44, 6.8664e-44],
            [7.0065e-44, 6.3058e-44],
            [6.8664e-44, 6.7262e-44],
            [1.1771e-43, 6.7262e-44]])

创建和指定Tensor的shape相同的空Tensor:

代码语言:python
复制
tensor9 = torch.empty_like(tensor5)
tensor9
代码语言:python
复制
    tensor([[6.8664e-44, 6.7262e-44],
            [1.1771e-43, 6.7262e-44],
            [7.7071e-44, 8.1275e-44],
            [7.4269e-44, 7.0065e-44]])

使用torch.FloatTensor或torch.IntTensor

二者用于生成随机的浮点数或者整数的张量:

代码语言:python
复制
tensor10 = torch.FloatTensor(2, 3)  # 浮点数
tensor10
代码语言:python
复制
    tensor([[6.3058e-44, 6.8664e-44, 7.0065e-44],
            [6.3058e-44, 6.8664e-44, 6.7262e-44]])
代码语言:python
复制
tensor11 = torch.IntTensor(2, 3)  # 整数
tensor11
代码语言:python
复制
    tensor([[ 862139493,  761409637, 1684104801],
            [1684157485,  828452193,  925721654]], dtype=torch.int32)

使用torch.full()

表示使用相同的元素进行创建:

代码语言:python
复制
tensor12 = torch.full([3,2],8)  # 相同元素为8  shape为3*2
tensor12
代码语言:python
复制
    tensor([[8, 8],
            [8, 8],
            [8, 8]])

使用torch.normal()

torch.normal 是 PyTorch 中用于生成正态分布(高斯分布)随机数的函数。它允许用户指定生成随机数的形状、均值和标准差等参数。

代码语言:python
复制
torch.normal(mean, std, generator=None, out=None)
  • mean (Tensor or float): 正态分布的均值。可以是一个标量或一个与输出形状相同的张量。
  • std (Tensor or float): 正态分布的标准差。可以是一个标量或一个与输出形状相同的张量。
  • generator (torch.Generator, optional): 用于生成随机数的随机数生成器。如果未指定,则使用全局默认生成器。
  • out (Tensor, optional): 可选的输出张量。如果提供,结果将存储在该张量中
代码语言:python
复制
# 生成一个形状为 (3, 3) 的正态分布随机数矩阵,均值为0,标准差为1

tensor13 = torch.normal(0, 1, size=(3, 3)) 
tensor13
代码语言:python
复制
    tensor([[-2.1242, -0.3209, -0.5634],
            [ 0.1115, -1.2329, -1.4103],
            [-1.4714,  0.3987,  0.0533]])
代码语言:python
复制
tensor14 = torch.normal(mean=torch.arange(1., 11.), std=torch.arange(1, 0, -0.1))
tensor14
代码语言:python
复制
    tensor([0.8983, 1.8828, 2.7534, 4.6313, 5.4092, 6.8502, 7.7716, 7.9289, 8.6098,
            9.9055])
代码语言:python
复制
tensor15 = torch.normal(mean=torch.arange(1., 6.))
tensor15
代码语言:python
复制
tensor([1.0791, 2.9477, 2.9525, 3.6380, 6.6513])

使用torch.zeros()或torch.zeros_like()

二者都用于创建全0的Tensor:

代码语言:python
复制
tensor16 = torch.zeros([4,3]) 
tensor16
代码语言:python
复制
    tensor([[0., 0., 0.],
            [0., 0., 0.],
            [0., 0., 0.],
            [0., 0., 0.]])
代码语言:python
复制
tensor17 = torch.zeros_like(tensor5)  # 基于tensor5的shape创建全0张量
tensor17
代码语言:python
复制
    tensor([[0., 0.],
            [0., 0.],
            [0., 0.],
            [0., 0.]])

使用torch.ones()或torch.ones_like()

二者都用于创建全1的Tensor:

代码语言:python
复制
tensor18 = torch.ones([4,3]) 
tensor18
代码语言:python
复制
    tensor([[1., 1., 1.],
            [1., 1., 1.],
            [1., 1., 1.],
            [1., 1., 1.]])
代码语言:python
复制
tensor19 = torch.ones_like(tensor7)  # 基于tensor7的shape 
tensor19
代码语言:python
复制
    tensor([[1., 1.],
            [1., 1.],
            [1., 1.],
            [1., 1.]])

使用torch.arange()

用于创建等间隔的Tensor:指定步长

代码语言:python
复制
tensor20 = torch.arange(1,20)  # 不包含尾部;间隔默认为1
tensor20
代码语言:python
复制
tensor([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
            19])
代码语言:python
复制
tensor21 = torch.arange(1,20,3)  # 改变间隔
tensor21

tensor( 1, 4, 7, 10, 13, 16, 19)

使用torch.linespace()

用于创建等间隔的Tensor:指定个数

代码语言:python
复制
tensor22 = torch.linspace(1,20,steps=50)  # 包含尾部;在1到20直接等间隔取50个数
tensor22 
代码语言:python
复制
    tensor([ 1.0000,  1.3878,  1.7755,  2.1633,  2.5510,  2.9388,  3.3265,  3.7143,
             4.1020,  4.4898,  4.8776,  5.2653,  5.6531,  6.0408,  6.4286,  6.8163,
             7.2041,  7.5918,  7.9796,  8.3673,  8.7551,  9.1429,  9.5306,  9.9184,
            10.3061, 10.6939, 11.0816, 11.4694, 11.8571, 12.2449, 12.6327, 13.0204,
            13.4082, 13.7959, 14.1837, 14.5714, 14.9592, 15.3469, 15.7347, 16.1224,
            16.5102, 16.8980, 17.2857, 17.6735, 18.0612, 18.4490, 18.8367, 19.2245,
            19.6122, 20.0000])

使用torch.eye()

用于创建单位矩阵tensor

代码语言:python
复制
tensor23 = torch.eye(3)  # 必须是二维
tensor23
代码语言:python
复制
    tensor([[1., 0., 0.],
            [0., 1., 0.],
            [0., 0., 1.]])
代码语言:python
复制
tensor24 = torch.eye(5,4)  # 必须是二维
tensor24
代码语言:python
复制
    tensor([[1., 0., 0., 0.],
            [0., 1., 0., 0.],
            [0., 0., 1., 0.],
            [0., 0., 0., 1.],
            [0., 0., 0., 0.]])

使用torch.diag()

用于创建对角矩阵:

代码语言:python
复制
tensor25 = torch.diag(torch.tensor([1, 2, 3]))
tensor25
代码语言:python
复制
    tensor([[1, 0, 0],
            [0, 2, 0],
            [0, 0, 3]])

使用torch.diagonal

用于提取对角线元素:

代码语言:python
复制
tensor26 = torch.diagonal(tensor25)
tensor26 

tensor(1, 2, 3)

使用torch.tril()或torch.triu()

  • torch.tril():创建下三角矩阵
  • torch.triu():创建上三角矩阵
代码语言:python
复制
tensor18 
代码语言:python
复制
    tensor([[1., 1., 1.],
            [1., 1., 1.],
            [1., 1., 1.],
            [1., 1., 1.]])
代码语言:python
复制
tensor27 = torch.tril(tensor18)  # 下三角
tensor27
代码语言:python
复制
    tensor([[1., 0., 0.],
            [1., 1., 0.],
            [1., 1., 1.],
            [1., 1., 1.]])
代码语言:python
复制
tensor28 = torch.triu(tensor18)  # 上三角
tensor28
代码语言:python
复制
    tensor([[1., 1., 1.],
            [0., 1., 1.],
            [0., 0., 1.],
            [0., 0., 0.]])

PyTorch数据类型

最后介绍以下PyTorch中常见的数据类型:

常见类型

浮点数类型
  • torch.float32 (或 torch.float): 32位浮点数,单精度。
  • torch.float64 (或 torch.double): 64位浮点数,双精度。
  • torch.float16 (或 torch.half): 16位浮点数,半精度。
  • torch.bfloat16: 16位浮点数,BFLOAT16,一种介于 float16 和 float32 之间的格式。
整数类型
  • torch.int8: 8位有符号整数。
  • torch.uint8: 8位无符号整数。
  • torch.int16: 16位有符号整数。
  • torch.short: 16位有符号整数,与 torch.int16 相同。
  • torch.int32 (或 torch.int): 32位有符号整数。
  • torch.int64 (或 torch.long): 64位有符号整数。
布尔类型
  • torch.bool: 布尔类型,表示 True 或 False。
复数类型
  • torch.complex64: 由两个 32位浮点数组成的复数。
  • torch.complex128: 由两个 64位浮点数组成的复数。
其他类型
  • torch.qint8: 量化的 8位整数,通常用于量化神经网络中的权重。
  • torch.quint8: 量化的 8位无符号整数。
  • torch.qint32: 量化的 32位整数。

设置数据类型

使用torch.tensor传入浮点数元素,或者使用torch.Tensor仅指定维度时,生成的默认是FloatTensor,也可以设置为其它类型的:

代码语言:python
复制
torch.set_default_tensor_type(torch.DoubleTensor)

改变数据类型

代码语言:python
复制
tensor29 = torch.tensor([1,2,3])  
tensor29

tensor(1, 2, 3)

代码语言:python
复制
tensor29.dtype  # 默认为int64

torch.int64

代码语言:python
复制
tensor30 = torch.tensor([1,2,3], dtype=torch.int32)  # 指定为int32
tensor30

tensor(1, 2, 3, dtype=torch.int32)

代码语言:python
复制
tensor30.dtype 

torch.int32

改变数据类型方式1:

代码语言:python
复制
tensor31 = tensor30.long()
tensor31

tensor(1, 2, 3)

代码语言:python
复制
tensor31.dtype  # 从int32---->int64

torch.int64

改变数据类型方式2:

代码语言:python
复制
tensor32 = tensor30.type(torch.int64)
tensor32

tensor(1, 2, 3)

代码语言:python
复制
tensor32.dtype  # 从int32---->int64

torch.int64

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 导入库
  • 使用torch.tensor()
  • 使用torch.from_numpy()
  • 使用torch_rand()、torch_randn()、torch.randint()或torch.rand_like()
  • 使用torch.empty或torch.empty_like()
  • 使用torch.FloatTensor或torch.IntTensor
  • 使用torch.full()
  • 使用torch.normal()
  • 使用torch.zeros()或torch.zeros_like()
  • 使用torch.ones()或torch.ones_like()
  • 使用torch.arange()
  • 使用torch.linespace()
  • 使用torch.eye()
  • 使用torch.diag()
  • 使用torch.diagonal
  • 使用torch.tril()或torch.triu()
  • PyTorch数据类型
    • 常见类型
      • 浮点数类型
      • 整数类型
      • 布尔类型
      • 复数类型
      • 其他类型
    • 设置数据类型
    • 改变数据类型
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档