当前位置:首页 > 技术 > 正文内容

PyTorch : 了解Tensor(张量)及其创建方法

Lotus2022-10-30 14:43技术

本文已收录于Pytorch系列专栏: ​​Pytorch入门与实践​​ 专栏旨在详解Pytorch,精炼地总结重点,面向入门学习者,掌握Pytorch框架,为数据分析,机器学习及深度学习的代码能力打下坚实的基础。免费订阅,持续更新。

认识张量

张量是一个多维数组 ,它是标量、向量、矩阵的高维拓展。

PyTorch : 了解Tensor(张量)及其创建方法_张量

比如说对于一张图片,它是3维张量,其中RGB就是其第三维张量。

Tensor与 Variable

Variable是Pytorch的0.4.0版本之前的一个重要的数据结构,但是从0.4.0开始,它已经并入了Tensor中了。

Variable是 torch.autograd 中的数据类型,主要用于封装Tensor ,进行自动求导。

PyTorch : 了解Tensor(张量)及其创建方法_tensor_02

  • data: 被包装的 Tensor
  • grad: data 的梯度
  • grad_fn: 创建 Tensor 的 Function ,是自动求导的关键。比如说是加法还是乘法之类的。
  • requires_grad: 指示是否需要梯度,有些不需要梯度,设置为false可以节省内存。
  • is_leaf: 指示是否是叶子结点(张量)

Tensor

PyTorch : 了解Tensor(张量)及其创建方法_tensor_03

PyTorch0.4.0版开始, Variable 并入 Tensor

  • dtype: 张量的数据类型,如 torch.FloatTensor FloatTensor, torch.cuda.FloatTensor(cuda表示数据放在了GPU上)
  • shape: 张量的形状,如 (64, 3, 224, 224)
  • device: 张量所在设备, GPU/CPU ,是加速的关键

张量的创建

一、直接创建

torch.tensor()

PyTorch : 了解Tensor(张量)及其创建方法_标量_04

功能:从data 创建 tensor

  • data : 数据 , 可以是 list, numpy
  • dtype : 数据类型,默认与 data 的一致
  • device 所在设备 , cuda cpu
  • requires_grad :是否需要梯度
  • pin_memory :是否存于锁页内存

实例如下:

import torch
import numpy as np

# Create tensors via torch.tensor

flag = True

if flag:
arr = np.ones((3, 3))
print("type of data:", arr.dtype)

t = torch.tensor(arr, device='cuda')
print(t)
type of data: float64
tensor([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]], device='cuda:0', dtype=torch.float64)

其中,cuda表示采用了gpu,0是gpu的标号,由于只有一个gpu,因此是0。

torch.from_numpy(ndarray)

功能:从numpy 创建 tensor

注意事项:从 torch.from_numpy 创建的 tensor 于原 ndarray 共享内存 ,当修改其中一个的数据,另外一个也将会被改动。

PyTorch : 了解Tensor(张量)及其创建方法_Pytorch_05

实例代码:

# Create tensors via torch.from_numpy(ndarray)
arr = np.array([[1, 2, 3], [4, 5, 6]])
t = torch.from_numpy(arr)
print("numpy array: ", arr)
print("tensor : ", t)

print("\n修改arr")
arr[0, 0] = 0
print("numpy array: ", arr)
print("tensor : ", t)

print("\n修改tensor")
t[0, 0] = -1
print("numpy array: ", arr)
print("tensor : ", t)

通过结果可见,指向相同。

numpy array:  [[1 2 3]
[4 5 6]]
tensor : tensor([[1, 2, 3],
[4, 5, 6]], dtype=torch.int32)

修改arr
numpy array: [[0 2 3]
[4 5 6]]
tensor : tensor([[0, 2, 3],
[4, 5, 6]], dtype=torch.int32)

修改tensor
numpy array: [[-1 2 3]
[ 4 5 6]]
tensor : tensor([[-1, 2, 3],
[ 4, 5, 6]], dtype=torch.int32)

二、依据数值创建

2.1 torch.zeros()

功能:依size 创建全 0 张量

  • size : 张量的形状 , 如 (3,3),(3,224,224)
  • out : 输出的张量
  • layout 内存中布局形式 , 有strided(默认), sparse_coo(这个通常稀疏矩阵时设置,提高读取效率) 等
  • device 所在设备 , gpu cpu
  • requires_grad :是否需要梯度

PyTorch : 了解Tensor(张量)及其创建方法_Pytorch_06

code:

out_t = torch.tensor([1])

t = torch.zeros((3, 3), out=out_t)

print(t, '\n', out_t)
print(id(t), id(out_t), id(t) == id(out_t))

可见,该out的值与t相同,因此out是一个输出的作用,将张量生成的数据赋值给另一个变量。

tensor([[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
tensor([[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
2211683380904 2211683380904 True
2.2 torch.zeros_like()

功能:依据input 形状创建全 0 张量

  • intput : 创建与 input 同形状的全 0 张量
  • dtype : 数据类型
  • layout 内存中布局形式
2.3 torch. ones()
2.4 torch. ones_like()

功能:input 形状创建全 1 张量

其他参数一样同上。

PyTorch : 了解Tensor(张量)及其创建方法_Pytorch_07

2.5 torch. full()
2.6 torch.full_like()

功能:依据input 形状创建指定数据的张量

  • size : 张量的形状 , 如 (3,3)
  • fill_value : 张量的值

PyTorch : 了解Tensor(张量)及其创建方法_标量_08

code

t = torch.full((3, 3), 5)
print(t)
tensor([[5, 5, 5],
[5, 5, 5],
[5, 5, 5]])
2.7 torch. arange

功能:创建等差的1 维张量

注意事项:数值区间为[start,end)

  • start : 数列起始值
  • end : 数列“结束值”
  • step : 数列公差,默认为 1

code

t = torch.arange(2, 10, 2)
print(t)
tensor([2, 4, 6, 8])
2.8 torch. linspace

功能:创建均分的1 维张量

注意事项:数值区间为[start,end)

  • start : 数列起始值
  • end : 数列结束值
  • steps : 数列长度,注意是长度。

它的步长就是(end - start)/ steps。

t = torch.linspace(2, 10, 6)
print(t)
tensor([ 2.0000,  3.6000,  5.2000,  6.8000,  8.4000, 10.0000])
2.9 torch. logspace

PyTorch : 了解Tensor(张量)及其创建方法_Pytorch_09

功能:创建对数均分的1 维张量

注意事项:长度为steps, 底为 base

  • start : 数列起始值
  • end : 数列结束值
  • steps : 数列长度
  • base : 对数函数的底,默认为 10
2.10 torch. eye()

功能:创建单位对角矩阵(2 维张量)

注意事项:默认为方阵

  • n : 矩阵行数
  • m : 矩阵列数

三、依概率分布创建张量

3.1 torch. normal()

功能:生成正态分布(高斯分布)

  • mean : 均值
  • std : 标准差

四种模式: mean为标量, std为标量 mean为标量, std为张量 mean为张量, std为标量 mean为张量, std为张量

后三种基本用法相同,都是根据不同的维数进行

code:

# the mean and std both are tensors
mean = torch.arange(1, 5, dtype=torch.float)
std = torch.arange(1, 5, dtype=torch.float)
t_normal = torch.normal(mean, std)
print("mean:{}\nstd:{}".format(mean, std))
print(t_normal)

由结果可知,其生成的tensor是上面每一维度的参数生成的。

mean:tensor([1., 2., 3., 4.])
std:tensor([1., 2., 3., 4.])
tensor([1.6614, 2.5338, 3.1850, 6.4853])

需要注意的是,对于mean和std都是标量的情况下,需要指定生成的size。

# mean: scalar std: scalar
t_normal = torch.normal(0., 1., size=(4,))
print(t_normal)
tensor([0.6614, 0.2669, 0.0617, 0.6213])
3.2 torch. randn ()
3.3 torch. randn_like ()

功能:生成标准正态分布(均值为0,方差为1)

size : 张量的形状。

PyTorch : 了解Tensor(张量)及其创建方法_Pytorch_10

3.4 torch. rand()
3.5 torch. rand_like

功能:在区间[0,1) 上,生成均匀分布

3.6 torch. randint ()
3.7 torch. randint_like ()

功能:区间[low, high) 生成整数均匀分布

size : 张量的形状

PyTorch : 了解Tensor(张量)及其创建方法_tensor_11

3.8 torch. randperm ()

功能:生成生成从0 到 n-1 的随机排列

n : 张量的长度

PyTorch : 了解Tensor(张量)及其创建方法_张量_12

3.9 torch. bernoulli ()

功能 :以 input 为概率,生成伯努力分布(0 1 分布,两点分布)

input : 概率值

PyTorch : 了解Tensor(张量)及其创建方法_标量_13

原文链接

扫描二维码推送至手机访问。

版权声明:本文来源于网络,仅供学习,如侵权请联系站长删除。

本文链接:https://news.layui.org.cn/post/978.html

分享给朋友:

“PyTorch : 了解Tensor(张量)及其创建方法” 的相关文章

HBase1.4.6安装搭建及shell命令使用

HBase1.4.6安装搭建 目录 HBase1.4.6安装搭建 一、前期准备(Hadoop,zookeeper,jdk) 搭建Hbase 1、上传解压 2、配置环境变量 3、修改hbase-env.sh文件 4、修改hbase-site.xml文件 5、修改regionservers文件 6、同步到所有节点(如果是伪分布式不需要同步) 7、启动hbase集群 , 在master上执行...

【存储数据恢复】某品牌EqualLogic系列存储介绍&常见故障的数据恢复方法

某品牌EqualLogic系列存储介绍: 某品牌EqualLogic系列存储可以通过连接串口先对存储进行初始化。 通过浏览器登录配置的ip地址,账号默认:grpadmin,密码默认:grpadmin;也可以通过串口登陆查看状态。 卷的划分和访问如下图: 底层结构: 以9块盘组建磁盘阵列为例,该存储在创建RAID的时候,会默认分配一块热备盘,并不是全局热备。 用8块...

devops学习笔记-jenkins实现基础CI/CD操作

在之前的devops工具链中完成了jenkins以及gitlab配置之后,可以实现基础的CI/CD操作。 操作流程 整体的操作的流程如下所示: 在开发环境配置好代码之后,将代码上传到gitlab,jenkins拉取gitlab的代码,由maven插件build,打包好后,构建 docker镜像,上传到目标服务器中运行,可以通过tag选择版本代码。 本地编写代码 使用idea编写一个基础的spr...

Android平台实现mp4文件实时推送RTMP|轻量级RTSP服务|GB28181平台

好多开发者有这样的诉求,想把本地录制的MP4文件,以实时流数据的形式,推送到RTMP服务器,注入轻量级RTSP服务,或者对接到GB28181平台,这块前几年我们就有对接。 本次以MediaExtractor为例,先利用MediaExtractor,把mp4文件的音视频数据分离,然后调用我们publisher模块,实现编码后的数据对接到RTMP服务器、轻量级RTSP服务或GB28181平台即可,废...

重新理解微服务之终究绕不过这4个坎?(观点探讨)

系列文章 .Net微服务实战之技术选型篇 .Net微服务实战之技术架构分层篇 .Net微服务实战之DevOps篇 .Net微服务实战之负载均衡(上) .Net微服务实战之CI/CD .Net微服务实战之Kubernetes的搭建与使用 .Net微服务实战之负载均衡(下) .Net微服务实战之必须得面对的分布式问题 .Net微服务实战之可观测性 重新理解微服务之它还那么纯粹吗? 前言  ...

【大话云原生】微服务篇-五星级酒店的服务方式

文章开始之前,我给大家推荐一个人工智能学习网站,首先说我之前是完全不涉及人工智能领域的,但是我尽然看懂了,以后老哥我就要参与人工智能了。如果你也想学习,点击跳转到网站 《大话云原生》系列文章期望用最通俗、简单的语言说明云原生生态系统内的组成及应用关系。此专栏的前两篇文章 《【大话云原生】煮饺子与docker、kubernetes之间的关系》 《【大话云原生】负载均衡篇-小饭馆的流量变大了》 欢迎...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。