首页 > 其他分享 >深度学习——PyTorch基础

深度学习——PyTorch基础

时间:2024-03-24 22:59:41浏览次数:28  
标签:tensor torch 张量 学习 维度 PyTorch 深度 print Tensor

目录

一、Tensor

1、Tensor简介

(1)张量(Tensor)的解析

(2)张量(Tensor)的类型

(3)张量(Tensor)的维度延伸

(4)张量(Tensor)在深度学习中的应用

(5)张量(Tensor)的数学解读

(6)张量(Tensor)的综述

2、Tensor对象及其运算

(1)Tensor的基本属性:

(2)Tensor的创建:

(3)Tensor的运算:

(4)自动求导与梯度:

3、Tensor的索引和切片

(1)基本索引:

(2)切片:

(3)高级索引:

(4)负数索引:

(5)视图与副本:

4、Tensor的变换、拼接和拆分

(1)变换:

(2)拼接:

(3)拆分:

二、PyTorch的Reduction操作

三、PyTorch的自动微分

1、自动微分的概念:

2、Tensor的属性:

3、梯度计算:

4、梯度清零:


一、Tensor

1、Tensor简介
(1)张量(Tensor)的解析

理解张量(Tensor),就如同理解深度学习的 DNA。在数据科学和深度学习的世界中,张量(Tensor)犹如一把刀,功能强大,适应范围广泛。你可以将其想象为一个多维大礼盒竹,无论大礼盒内是一个还是多个数据元素,都可以被这个"大礼盒"完美包裹和处理。

(2)张量(Tensor)的类型

在这个数据包裹体系中,可以鲜明地区分出三种基础的类型:一是称为’标量’的O维张量,它就像一颗晶莹剔透的珍珠,孤独地存在于这个宇宙中。二是被名为’向量’的1维张量,它就像一条弯曲的小溪,顺流而下,信息从一个个元素中流淌过去。三是’矩阵’,一个2维张量,就像一张网,在每个交点上,都嵌入了一个数据元素。

(3)张量(Tensor)的维度延伸

张量(Tensor)的独特之处在于它的维度可以无限延伸,如3维张量,4维张量等等,这就好比在一个无尽的宇宙中,每个数据元素都是一个星球,而这些星球又被维度的线索以各种形式连接在一起。

(4)张量(Tensor)在深度学习中的应用

深度学习中对高维张量的处理就如同艺术家对颜色的运用,丰富且细致。比如一批色彩斑斓的图
像    可以被视为一个4维张量,每个维度象征着批    
次大小、图像宽度、图像高度和颜色通道。

(5)张量(Tensor)的数学解读

在数学的领域,张量(Tensor)就像一台能同时在多个坐标系统中运行的普适机器。以向量为例,无论你从何种视角去观察,它的长度和方向始终保持恒定,永不改变。

(6)张量(Tensor)的综述

张量(Tensor),作为揭示多维数据的神秘面纱的钥匙,在科学、工程学等领域中都有广泛应
用。特别是在深入探索机器学习和深度学习的过程中,张量(Tensor)无疑是一把锐利的剑,为我们开启了通向知识宝库的大门。

2、Tensor对象及其运算
(1)Tensor的基本属性:
  • torch.dtype: 表示Tensor的数据类型,例如torch.float32torch.int64等。
  • torch.device: 指定Tensor存储的设备,可以是CPU或GPU,以及设备编号。
  • torch.layout: 描述Tensor的布局方式。
(2)Tensor的创建:
  • 可以使用torch.tensor()从数据创建Tensor。
  • 使用torch.empty()torch.zeros()torch.ones()等可以创建特定形状和类型的Tensor。
(3)Tensor的运算:
  • 基本运算: 包括加法、减法、乘法、除法等,使用+-*/操作符。
  • 逐元素运算: 如torch.add()torch.subtract()等,这些函数会对两个Tensor进行逐元素操作。
  • 线性代数运算: 如矩阵乘法torch.matmul()、矩阵逆torch.inverse()等。
  • 索引与切片: 类似于Numpy,可以使用方括号[]进行索引和切片操作。
  • 变形: 如reshapesqueezeunsqueeze等,用于改变Tensor的形状。
(4)自动求导与梯度:
  • data: Tensor的实际数据部分。
  • grad: 数据对应的梯度。
  • grad_fn: 创建Tensor的函数,是自动求导的关键。
  • requires_grad: 是否需要计算梯度的标志。
import torch

# 创建一个Tensor
x = torch.tensor([1.0, 2.0, 3.0], dtype=torch.float32)

# 显示Tensor的属性
print(x.dtype)           # 输出: torch.float32
print(x.device)          # 输出: cpu
print(x.requires_grad)   # 输出: False

# Tensor的基本运算
y = torch.tensor([4.0, 5.0, 6.0], dtype=torch.float32)
z = x + y               # 逐元素相加

# Tensor的变形
w = x.unsqueeze(0)      # 在第0维上增加一个维度

# 自动求导示例
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
y = x * 2
z = y.sum()
z.backward()            # 计算梯度
print(x.grad)           # 输出: tensor([2., 4., 6.])
3、Tensor的索引和切片
(1)基本索引:
  • 可以对一维Tensor使用整数索引访问单个元素。
  • 对多维Tensor,需要提供索引列表,每个维度一个索引。
(2)切片:
  • 使用:符号可以对Tensor进行切片操作,包括单个维度和多个维度的情况。
  • 可以设置起始索引、结束索引和步长,默认步长为1。
(3)高级索引:
  • 可以使用整数Tensor来进行索引,实现更复杂的索引操作。
  • 支持使用布尔值Tensor进行条件选择。
(4)负数索引:
  • Tensor支持负数索引,表示从末尾开始计数。
(5)视图与副本:
  • 使用.view()方法可以改变Tensor的形状而不改变数据。
  • 使用.clone().detach()可以创建一个Tensor的副本。
import torch

# 创建一个二维Tensor
t = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# 基本索引
print(t[0])               # 输出第一行:tensor([1, 2, 3])

# 多维索引
print(t[0, 1])            # 输出第一个元素的第二个维度的值:2

# 切片
print(t[:, 1:3])          # 输出第二列到第三列之间的所有行:
                            # tensor([[2, 3],
                            #         [5, 6],
                            #         [8, 9]])

# 高级索引
index_tensor = torch.tensor([0, 2])
print(t[index_tensor])    # 输出第1行和第3行:
                            # tensor([[1, 2, 3],
                            #         [7, 8, 9]])

# 负数索引
print(t[-1])              # 输出最后一行:tensor([7, 8, 9])

# 视图与副本
v = t.view(1, -1)         # 将t变为1行9列的二维Tensor
print(v)                   # 输出:
                            # tensor([[1, 2, 3, 4, 5, 6, 7, 8, 9]])

c = t.clone()             # 或 c = t.detach()
print(id(t), id(c))        # 输出t和c的内存地址,不同地址表示是副本
4、Tensor的变换、拼接和拆分
(1)变换:
  • 使用reshape()方法可以改变Tensor的形状。
  • 使用transpose()方法可以交换Tensor的两个维度。
  • 使用permute()方法可以重新排列Tensor的维度。
(2)拼接:
  • 使用torch.cat()函数可以将多个Tensor沿着指定维度进行拼接。
  • 使用torch.stack()函数可以将多个Tensor沿着新的维度进行堆叠。
(3)拆分:
  • 使用torch.split()函数可以将一个Tensor沿着指定维度进行拆分。
  • 使用torch.chunk()函数可以将一个Tensor沿着指定维度进行分块。
import torch

# 创建一个Tensor
x = torch.tensor([[1, 2], [3, 4]])

# 变换
y = x.reshape(1, -1)       # 将x变为1行4列的二维Tensor
print(y)                   # 输出:tensor([[1, 2, 3, 4]])

z = x.transpose(0, 1)      # 交换第0维和第1维
print(z)                   # 输出:tensor([[1, 3], [2, 4]])

p = x.permute(1, 0)        # 重新排列维度,变为2行2列的二维Tensor
print(p)                   # 输出:tensor([[1, 3], [2, 4]])

# 拼接
a = torch.tensor([[5, 6]])
b = torch.cat((x, a), dim=0)    # 在第0维上拼接x和a
print(b)                   # 输出:tensor([[1, 2], [3, 4], [5, 6]])

c = torch.stack((x, a), dim=0)  # 在第0维上堆叠x和a
print(c)                   # 输出:tensor([[[1, 2], [3, 4]], [[5, 6], [0, 0]]])

# 拆分
d = torch.split(x, split_size_or_sections=1, dim=0)  # 在第0维上拆分x为两个Tensor
print(d[0])                # 输出:tensor([[1, 2]])
print(d[1])                # 输出:tensor([[3, 4]])

e = torch.chunk(x, chunks=2, dim=0)  # 在第0维上分块x为两个Tensor
print(e[0])                # 输出:tensor([[1, 2]])
print(e[1])                # 输出:tensor([[3, 4]])

二、PyTorch的Reduction操作

PyTorch的Reduction操作主要包括以下几种:

  1. 求和(sum):沿着指定维度对张量的元素求和。
  2. 平均值(mean):沿着指定维度对张量的元素求平均值。
  3. 最大值(max):沿着指定维度对张量的元素求最大值。
  4. 最小值(min):沿着指定维度对张量的元素求最小值。
  5. 乘积(prod):沿着指定维度对张量的元素求乘积。
import torch

# 创建一个张量
x = torch.tensor([[1, 2, 3], [4, 5, 6]], dtype=torch.float32)

# 求和
sum_x = x.sum(dim=0)
print("Sum:", sum_x)

# 平均值
mean_x = x.mean(dim=0)
print("Mean:", mean_x)

# 最大值
max_x = x.max(dim=0)
print("Max:", max_x)

# 最小值
min_x = x.min(dim=0)
print("Min:", min_x)

# 乘积
prod_x = x.prod(dim=0)
print("Prod:", prod_x)

输出结果:

>>>Sum: tensor([5., 7., 9.])
>>>Mean: tensor([2.5000, 3.5000, 4.5000])
>>>Max: (tensor([4, 5, 6]), tensor([1, 1, 1]))
>>>Min: (tensor([1, 2, 3]), tensor([0, 0, 0]))
>>>Prod: tensor([  4.,  60., 162.])

三、PyTorch的自动微分

1、自动微分的概念
  • 自动微分(Automatic Differentiation)是一种计算导数的技术,它能够自动计算复杂函数的导数。
  • 在深度学习中,自动微分用于计算损失函数关于模型参数的梯度,这是反向传播算法的核心部分。
2、Tensor的属性
  • PyTorch中的Tensor有两个模式:train模式和eval模式。在进行自动微分时,需要将Tensor设置为train模式。
  • 当Tensor执行了操作后,它会记住这些操作的历史,以便之后进行梯度计算。
3、梯度计算
  • torch.autograd能够自动计算任何计算图的梯度。它使用动态图的方式来记录操作历史,这使得调试变得简单。
  • 在计算梯度时,首先需要调用.backward()方法来开始反向传播过程。
4、梯度清零
  • 在每次梯度计算之后,通常需要调用.zero_()方法来清零梯度,以便进行下一轮的梯度计算
import torch

# 创建张量并设置requires_grad=True以跟踪计算
x = torch.ones(2, 2, requires_grad=True)
print(x)
# 输出:
# tensor([[1., 1.],
#         [1., 1.]], requires_grad=True)

# 简单的运算
y = x + 2
print(y)
# 输出:
# tensor([[3., 3.],
#         [3., 3.]], grad_fn=<AddBackward0>)

# 计算梯度
y.backward(torch.tensor([1., 1.], dtype=torch.float32))
print(x.grad)
# 输出:
# tensor([[1., 1.],
#         [1., 1.]])

# 清零梯度
x.grad.zero_()
print(x.grad)
# 输出:
# tensor([[0., 0.],
#         [0., 0.]])

标签:tensor,torch,张量,学习,维度,PyTorch,深度,print,Tensor
From: https://blog.csdn.net/2201_76007274/article/details/136996128

相关文章

  • 二、SQL基础学习(函数、约束、事务)
    目录1、函数1.1、字符串函数1.2、数值函数1.3、日期函数1.4、流程函数2、约束2.1、外键约束2.2、删除/更新行为3、事务3.1、事务的四大特性3.2、并发事务问题3.2、事务的隔离级别1、函数1.1、字符串函数#concatselectconcat('Hello','MySql');#lowers......
  • 人形机器人从人类演示(demenstration)数据中学习人类行为(behavior)的几种方式
    人形机器人从人类演示(demenstration)数据中学习的几种方式使用仿真环境,在仿真环境中生成近似人类的行为数据,然后利用仿真生成的数据训练机器人。该种方式最为传统,也最为易行,但是由于仿真环境下生成的数据(模拟仿真下训练的强化学习算法)与真实环境有一定差距,因此往往效果不是十......
  • 蟒蛇书入门学习笔记(3)Python列表
    列表列表是一种数据结构,用于储存一系列有序的数据,可以根据需要动态地增加或删除元素。列表在很多编程语言中都有内置的实现,常用的操作包括插入、删除、修改和查找元素。1.列表的表示列表可以包含字符、数字等等元素,一般来说用表示复数的名称(如letters,digits,names)命名列表,用......
  • 学习java时候的笔记(一)
    输出语句System.out.println("abc");//先打印abc,再进行换行System.out.print("abc");//只打印abc,不换行System.out.println();//不打印任何数据,只做换行处理。变量变量的定义格式数据类型变量名=数据值;demopublicclassVariableDemo1{ //主入口 publi......
  • nginx进阶-3(32-34天)学习笔记
    nginx进阶-3(33-34天)学习笔记知识回顾1.nginx部署单机网站2.nginx部署多个网站3.nginx访问方式4.nginx安全5.nginx加密访问实战00---nginx企业实战1.nginx搭建一个文件共享供用户下载的服务器#步骤1.配置nginx文件cd/usr/local/nginx/conf/vhostvibbs.conf......
  • nginx入门-31-学习笔记
    nginx入门-31-学习笔记环境环境:虚拟机ip:10.0.1.0网关:10.0.1.2子网掩码:255.255.255.0测试机器ip:10.0.1.101概念1.安装nginx软件安装:yum安装yuminstallepel-releaseyuminstallnginx-ysystemctlstartnginx编译安装(生产环境)yum-yinstallpcr......
  • OpenStack学习笔记02-虚拟化技术
    OpenStack学习笔记02-虚拟化技术OpenStackLinux这个笔记系列是跟着《云操作系统(OpenStack)》这本书来做的,每个笔记对应书中的一章,目前定下的目标是每天做一章,一直把书中的内容做完,希望我能实现。这次的笔记对应书中的第二章内容。一、环境准备准备了两个虚拟机,一个用来作为......
  • 最小斯坦纳树学习笔记
    本人非常菜如有错误请私信我指出参考文献:\(《程序员的数学4——图论入门》\)$\\([\)各类大佬写的笔记$](https://zzk.cnblogs.com/s?w=最小斯坦纳树问题)建议先学习最小生成树和最短路算法最小斯坦纳树(\(Minimum\Steiner\Tree\Problem\))可以理解为升级版的最小......
  • 人脸识别学习
    基于人脸识别及反作弊技术的在线评测系统如何使用摄像头Python调用摄像头Python调用摄像头是通过调用摄像头设备来实现的。具体来说,可以使用Python的OpenCV库来打开摄像头设备,并使用摄像头进行图像捕捉和处理。Python调用摄像头示例代码importcv2#打开摄像头设备#0表......
  • 电学——线性电路与叠加定理 学习笔记
    电学——线性电路与叠加定理学习笔记线性元件线性元件,是在电路中电流与电压有线性关系的电子元件,例如金属导体和电解液。在温度不变的情况下,其两端电压和电流的关系就可以近似的认为是线性的。(理想的)电阻是最普遍的线性元件,常见的线性元件还有(理想的)电容和电感。在伏安特性......