Pytorch 复习总结 1

Pytorch 复习总结,仅供笔者使用,参考教材:

  • 《动手学深度学习》

本文主要内容为:Pytorch 张量的常见运算、线性代数、高等数学、概率论。

Pytorch 张量的常见运算、线性代数、高等数学、概率论 部分 见 Pytorch 复习总结 1;
Pytorch 线性神经网络 部分 见 Pytorch 复习总结 2;
Pytorch 多层感知机 部分 见 Pytorch 复习总结 3;
Pytorch 深度学习计算 部分 见 Pytorch 复习总结 4;
Pytorch 卷积神经网络 部分 见 Pytorch 复习总结 5;
Pytorch 现代卷积神经网络 部分 见 Pytorch 复习总结 6;

目录

  • 一. 数据操作
    • 1. 张量的创建
    • 2. 张量的基本操作
    • 3. 按元素运算
    • 4. 原地运算
    • 5. 索引和切片
    • 6. 数据类型转换
  • 二. 数学运算
    • 1. 线性代数
    • 2. 高等数学
    • 3. 概率论

一. 数据操作

张量 tensor 是 PyTorch 中的核心数据结构,类似于 Numpy 中的数组 ndarray。张量的本质是 n 维数组,可以很好地支持 GPU 加速计算,并且支持自动微分。使用张量需要导入头文件 torchtype 类型为 torch.Tensor

1. 张量的创建

  • torch.arange(start=0, end, step=1):创建等差数列的行向量;
    import torch
    x = torch.arange(6)         # tensor([0, 1, 2, 3, 4, 5])
    y = torch.arange(1,6,2)     # tensor([1, 3, 5])
    
  • torch.zeros((a, b, ...)) / torch.ones((a, b, ...)) / torch.randn(a, b, ...) / torch.tensor([...]):创建元素全为 0 / 1 / 随机 / 指定的张量;
    import torch
    a = torch.zeros((2, 3, 4))
    b = torch.ones((5))
    c = torch.randn(3, 4)
    d = torch.tensor([[[2, 1], [4, 3]], [[1, 2], [3, 4]], [[4, 3], [2, 1]]])
    
  • torch.zeros_like(x):创建与 x 形状相同的全零张量;
    import torch
    x = torch.tensor([[1, 2, 3], [4, 5, 6]])
    y = torch.zeros_like(x)     # tensor([[0, 0, 0], [0, 0, 0]])
    

张量中的数据类型可以通过 dtype 属性指定:

类型说明
torch.float64双精度浮点数
torch.float32单精度浮点数
torch.float16半精度浮点数
torch.int6464 位有符号整数
torch.int3232 位有符号整数
torch.int1616 位有符号整数
torch.int88 位有符号整数
torch.uint88 位无符号整数

2. 张量的基本操作

  • x.shape / x.numel():返回张量的形状 / 元素总数;
    import torch
    x = torch.randn(3, 4)
    print(x.shape)      # torch.Size([3, 4])
    print(x.numel())    # 12
    
  • x.reshape(a, b):改变原有张量的形状并返回新的张量,可以用 -1 自动计算某一维度的维数;
    import torch
    x = torch.arange(12)
    y = x.reshape(3, 4)
    print(y.shape)      # torch.Size([3, 4])
    z = x.reshape(2, 3, -1)
    print(z.shape)      # torch.Size([2, 3, 2])
    
  • torch.cat((a, b), dim=n):将张量沿第 i 个轴拼接;
    import torch
    a = torch.arange(12, dtype=torch.float32).reshape((3,4))
    b = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
    x = torch.cat((a, b), dim=0)    # tensor([[ 0.,  1.,  2.,  3.], [ 4.,  5.,  6.,  7.], [ 8.,  9., 10., 11.], [ 2.,  1.,  4.,  3.], [ 1.,  2.,  3.,  4.], [ 4.,  3.,  2.,  1.]])
    y = torch.cat((a, b), dim=1)    # tensor([[ 0.,  1.,  2.,  3.,  2.,  1.,  4.,  3.], [ 4.,  5.,  6.,  7.,  1.,  2.,  3.,  4.], [ 8.,  9., 10., 11.,  4.,  3.,  2.,  1.]])
    
  • x.clone():张量的深拷贝( = 这是浅拷贝,两个张量共享同一内存地址);

3. 按元素运算

  • + / - / * / / / ** / %:按元素加 / 减 / 乘 / 除 / 幂 / 模;
    import torch
    x = torch.tensor([1.0, 2, 4, 8])
    y = torch.tensor([2, 2, 2, 2])
    a = x + y   # tensor([ 3.,  4.,  6., 10.])
    b = x - y   # tensor([-1.,  0.,  2.,  6.])
    c = x * y   # tensor([ 2.,  4.,  8., 16.])
    d = x / y   # tensor([0.5000, 1.0000, 2.0000, 4.0000])
    e = x ** y  # tensor([ 1.,  4., 16., 64.])
    f = x % y   # tensor([1., 0., 0., 0.])
    
  • torch.sin(x) / torch.cos(x) / torch.tan(x) / torch.sinh(x) / torch.cosh(x) / torch.tanh(x):按元素计算三角函数;
  • torch.exp(x) / torch.log(x):按元素计算指数 / 对数函数;
  • torch.logical_and(a, b)) / torch.logical_or(a, b)) / torch.logical_not(a):按元素逻辑与 / 或 / 非;
  • ><=torch.eq(a, b) / torch.gt(a, b) / torch.lt(a, b)) / torch.ge(a, b) / torch.le(a, b):按元素比较;

上面按元素运算都是在相同形状的两个张量上执行的,如果两个形状不同的张量调用按元素运算操作,会按 广播机制 执行。广播机制会先适当复制元素将两个张量补全成相同形状,再按元素操作:

import torcha = torch.arange(3).reshape((3, 1))
b = torch.arange(2).reshape((1, 2))
print(a+b)      # tensor([[0, 1], [1, 2], [2, 3]])

4. 原地运算

上一节介绍的运算都会为返回的张量分配新的内存,可以通过 id() 函数检查变量的内存地址:

import torchx = torch.tensor([1.0, 2, 4, 8])
y = torch.tensor([2, 2, 2, 2])
print(id(x))    # 2479607808944
x = x + y
print(id(x))    # 2479608211632

如果是在深度学习训练等场景中,参数会被不断更新,这样重复的操作会导致大量内存的无效占用。这时可以 执行原地操作,如 Z[:] = <expression>X+=Y

import torchx = torch.tensor([1, 2, 4, 8])
y = torch.tensor([1, 3, 5, 7])
z = torch.zeros_like(x)
print(id(x))    # 2049176339296
print(id(z))    # 2049176741984
z[:] = x + y
print(id(z))    # 2049176741984
x+=y
print(id(x))    # 2049176339296

5. 索引和切片

Pytorch 中的索引和切片和 Python 数组中操作一样:

import torchx = torch.arange(12).reshape((3,4))
print(x[-1])        # tensor([ 8,  9, 10, 11])
print(x[1:3])       # tensor([[ 4,  5,  6,  7], [ 8,  9, 10, 11]])
print(x[:, 1:3])    # tensor([[ 1,  2], [ 5,  6], [ 9, 10]])
x[2, 2] = 15
x[0:2, :] = 12
print(x)            # tensor([[12, 12, 12, 12], [12, 12, 12, 12], [ 8,  9, 15, 11]])

6. 数据类型转换

张量可以通过 torch.tensor().numpy().tolist() 函数实现与 list、ndarray 的相互转化:

import numpy as np
import torchnumpy_array = np.array([[1, 2, 3], [4, 5, 6]])
tensor = torch.tensor([[7, 8, 9], [10, 11, 12]])
python_list = [[1, 2, 3], [4, 5, 6]]tensor_from_numpy = torch.tensor(numpy_array)
numpy_from_tensor = tensor.numpy()
tensor_from_list = torch.tensor(python_list)
list_from_tensor = tensor.tolist()

当张量 只含单个元素 时,还可以使用 .item() 函数将其转化为标量:

import torchx = torch.tensor([3])
n = x.item()		# 3

二. 数学运算

1. 线性代数

  • A.T:矩阵转置,转置矩阵与原矩阵 共享内存空间
  • A*B:Hadamard 积,即按元素乘,记为 A ⊙ B A \odot B AB
  • torch.dot(x, y):列向量点积,记为 ⟨ x , y ⟩ \langle x, y\rangle x,y x T y x^Ty xTy
  • torch.mv(A, x):矩阵-向量积,记为 A x Ax Ax
  • torch.mm(A, B):矩阵-矩阵积,记为 A B AB AB
  • torch.abs(u).sum() / torch.norm(u):矩阵或向量的 L 1 L_1 L1 / L 2 L_2 L2 范数;
    import torch
    x = torch.tensor([3.0, -4.0])
    y = torch.tensor([[1, 2], [2, 3], [3, 4]], dtype=torch.float32)
    print(torch.abs(x).sum())   # tensor(7.)
    print(torch.norm(x))        # tensor(5.)
    print(torch.abs(y).sum())   # tensor(15.)
    print(torch.norm(y))        # tensor(6.5574)
    

2. 高等数学

如果想要计算张量的梯度,在创建张量的时候需要 requires_grad 属性设置为 True。然后对张量的函数值调用 .backward() 方法计算张量的梯度(即偏导数),张量的梯度与原张量具有相同形状。.backward() 方法的可选属性如下:

  • gradient 属性可以指定梯度的初始值,一般用于深度学习训练中梯度控制;
  • retain_graph 属性可以保留计算图以供后续的反向传播使用,以节省计算资源和时间。如果调用 .backward() 方法时不设置 retain_graph=True,多次使用同一个计算图进行反向传播时就会出现 RuntimeError,因为计算图已经被释放;
  • create_graph 属性在可以指定计算梯度的同时创建计算图,以计算高阶导数时使用;

调用 .backward() 方法后,PyTorch 会自动 计算张量的梯度,并将梯度存储在张量的 .grad 属性中。如果想要继续计算高阶导数,需要清空 .grad 属性值:x.grad = Nonex.grad.zero_()

  1. 张量的一阶导数:

    import torchx = torch.tensor(2.0, requires_grad=True)
    y = x**2
    y.backward()
    print("Gradient of x:", x.grad.item())  # Gradient of x: 4.0
    print("Type of x.grad:", type(x.grad)) 	# Type of x.grad: <class 'torch.Tensor'>
    
  2. 张量的二阶导数:

    import torchx = torch.tensor(2.0, requires_grad=True)
    y = x**3
    y.backward(create_graph=True)       # 计算一阶导数
    first_derivative = x.grad.clone()   # 获取一阶导数值
    x.grad = None                       # 清空一阶导数值,以便存储二阶导数
    first_derivative.backward()         # 计算二阶导数
    second_derivative = x.grad          # 获取二阶导数值
    print("Second derivative of x:", second_derivative.item())  # Second derivative of x: 12.0
    

然而,将 .backward() 函数的 create_graph 属性设置为 True 可能会导致内存泄漏。为了避免这种情况,创建计算图时经常使用 autograd.grad() 函数:

import torchx = torch.tensor(2.0, requires_grad=True)
y = x**4
first_derivative = torch.autograd.grad(y, x, create_graph=True)[0]  # 计算一阶导数
second_derivative = torch.autograd.grad(first_derivative, x)[0]     # 计算二阶导数
print("First derivative of x:", first_derivative.item())            # First derivative of x: 32.0
print("Second derivative of x:", second_derivative.item())          # Second derivative of x: 48.0

需要注意的是,求导的目标函数必须是标量,否则无法隐式创建梯度。

3. 概率论

  • 聚合函数:使用 torch.sum(x) / torch.mean(x) / torch.max(x) / torch.min(x) / torch.std(x) / torch.var(x) 计算张量元素的和 / 均值 / 最大值 / 最小值 / 标准差 / 方差,用法同 x.sum() / x.mean() / x.max() / x.min() / x.std() / x.var()。聚合函数可以通过 axis 指定聚合的维度:

    import torch
    x = torch.tensor([[[1, 2], [2, 3], [3, 4]], [[4, 5], [5, 6], [6, 7]]], dtype=torch.float32)
    a = x.sum()                 # tensor(48.)
    b = x.sum(axis=0)           # tensor([[ 5.,  7.], [ 7.,  9.], [ 9., 11.]])
    c = x.sum(axis=1)           # tensor([[ 6.,  9.], [15., 18.]])
    d = x.sum(axis=2)           # tensor([[ 3.,  5.,  7.], [ 9., 11., 13.]])
    e = x.sum(axis=[0, 1])      # tensor([21., 27.])
    

    还可以通过 keepdims 属性保持轴数不变:

    import torch
    x = torch.tensor([[[1, 2], [2, 3], [3, 4]], [[4, 5], [5, 6], [6, 7]]], dtype=torch.float32)
    a = x.sum(axis=1, keepdims=True)
    print(a)
    '''
    tensor([[[ 6.,  9.]],[[15., 18.]]])
    '''
    
  • 采样函数:可以使用 .sample() 函数对 torch.distributions 模块中的各种概率分布对象进行采样,常见分布如下:

    • torch.distributions.Categorical:分类分布,是一种离散型随机变量分布,用于描述随机变量取每个类别值的概率;
      import torch
      import torch.distributions as dist
      probs = torch.tensor([0.2, 0.3, 0.5])
      categorical_dist = dist.Categorical(probs)
      sample = categorical_dist.sample((20,))
      
    • torch.distributions.Bernoulli:伯努利分布,也叫两点分布,是一种离散型随机变量分布,用于描述二值变量取每个值的概率;
      import torch.distributions as dist
      p = 0.6
      bernoulli_dist = dist.Bernoulli(p)
      sample = bernoulli_dist.sample((20,))
      
    • torch.distributions.Multinomial:多项式分布,是一种离散型随机变量分布,是二项分布的一般形式;
      import torch
      import torch.distributions as dist
      n = 10
      probs = torch.tensor([0.1, 0.2, 0.7])
      multinomial_dist = dist.Multinomial(n, probs)
      sample = multinomial_dist.sample()
      
    • torch.distributions.Poisson:泊松分布,是一种离散型随机变量分布,用于描述随机变量在固定间隔中发生次数的概率;
      import torch.distributions as dist
      lam = 3
      poisson_dist = dist.Poisson(lam)
      sample = poisson_dist.sample((20,))
      
    • torch.distributions.Uniform:均匀分布,是一种连续型随机变量分布,用于描述随机变量在连续区间上均匀取值的情况;
      import torch.distributions as dist
      a, b = 3, 5
      uniform_dist = dist.Uniform(a, b)
      sample = uniform_dist.sample((5,))
      
    • torch.distributions.Exponential:指数分布,是一种连续型随机变量分布,是 Gamma 分布形状参数为 1 时的特例;
      import torch.distributions as dist
      lam = 3
      exponential_dist = dist.Exponential(lam)
      sample = exponential_dist.sample((20,))
      
    • torch.distributions.Normal:正态分布,是一种连续型随机变量分布,是最常见最一般的分布;
      import torch.distributions as dist
      mu = 0
      sigma = 1
      normal_dist = dist.Normal(mu, sigma)
      sample = normal_dist.sample((20,5))
      
    • torch.distributions.Gamma:Gamma 分布,是一种连续型随机变量分布,用于描述某一事件发生的等待时间;
      import torch.distributions as dist
      gamma_dist = dist.Gamma(2, 1)
      sample = gamma_dist.sample((20,))
      
    • torch.distributions.Beta:Beta 分布,是一种连续型随机变量分布,用于描述随机变量在有界区间 [0, 1] 上的取值情况;
      import torch.distributions as dist
      alpha, beta = 2, 5
      beta_dist = dist.Beta(alpha, beta)
      sample = beta_dist.sample((5,))
      

    .sample() 函数内可以加入采样张量的维度,为空则默认只采样一次,如果是一维张量,需要在维度后加上逗号,如:.sample((20,))

想要查找模块中更多的函数和类,可以调用 dir() 函数:

import torch
print(dir(torch.distributions))

想要查找特定函数和类的用法,可以调用 help() 函数:

import torch
help(torch.ones)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/679105.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一个适用于后渗透期间的信息收集工具

介绍 Pillager是一个适用于后渗透期间的信息收集工具&#xff0c;可以收集目标机器上敏感信息&#xff0c;方便下一步渗透工作的进行。 支持 注&#xff1a;✅表示经过测试&#xff0c;&#x1f6a7;表示理论上支持但未经测试&#xff0c;❌表示无此功能或不支持 后续将会陆续…

CSP-202006-1-线性分类器

CSP-202006-1-线性分类器 解题思路 通过比较第一个训练数据点的类别和直线函数值的正负来确定标准类别和标准函数值的正负。循环遍历训练数据中的每个点&#xff0c;计算直线函数值并与标准函数值比较&#xff0c;以确定该点所在的类别。 如果当前点的类别与标准类别一致&…

Lua: 一门轻量级、高效的脚本语言

Lua: 一门轻量级、高效的脚本语言 在当今软件开发的领域中&#xff0c;寻找一门既灵活又高效的脚本语言&#xff0c;一直是开发者们追求的目标。Lua作为一门小巧、高效、可嵌入的脚本语言&#xff0c;已经成为了众多开发者的首选之一。无论是游戏开发、嵌入式系统、Web 开发还是…

程序设计语言的组成

程序设计语言的组成 程序设计语言基本上由数据、运算、控制、传输组成 数据成分 数据是程序操作的对象&#xff0c;具有存储类别、类型、名称、作用域和生存期等属性 从不同角度可将数据进行不同的划分。 数据类型的分类如下&#xff1a; 按程序运行过程中数据的值能否改…

ncc匹配提速总结

我们ncc最原始的匹配方法是&#xff1a;学习模板w*h个像素都要带入ncc公式计算 第一种提速&#xff0c;学习模板是w*h&#xff0c;而我们支取其中的w/2*h/2,匹配窗口同理&#xff0c;计算量只有1/4。 另外一种因为ncc是线性匹配&#xff0c;我们在这上面也做了文章&#xff0…

Lua weak表

之前写过一篇博客专门介绍了weak表&#xff1a;Lua弱引用表-CSDN博客&#xff0c;这两天阅读了《programming in lua》后有了些新的体会&#xff0c;在这里只做一些之前没有了解的补充内容。 定义 Lua 自动进行内存的管理。程序只能创建对象&#xff08;表&#xff0c;函数等…

鸿蒙harmony--TypeScript对象详解

生活就是用那一两分的甜&#xff0c;冲淡那八九分的苦&#xff0c;把身体照顾好&#xff0c;把喜欢的事做好&#xff0c;把重要的人待好&#xff0c;你要的一切都在路上&#xff01; 目录 一&#xff0c;定义 二&#xff0c;属性修饰符 2.1 可选属性 2.2 readonly 属性 三&…

【面试】互联网软件研发岗位,面试内容准备方向(技术面试考察点)

【面试】互联网软件研发岗位&#xff0c;面试内容准备方向&#xff08;技术面试考察点&#xff09; 文章目录 1、简历筛选与面试评价2、面试内容&#xff08;通用 & 沟通表达&#xff09;3、面试内容&#xff08;八股 & 基础知识&#xff09;4、面试内容&#xff08;项…

《UE5_C++多人TPS完整教程》学习笔记2 ——《P3 多人游戏概念(Multiplayer Concept)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P3 多人游戏概念&#xff08;Multiplayer Concept&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&#xff08;也是译…

如何把手机平板变为电脑的屏幕

文章目录 安装软件运行效果结尾 本文首发地址 https://h89.cn/archives/181.html 最新更新地址 https://gitee.com/chenjim/chenjimblog 闲置的手机平板、触屏音箱等&#xff0c;均可作为电脑的扩展屏&#xff0c;为电脑增加一块显示屏&#xff0c;本文介绍如何使用免费的软件s…

DS Wannabe之5-AM Project: DS 30day int prep day12

Q1. Where is the confusion matrix used? Which module would you use to show it? 混淆矩阵 混淆矩阵常用于评估分类模型的性能&#xff0c;特别是在二分类或多分类问题中。它展示了实际类别与模型预测类别之间的关系。在Python中&#xff0c;可以使用sklearn.metrics模块…

代码随想录算法训练营DAY13 | 栈与队列 (3)

一、LeetCode 239 滑动窗口最大值 题目链接&#xff1a;239.滑动窗口最大值https://leetcode.cn/problems/sliding-window-maximum/ 思路&#xff1a;使用单调队列&#xff0c;只保存窗口中可能存在的最大值&#xff0c;从而降低时间复杂度。 public class MyQueue{Deque<I…

【闲谈】初识深度学习

在过去的十年中&#xff0c;深度学习彻底改变了我们处理数据和解决复杂问题的方式。从图像识别到自然语言处理&#xff0c;再到游戏玩法&#xff0c;深度学习的应用广泛且深入。本文将探讨深度学习的基础知识、关键技术以及最新的研究进展&#xff0c;为读者提供一个全面的视角…

9 scala的类继承及trait

1 class 继承 为了提高代码的重用性&#xff0c;提高开发效率&#xff0c;Scala 的 class 是支持继承的。 Scala 的继承与 Java 的继承非常类似&#xff1a; (1) 单继承&#xff1a; 类似于 Java&#xff0c;Scala 也只支持单继承&#xff0c;一个类只能直接继承自一个父类…

第三节 zookeeper基础应用与实战2

目录 1. Watch事件监听 1.1 一次性监听方式&#xff1a;Watcher 1.2 Curator事件监听机制 2. 事务&异步操作演示 2.1 事务演示 2.2 异步操作 3. Zookeeper权限控制 3.1 zk权限控制介绍 3.2 Scheme 权限模式 3.3 ID 授权对象 3.4 Permission权限类型 3.5 在控制台…

Linux中孤儿/僵尸进程/wait/waitpid函数

孤儿进程&#xff1a; 概念&#xff1a;若子进程的父进程已经死掉&#xff0c;而子进程还存活着&#xff0c;这个进程就成了孤儿进程。 为了保证每个进程都有一个父进程&#xff0c;孤儿进程会被init进程领养&#xff0c;init进程成为了孤儿进程的养父进程&#xff0c;当孤儿…

DataBinding简易入门

简介 DataBinding是Google在18年推出的数据绑定框架&#xff0c;采用了MVVM模式来降低各模块之间代码的耦合度&#xff0c;使得整体代码逻辑设计更加清晰。众所周知&#xff0c;MVVM类似于MVC&#xff0c;主要目的是为分离View&#xff08;视图&#xff09;和Model&#xff08…

学习之旅10------掌握jQuery:实用应用案例深度解析

目录 写在开头1. jQuery基础知识回顾1.1. 选择器1.2. 事件1.3. 效果1.4. DOM操作1.5. AJAX 2. 实用应用案例分析2.1. 动态内容加载2.2. 表单验证2.3. 图像滑动门效果2.4. 创建动态导航菜单 3. 高级技巧与最佳实践3.1. 优化jQuery代码的性能3.2. jQuery插件的使用和自定义3.3. j…

人工智能在金融领域的革新:挑战与机遇

人工智能在金融领域的应用已经带来了革命性的变化&#xff0c;它不仅提高了金融服务的效率和便利性&#xff0c;也为金融机构提供了更多的数据分析和风险管理工具。然而&#xff0c;人工智能在金融领域的应用也面临着一些挑战&#xff0c;下面将就这些挑战和机遇进行探讨。 挑战…

MATLAB知识点:isempty函数(★★★★☆)判断数组是否为空

​讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 节选自第3章&#xff1a;课后习题讲解中拓展的函数 在讲解第…