PYTORCH: 60分钟 | TENSORS

Tensor是一种特殊的数据结构,非常类似于数组和矩阵。在PyTorch中,我们使用tensor编码模型的输入和输出,以及模型的参数。
Tensor类似于Numpy的数组,除了tensor可以在GPUs或其它特殊的硬件上运行以加速运算。如果熟悉ndarray,那么你也会熟悉Tensor API。如果不是,跟随此快速API上手。

import torch
import numpy as np

Tensor 初始化

Tensor可以通过多种途径初始化。看看下面的例子:

Tensor可以直接从数据中初始化。数据类型是自动推断的。

data = [[1, 2], [3, 4]]
x_data = torch.tensor(data)
np_array = np.array(data)
x_np = torch.from_numpy(np_array)

除非明确覆盖,新的tensor保留参数tensor的属性(形状,数据类型)。

x_ones = torch.ones_like(x_data) # retatins the properties of x_data
print(f"Ones Tensor: \n {x_ones} \n")
x_rand = torch.rand_like(x_data, dtype=torch.float) # overrides the datatype of x_data
print(f"Random Tensor: \n {x_rand} \n")

输出:

Ones Tensor:
 tensor([[1, 1],
        [1, 1]])
Random Tensor:
 tensor([[0.3208, 0.9371],
        [0.8172, 0.7103]])

shape 是tensor维度的元祖。在以下函数中,它决定了输出tensor的维度。

shape = (2, 3,)
rand_tensor = torch.rand(shape)
ones_tensor = torch.ones(shape)
zeros_tensor = torch.zeros(shape)

print(f"Random Tensor: \n {rand_tensor} \n")
print(f"Ones Tensor: \n {ones_tensor} \n")
print(f"Zeros Tensor: \n {zeros_tensor} \n")

输出:

Random Tensor:
 tensor([[0.0546, 0.8256, 0.1878],
        [0.6135, 0.0886, 0.0350]])

Ones Tensor:
 tensor([[1., 1., 1.],
        [1., 1., 1.]])

Zeros Tensor:
 tensor([[0., 0., 0.],
        [0., 0., 0.]])

Tensor 属性

Tensor属性描述了其形状、数据类型和存储的设备

tensor =  torch.rand(3, 4)

print(f"Shape of tensor: {tensor.shape}")
print(f"Datatype of tensor: {tensor.dtype}")
print(f"Device tensor is stored on: {tensor.device}")

输出:

Shape of tensor: torch.Size([3, 4])
Datatype of tensor: torch.float32
Device tensor is stored on: cpu

Tensor 操作

超过100种tensor操作,包括转置、索引、切片、数学运算、线性代数、随机采样,更多全面的描述见这里
以上每一种都可以在GPU上运行(通常比cpu速度更快)。如果你使用Colab,在Edit->Notebook Setting中配置GPU

We move our tensor to the GPU if avaibale
if torch.cuda.is_available():
  tensor = tensor.to('cuda')
  print(f"Device tensor is stored on: {tensor.device}")

输出:

Device tensor is stored on: cuda:0

尝试列表中某些操作。如果你熟悉NumPy API,你会发现Tensor API使用起来轻而易举。

tensor = torch.ones(4, 4)
tensor[:, 1] = 0
print(tensor)

输出:

tensor([[1., 0., 1., 1.],
        [1., 0., 1., 1.],
        [1., 0., 1., 1.],
        [1., 0., 1., 1.]])
t1 = torch.cat([tensor, tensor, tensor], dim=1)
print(t1)

输出:

tensor([[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],
        [1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],
        [1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],
        [1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.]])

dim=0,沿着第一维度拼接(增加第一维度数值),dim=1,沿着第二维度拼接(增加第二维度数值)

计算元素乘积
print(f"tensor.mul(tensor) \n {tensor.mul(tensor)} \n")
替代语法
print(f"tensor * tensor \n {tensor * tensor}")

输出:

tensor.mul(tensor)
 tensor([[1., 0., 1., 1.],
        [1., 0., 1., 1.],
        [1., 0., 1., 1.],
        [1., 0., 1., 1.]])

tensor * tensor
 tensor([[1., 0., 1., 1.],
        [1., 0., 1., 1.],
        [1., 0., 1., 1.],
        [1., 0., 1., 1.]])

计算两个tensor的矩阵乘法

print(f"tensor.matmul(tensor.T) \n {tensor.matmul(tensor.T)} \n")
替代语法:
print(f"tensor @ tensor.T \n {tensor @ tensor.T}")

输出:

tensor.matmul(tensor.T)
 tensor([[3., 3., 3., 3.],
        [3., 3., 3., 3.],
        [3., 3., 3., 3.],
        [3., 3., 3., 3.]])

tensor @ tensor.T
 tensor([[3., 3., 3., 3.],
        [3., 3., 3., 3.],
        [3., 3., 3., 3.],
        [3., 3., 3., 3.]])

In-place operations:张量操作名带上”_”即是in-place。例如: x.copy_(y), x.t_(),将会改变 x

print(tensor, "\n")
tensor.add_(5)
print(tensor)

输出:

tensor([[1., 0., 1., 1.],
        [1., 0., 1., 1.],
        [1., 0., 1., 1.],
        [1., 0., 1., 1.]])

tensor([[6., 5., 6., 6.],
        [6., 5., 6., 6.],
        [6., 5., 6., 6.],
        [6., 5., 6., 6.]])

注意:In-place操作可以节省一些内存,但当计算导数时可能会出现问题,因为它会立即丢失历史记录。因此,不鼓励使用它们。

与NumPy的关联

CPU上的Tensor和NumPy数组可以共享它们的底层内存位置,改变其中一个,另一个也会随之改变

t = torch.ones(5)
print(f"t: {t}")
n = t.numpy()
print(f"n: {n}")

输出:

t: tensor([1., 1., 1., 1., 1.])
n: [1. 1. 1. 1. 1.]

在tensor上的改变将会反映在NumPy数组上

t.add_(1)
print(f"t: {t}")
print(f"n: {n}")

输出:

t: tensor([2., 2., 2., 2., 2.])
n: [2. 2. 2. 2. 2.]
n = np.ones(5)
t = torch.from_numpy(n)

在NumPy上的改变将会反映在tensor上

np.add(n, 1, out=n)
print(f"t: {t}")
print(f"n: {n}")

输出:

t: tensor([2., 2., 2., 2., 2.], dtype=torch.float64)
n: [2. 2. 2. 2. 2.]

Original: https://www.cnblogs.com/DeepRS/p/15714994.html
Author: Deep_RS
Title: PYTORCH: 60分钟 | TENSORS

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/621344/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 【windows】在windows右键菜单加入在当前路径打开cmd功能?

    在Ubuntu中可以在一般目录下点击右键选中Open in Terminal即可打开一个命令终端,由于自己平常在windows上开发时也常常使用cmd命令行进行操作,但是每次都需要…

    Linux 2023年6月13日
    0129
  • MHA实现MySQL的高可用性

    对主节点进行监控,可实现自动故障转移至其它从节点;通过提升某一从节点为新的主节点,基于主从复制实现,还需要客户端配合实现。 目前MHA主要支持一主多从的架构,要搭建MHA,要求一个…

    Linux 2023年6月7日
    0130
  • Makefile

    target … : prerequisites … command … … target可以是一个object file(目标文件),也可以是一个执行文件,还可以…

    Linux 2023年6月7日
    0114
  • python操作MySQL;MySQL补充知识

    目录 1.python操作MySQL 2.SQL注入及解决方式 3.二次确认 4.修改表SQL语句补充 5.视图 6.触发器 7.事务 8.存储过程 9.函数 10.流程控制 11…

    Linux 2023年6月7日
    0128
  • 分布式系统架构理论与组件

    1.分布式系统的发展 在计算机发展的早期,一直都是集中式计算,计算能力依赖大型计算机。随着互联网的发展,繁重的业务需要巨大的计算能力才能完成,而集中式计算无法满足要求,大型计算机的…

    Linux 2023年6月6日
    0132
  • 5.6 Linux Vim撤销和恢复撤销快捷键

    使用 Vim 编辑文件内容时,经常会有如下 2 种需求: 对文件内容做了修改之后,却发现整个修改过程是错误或者没有必要的,想将文件恢复到修改之前的样子。 将文件内容恢复之后,经过仔…

    Linux 2023年6月7日
    0132
  • Linux通过手机USB网络共享上网

    多数情况下,服务器无法直接联网,需通过手机连线上网。设置方法如下: 终端中查看现有网络接口: ip addr 或 ifconfig 连接好数据线并在手机设置中打开”通过…

    Linux 2023年6月14日
    0121
  • tomcat服务器和servlet的基本认识

    今天下午在知乎看见了一个老哥的文章,写的是servlet写的很好,以前我对Javaweb方面的理解比较混乱今天看了这位老哥的文章后受益匪浅,知乎名叫:bravo1988​ 里面也有…

    Linux 2023年6月6日
    0139
  • 数据库常用函数

    一、数学函数ABS(x) 返回x的绝对值BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制)CEILING(x) 返回大于x的最小整数值EXP(x) 返回值e(自然…

    Linux 2023年6月13日
    0149
  • vsftpd配置FTP服务器(Centos7.x安装)

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    0120
  • PMP 考试常见工具与技术点总结

    转载请注明出处: 网络图:项目进度活动之间的逻辑关系,用来推算关键路径,最大浮动时间等; 横道图(甘特图):以图示的方式,通过活动列表和时间刻度,来展示项目获得那个顺序和持续时间 …

    Linux 2023年6月14日
    0116
  • Redis分布式锁的N种姿势

    Redis几种架构 Redis发展到现在,几种常见的部署架构有: 单机模式; 主从模式; 哨兵模式; 集群模式; 我们首先基于这些架构讲解Redisson普通分布式锁实现,需要注意…

    Linux 2023年5月28日
    0143
  • redis安装使用

    Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 它通常被称为数据结构服务…

    Linux 2023年5月28日
    0130
  • vue指令——day01

    v-cloak:能够解决插值表达式闪烁的问题 <p v-cloak>{{ msg }}</p> v-text:会覆盖元素中原本的内容,但是插值表达式 只会替…

    Linux 2023年6月7日
    0128
  • MIT6.828——Lab1 partA(麻省理工操作系统课程实验)

    Lab1 基本部分 在实验给出的文档中,已经详说明了早期PC的内存布局,并且运行了 bootloader。详细地解释了,上电后BIOS所做的工作,因此这部分不再赘述。需要注意的是 …

    Linux 2023年5月27日
    0215
  • 转:多线程环境下调用 HttpWebRequest 并发连接限制

    .net 的 HttpWebRequest 或者 WebClient 在多线程情况下存在并发连接限制,这个限制在桌面操作系统如 windows xp , windows 7 下默认…

    Linux 2023年6月13日
    0134
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球