PyTorch中的张量(Tensor)如同数组和矩阵一样,是一种特殊的数据结构。在PyTorch中,神经网络的输入、输出以及网络的参数等数据,都是使用张量来进行描述。

      torch包中定义了10种具有CPU和GPU变体的tensor类型。

      torch.Tensor或torch.tensor是一种包含单一数据类型元素的多维矩阵。torch.Tensor或torch.tensor注意事项:

      (1). torch.Tensor是默认tensor类型torch.FloatTensor的别名。

      (2). torch.tensor总是拷贝数据。

      (3).每一个tensor都有一个关联的torch.Storage,它保存着它的数据。

      (4).改变tensor的方法是使用下划线后缀标记,如torch.FloatTensor.abs_()就地(in-place)计算绝对值并返回修改后的tensor,而torch.FloatTensor.abs()在新tensor中计算结果。

      (5).有几百种tensor相关的运算操作,包括各种数学运算、线性代数、随机采样等。

      创建tensor的四种主要方法:

      (1).要使用预先存在的数据创建tensor,使用torch.tensor()。

      (2).要创建具有特定大小的tensor,使用torch.*,如torch.rand()。

      (3).要创建与另一个tensor具有相同大小(和相似类型)的tensor,使用torch.*_like,如torch.rand_like()。

      (4).要创建与另一个tensor类型相似但大小不同的tensor,使用tensor.new_*,如tensor.new_ones()。

      以上内容及以下测试代码主要参考:

      1. torch.Tensor — PyTorch 1.10.0 documentation

      2. https://pytorch.apachecn.org/#/docs/1.7/03

      tensor具体用法见以下test_tensor.py测试代码:

import torch
import numpy as npvar = 2# reference: https://pytorch.apachecn.org/#/docs/1.7/03
if var == 1: # 张量初始化# 1.直接生成张量, 注意: torch.tensor与torch.Tensor的区别: torch.Tensor是torch.FloatTensor的别名;而torch.tensor则根据输入数据推断数据类型data = [[1, 2], [3, 4]]x_data = torch.tensor(data); print(f"x_data: {x_data}, type: {x_data.type()}") # type: torch.LongTensory_data = torch.Tensor(data); print(f"y_data: {y_data}, type: {y_data.type()}") # type: torch.FloatTensorz_data = torch.IntTensor(data); print(f"z_data: {z_data}, type: {z_data.type()}") # type: torch.IntTensor# 2.通过Numpy数组来生成张量,反过来也可以由张量生成Numpy数组np_array = np.array(data)x_np = torch.from_numpy(np_array); print("x_np:\n", x_np)y_np = torch.tensor(np_array); print("y_np:\n", y_np) # torch.tensor总是拷贝数据z_np = torch.as_tensor(np_array); print("z_np:\n", z_np) # 使用torch.as_tensor可避免拷贝数据# 3.通过已有的张量来生成新的张量: 新的张量将继承已有张量的属性(结构、类型),也可以重新指定新的数据类型x_ones = torch.ones_like(x_data); print(f"x_ones: {x_ones}, type: {x_ones.type()}") # 保留x_data的属性x_rand = torch.rand_like(x_data, dtype=torch.float); print(f"x_rand: {x_rand}, type: {x_rand.type()}") # 重写x_data的数据类型: long -> floattensor = torch.tensor((), dtype=torch.int32); print(f"shape of tensor: {tensor.shape}, type: {tensor.type()}")new_tensor = tensor.new_ones((2, 3)); print(f"shape of new_tensor: {new_tensor.shape}, type: {new_tensor.type()}")# 4.通过指定数据维度来生成张量shape = (2, 3) # shape是元组类型,用来描述张量的维数rand_tensor = torch.rand(shape); print(f"rand_tensor: {rand_tensor}, type: {rand_tensor.type()}")ones_tensor = torch.ones(shape, dtype=torch.int); print(f"ones_tensor: {ones_tensor}, type: {ones_tensor.type()}")zeros_tensor = torch.zeros(shape, device=torch.device("cpu")); print("zeros_tensor:", zeros_tensor)# 5.可以使用requires_grad=True创建张量,以便torch.autograd记录对它们的操作以进行自动微分x = torch.tensor([[1., -1.], [1., 1.]], requires_grad=True)out = x.pow(2).sum(); print(f"out: {out}")# out.backward(); print(f"x: {x}\nx.grad: {x.grad}")
elif var == 2: # 张量属性: 从张量属性我们可以得到张量的维数、数据类型以及它们所存储的设备(CPU或GPU)tensor = torch.rand(3, 4)print(f"shape of tensor: {tensor.shape}")print(f"datatype of tensor: {tensor.dtype}") # torch.float32print(f"device tensor is stored on: {tensor.device}") # cpu或cudaprint(f"tensor layout: {tensor.layout}") # tensor如何在内存中存储print(f"tensor dim: {tensor.ndim}") # tensor维度
elif var == 3: # 张量运算: 有超过100种张量相关的运算操作,例如转置、索引、切片、数学运算、线性代数、随机采样等# 所有这些运算都可以在GPU上运行(相对于CPU来说可以达到更高的运算速度)tensor = torch.rand((4, 4), dtype=torch.float); print(f"src: {tensor}")# 判断当前环境GPU是否可用,然后将tensor导入GPU内运行if torch.cuda.is_available():tensor = tensor.to("cuda")# 1.张量的索引和切片tensor[:, 1] = 0; print(f"index: {tensor}") # 将第1列(从0开始)的数据全部赋值为0# 2.张量的拼接: 可以通过torch.cat方法将一组张量按照指定的维度进行拼接,也可以参考torch.stack方法,但与torch.cat稍微有点不同cat = torch.cat([tensor, tensor], dim=1); print(f"cat:\n {cat}")# 3.张量的乘积和矩阵乘法print(f"tensor.mul(tensor):\n {tensor.mul(tensor)}") # 逐个元素相乘结果print(f"tensor * tensor:\n {tensor * tensor}") # 等价写法print(f"tensor.matmul(tensor.T):\n {tensor.matmul(tensor.T)}") # 张量与张量的矩阵乘法print(f"tensor @ tensor.T:\n {tensor @ tensor.T}") # 等价写法# 4.自动赋值运算: 通常在方法后有"_"作为后缀,例如:x.copy_(y), x.t_()操作会改变x的取值(in-place)print(f"tensor:\n {tensor}")print(f"tensor:\n {tensor.add_(5)}")
elif var == 4: # Tensor与Numpy的转化: 张量和Numpy array数组在CPU上可以共用一块内存区域,改变其中一个另一个也会随之改变# 1.由张量变换为Numpy array数组t = torch.ones(5); print(f"t: {t}")n = t.numpy(); print(f"n: {n}")t.add_(1) # 修改张量的值,则Numpy array数组值也会随之改变print(f"t: {t}")print(f"n: {n}")# 2.由Numpy array数组转为张量n = np.ones(5); print(f"n: {n}")t = torch.from_numpy(n); print(f"t: {t}")np.add(n, 1, out=n) # 修改Numpy array数组的值,则张量值也会随之改变print(f"n: {n}")print(f"t: {t}")print("test finish")

      GitHub:GitHub - fengbingchun/PyTorch_Test: PyTorch's usage

PyTorch中tensor介绍相关推荐

  1. pytorch tensor查找0_在PyTorch中Tensor的查找和筛选例子

    本文源码基于版本1.0,交互界面基于0.4.1 import torch 按照指定轴上的坐标进行过滤 index_select() 沿着某tensor的一个轴dim筛选若干个坐标 >>&g ...

  2. Pytorch中tensor.view().permute().contiguous()函数理解

    Pytorch中tensor.view().permute().contiguous()函数理解 yolov3中有一行这样的代码,在此记录一下三个函数的含义 # 例子中batch_size为整型,le ...

  3. Pytorch中tensor.expand()和tensor.expand_as()函数

    Pytorch中tensor.expand函数 Tensor.expand()函数详解 Tensor.expand_as()函数 Tensor.expand()函数详解 函数语法: # 官方解释: D ...

  4. Pytorch中tensor维度和torch.max()函数中dim参数的理解

    Pytorch中tensor维度和torch.max()函数中dim参数的理解 维度 参考了 https://blog.csdn.net/qq_41375609/article/details/106 ...

  5. Pytorch中Tensor的索引,切片以及花式索引(fancy indexing)

    目录 理解Tensor的dim 索引 简单索引 用1维的list,numpy,tensor索引 用booltensor索引 切片 花式索引 结语 前一段时间遇到一个花式索引的问题,在搜索良久之后没有找 ...

  6. pyTorch中tensor运算

    文章目录 PyTorch的简介 PyTorch中主要的包 PyTorch的安装 使用GPU的原因 使数据在GPU上运行 什么使Tensor(张量) 一些术语介绍 Tensor的属性介绍(Rank,ax ...

  7. pytorch中Parameter()介绍

    用法介绍  pytorch中的Parameter函数可以对某个张量进行参数化.它可以将不可训练的张量转化为可训练的参数类型,同时将转化后的张量绑定到模型可训练参数的列表中,当更新模型的参数时一并将其更 ...

  8. pytorch中tensor、backward一些总结

    目录 说明 Tensor Tensor的创建 Tensor(张量)基本数据类型与常用属性 Tensor的自动微分 设置不可积分计算 pytorch 计算图 backward一些细节 该文章解决问题如下 ...

  9. pytorch中tensor常用is_contiguous含义

    is_contiguous 根据名字就可以知道判断是否连续相邻, pytorch中不管任意维度的张量底层都是一维tensor,只是取决于你怎么读,因此每个tensor中标量都是连续的.如果我们将矩阵进 ...

最新文章

  1. Only the original thread that created a view hierarchy can touch its views.
  2. python数据挖掘资料
  3. LiteIDE 在 Windows 下为 Go 语言添加智能提示代码补全
  4. python 生成排列、组合以及选择
  5. systemtap执行过程中报probe timer.profile registration error
  6. 集群负载均衡之lvs和keepalived
  7. 操作系统—进程的定义、组成和组织方式(思维导图)
  8. jquery SELECT 操作
  9. 为Android系统定制重启功能
  10. 深度学习实现缺陷检测算法汇总
  11. java大作业 俄罗斯方块_俄罗斯方块Java程序设计
  12. 简述敏捷开发中的测试流程
  13. OCR手写数字识别什么软件好用?介绍一种
  14. windows防火墙设置_Windows防火墙:您应该知道的事情
  15. 【正则表达式】从字符串中提取数字
  16. PPT修改幻灯片大小
  17. 分立器件~二极管三极管
  18. w10计算机怎么恢复出厂设置路由器,Windows10系统重置无线wifi出厂设置的方法
  19. 【Java】基本类型之short(四)
  20. android设置手机震动强度,android 控制震动强度

热门文章

  1. Codeforces Gym 2015 ACM Arabella Collegiate Programming Contest(二月十日训练赛)
  2. 电子厂计算机常用英语,电子厂常用英语词汇
  3. 删除数组中的重复项(保留最后一次出现的重复元素并保证数组的原有顺序)
  4. Win7如何打开软键盘?Win7打开软键盘的方法
  5. 配置ntp客户端与服务器端时间的同步
  6. 从“中央厨房”看媒体深度融合
  7. CDO安装指南(centos7)
  8. MTFCSGO准心设置
  9. 在VS Code中开启gdb的pretty-printer功能
  10. 使用Console.log调试