Pytorch入门—Tensors张量的学习

2024-05-09 15:12

本文主要是介绍Pytorch入门—Tensors张量的学习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Tensors张量的学习

张量是一种特殊的数据结构,与数组和矩阵非常相似。在PyTorch中,我们使用张量来编码模型的输入和输出,以及模型的参数。

张量类似于NumPy的ndarrays,只是张量可以在GPU或其他硬件加速器上运行。事实上,张量和NumPy数组通常可以共享相同的底层内存,从而无需复制数据(请参阅使用NumPy进行桥接)。张量还针对自动微分进行了优化(我们将在稍后的Autograd部分中看到更多内容)。如果您熟悉ndarrays,您将熟悉Tensor API。

import torch
import numpy as np

Initializing a Tensor 初始化张量

Directly from data 直接从数据中初始化

张量可以直接从数据中创建。数据类型是自动推断的。

data = [[1, 2],[3, 4]]
x_data = torch.tensor(data)

image-20240507094522422

From a NumPy array 从NumPy数组初始化

张量可以从NumPy数组中创建(反之亦然—请参阅使用NumPy进行桥接)。

np_array = np.array(data)
x_np = torch.from_numpy(np_array)

From another tensor 从另一个tensor初始化

新张量保留参数张量的属性(形状,数据类型),除非显式覆盖。

x_ones = torch.ones_like(x_data) # retains 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")

image-20240507095106372

With random or constant values
具有随机值或常量值

shape 是张量维度的元组。在下面的函数中,它确定输出张量的维数。

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}")

image-20240507095334820

Attributes of a 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}")

image-20240507095546591

Standard numpy-like indexing and slicing
标准的numpy式索引和切片

tensor = torch.ones(4, 4)
print(f"First row: {tensor[0]}")
print(f"First column: {tensor[:, 0]}")
print(f"Last column: {tensor[..., -1]}")
tensor[:,1] = 0
print(tensor)

image-20240507100001132

Joining tensors 连接张量

连接张量您可以使用 torch.cat 将一系列张量沿着给定的维度连接起来。另请参见torch.stack,这是另一个与 torch.cat 略有不同的张量连接运算符。

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

image-20240507100440770

Arithmetic operations 算术运算

# This computes the matrix multiplication between two tensors. y1, y2, y3 will have the same value
# ``tensor.T`` returns the transpose of a tensor
y1 = tensor @ tensor.T
y2 = tensor.matmul(tensor.T)y3 = torch.rand_like(y1)
torch.matmul(tensor, tensor.T, out=y3)# This computes the element-wise product. z1, z2, z3 will have the same value
z1 = tensor * tensor
z2 = tensor.mul(tensor)z3 = torch.rand_like(tensor)
torch.mul(tensor, tensor, out=z3)

这段代码主要演示了如何在PyTorch中进行矩阵乘法和元素级乘法。

  1. 矩阵乘法:

    y1 = tensor @ tensor.Ty2 = tensor.matmul(tensor.T) 这两行代码都在进行矩阵乘法。@操作符和matmul函数都可以用于矩阵乘法。tensor.T返回tensor的转置。

    y3 = torch.rand_like(y1) 创建了一个与y1形状相同,元素为随机数的新tensor。

    torch.matmul(tensor, tensor.T, out=y3) 这行代码也在进行矩阵乘法,但是结果被直接写入了y3,而不是创建新的tensor。

  2. 元素级乘法:

    z1 = tensor * tensorz2 = tensor.mul(tensor) 这两行代码都在进行元素级乘法。*操作符和mul函数都可以用于元素级乘法。

    z3 = torch.rand_like(tensor) 创建了一个与tensor形状相同,元素为随机数的新tensor。

    torch.mul(tensor, tensor, out=z3) 这行代码也在进行元素级乘法,但是结果被直接写入了z3,而不是创建新的tensor。

矩阵乘法与元素级乘法是什么?

矩阵乘法和元素级乘法是两种不同的数学运算。

  1. 矩阵乘法:也被称为点积,是一种二元运算,将两个矩阵相乘以产生第三个矩阵。假设我们有两个矩阵A和B,A的形状是(m, n),B的形状是(n, p),那么我们可以进行矩阵乘法得到一个新的矩阵C,其形状是(m, p)。C中的每个元素是通过将A的行向量和B的列向量对应元素相乘然后求和得到的。
  2. 元素级乘法:也被称为Hadamard积,是一种二元运算,将两个矩阵相乘以产生第三个矩阵。假设我们有两个形状相同的矩阵A和B,那么我们可以进行元素级乘法得到一个新的矩阵C,其形状与A和B相同。C中的每个元素是通过将A和B中对应位置的元素相乘得到的。

在Python的NumPy和PyTorch库中,你可以使用@matmul函数进行矩阵乘法,使用*mul函数进行元素级乘法。

Single-element tensors

单元素张量

如果你有一个单元素张量,例如通过将张量的所有值聚合为一个值,你可以使用 item() 将它转换为Python数值。

agg = tensor.sum()
agg_item = agg.item()
print(agg_item, type(agg_item))

image-20240507102052385

In-place operations

就地操作

将结果存储到操作数中的操作称为就地操作。它们由 _ 后缀表示。例如: x.copy_(y)x.t_() ,将更改 x

print(f"{tensor} \n")
tensor.add_(5)
print(tensor)

image-20240507102216996

NOTE 注意
就地操作保存一些内存,但是在计算导数时可能会出现问题,因为会立即丢失历史。因此,不鼓励使用它们。

Bridge with NumPy

CPU和NumPy数组上的张量可以共享它们的底层内存位置,改变一个就会改变另一个。

张量到NumPy数组

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

image-20240507102621371

张量的变化反映在NumPy数组中。

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

image-20240507102720944

NumPy数组到张量

n = np.ones(5)
t = torch.from_numpy(n)

NumPy数组中的变化反映在张量中。

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

image-20240507102955148

Notebook来源:

[Tensors - PyTorch Tuesday 2.3.0+ cu 121文档 — Tensors — PyTorch Tutorials 2.3.0+cu121 documentation](

这篇关于Pytorch入门—Tensors张量的学习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/973731

相关文章

从入门到精通详解Python虚拟环境完全指南

《从入门到精通详解Python虚拟环境完全指南》Python虚拟环境是一个独立的Python运行环境,它允许你为不同的项目创建隔离的Python环境,下面小编就来和大家详细介绍一下吧... 目录什么是python虚拟环境一、使用venv创建和管理虚拟环境1.1 创建虚拟环境1.2 激活虚拟环境1.3 验证虚

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Java List 使用举例(从入门到精通)

《JavaList使用举例(从入门到精通)》本文系统讲解JavaList,涵盖基础概念、核心特性、常用实现(如ArrayList、LinkedList)及性能对比,介绍创建、操作、遍历方法,结合实... 目录一、List 基础概念1.1 什么是 List?1.2 List 的核心特性1.3 List 家族成

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c

史上最全MybatisPlus从入门到精通

《史上最全MybatisPlus从入门到精通》MyBatis-Plus是MyBatis增强工具,简化开发并提升效率,支持自动映射表名/字段与实体类,提供条件构造器、多种查询方式(等值/范围/模糊/分页... 目录1.简介2.基础篇2.1.通用mapper接口操作2.2.通用service接口操作3.进阶篇3

Python自定义异常的全面指南(入门到实践)

《Python自定义异常的全面指南(入门到实践)》想象你正在开发一个银行系统,用户转账时余额不足,如果直接抛出ValueError,调用方很难区分是金额格式错误还是余额不足,这正是Python自定义异... 目录引言:为什么需要自定义异常一、异常基础:先搞懂python的异常体系1.1 异常是什么?1.2

Python实现Word转PDF全攻略(从入门到实战)

《Python实现Word转PDF全攻略(从入门到实战)》在数字化办公场景中,Word文档的跨平台兼容性始终是个难题,而PDF格式凭借所见即所得的特性,已成为文档分发和归档的标准格式,下面小编就来和大... 目录一、为什么需要python处理Word转PDF?二、主流转换方案对比三、五套实战方案详解方案1:

Spring WebClient从入门到精通

《SpringWebClient从入门到精通》本文详解SpringWebClient非阻塞响应式特性及优势,涵盖核心API、实战应用与性能优化,对比RestTemplate,为微服务通信提供高效解决... 目录一、WebClient 概述1.1 为什么选择 WebClient?1.2 WebClient 与

PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例

《PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例》词嵌入解决NLP维度灾难,捕捉语义关系,PyTorch的nn.Embedding模块提供灵活实现,支持参数配置、预训练及变长... 目录一、词嵌入(Word Embedding)简介为什么需要词嵌入?二、PyTorch中的nn.Em