动手学DL——深度学习预备知识随笔【深度学习】【PyTorch】

news2024/11/26 10:23:25

文章目录

  • 2、预备知识
    • 2.1、数据操作
    • 2.2、线性代数&矩阵计算
    • 2.3、导数
    • 2.4、基础优化方法

2、预备知识

2.1、数据操作

在这里插入图片描述

batch:以图片数据为例,一次读入的图片数量。

小批量样本可以充分利用GPU进行并行计算提高计算效率。

  • 数据访问

    数组:np.array To pd.Series To torch.tensor

在这里插入图片描述

  • 二维张量的写法

    a = torch.ones(4,9)
    a = torch.ones((4,9))#李沐老师
    
    a = torch.arange(36).reshape(4,9)
    a = torch.arange(36).reshape((4,9))#李沐老师
    

    多加一个括号,结果都是一致的,都是表示二维张量,张量形状都是(4,9),所以二维有两种写法,但再加一层括号,形状就变成了(1,4,9)三维,判断维数技巧:最外面的括号去掉开始数,比如:

    a = torch.ones((((((4,9)))))) 
    

    这个形状是(1,1,1,1,1,4,9)

  • 将多个张量沿指定的维度进行连接

    torch.cat(inputs, dim=0, out=None)
    
    • inputs:一个或多个输入张量(可以是相同形状的多个张量)。
    • dim:指定的连接维度,默认为0。
    • out:输出的张量,默认为None
  • 不同形状向量相加广播机制(broadcasting mechanism)【必须同纬度】

    a = torch.arange(3).reshape(3,1)
    b = torch.arange(2).reshape(1,2)
    a + b
    

    ( 0 1 2 ) − > ( 0 0 1 1 2 2 ) \begin{pmatrix} 0 \\ 1 \\ 2\\ \end{pmatrix} ->\begin{pmatrix} 0 & 0 \\ 1 & 1\\ 2 & 2\\ \end{pmatrix} 012 > 012012

    ( 0 1 ) − > ( 0 1 0 1 0 1 ) \begin{pmatrix} 0 &1 \end{pmatrix} ->\begin{pmatrix} 0 & 1 \\ 0 & 1\\ 0 & 1\\ \end{pmatrix} (01)> 000111

    ( 0 0 1 1 2 2 ) + ( 0 1 0 1 0 1 ) = ( 0 1 1 2 2 3 ) \begin{pmatrix} 0 & 0 \\ 1 & 1\\ 2 & 2\\ \end{pmatrix} + \begin{pmatrix} 0 & 1 \\ 0 & 1\\ 0 & 1\\ \end{pmatrix} =\begin{pmatrix} 0 & 1 \\ 1 & 2\\ 2 & 3\\ \end{pmatrix} 012012 + 000111 = 012123

    向量|张量相加得到了意外的结果,可以考虑是不是误将不同形状的向量相加了,触发了广播机制。

  • 使用sum求和(沿某个轴方向 axis )

    axis = ?意味着把那一维压缩

    在这里插入图片描述

    keepdims=True 表示保持求和结果的维度和原数组一致。保持维度一致通常是为了方便后续的运算或对结果的处理。

    a.sum(axis=0,keepdims=True).shape,a.sum(axis=0,keepdims=True)
    

    (torch.Size([1, 5, 4]),
    tensor([[[2., 2., 2., 2.],
    [2., 2., 2., 2.],
    [2., 2., 2., 2.],
    [2., 2., 2., 2.],
    [2., 2., 2., 2.]]]))

    这里keepdims=True和广播有很好的搭配效果。每一个元素/sum,维度同但形状不同,广播,维度同形状也同,可以执行。

  • 复制,可能会导致开辟新内存

    before = id(y)
    x = x + y
    id(y) == before
    

    False

    执行原地操作的两种方式:

    x[:] = x + y 
    
    x += y
    

    注意

    b[:] = a;#类似于view b变a也一起变,这种写法实际使用时b不轻易改变
    

    避免大张量的过度复制,减少内存开销。

    z = X.clone()#Z得到一个X的副本
    
  • numpy 转 torch ,反之不可行

    a  = x.numpy()
    b = torch.tensor(a)
    type(a),type(b)
    

    (numpy.ndarray, torch.Tensor)

    在jupyter 中一次性输出多个内容使用逗号间隔实现

  • 将大小为1的张量转换为 Python标量

    使用 item(),或者强制类型转换实现

    a = torch.tensor([3.5])
    a,a.item(),float(a),int(a)
    

    (tensor([3.5000]), 3.5, 3.5, 3)

  • pandas读入,再缺失值处理,转为torch张量的过程

    import pandas as pd
    data = pd.read_csv(data_file)
    

    缺失值处理:插值法 or 删除

    inputs, outputs = data.iloc[:,0:2],data.iloc[:,2]
    inputs = inputs.fillna(inputs.mean())
    inputs = pd.get_dummies(inputs, dummy_na =True)
    

    pd.get_dummies()函数将输入的数据集inputs中的每个分类变量【不是数值的,比如字符串值】都拆分为多个二进制变量,每个变量表示一种可能的分类。dummy_na=True参数表示要在创建虚拟变量时包含对缺失值的处理【把NaN也视为一类情况】。

    import torch 
    X,y = torch.tensor(inputs.values),torch.tensor(outputs.values)
    X,y
    

2.2、线性代数&矩阵计算

  • 乘法(矩阵乘向量)

    c = A b     w h e r e     c i = ∑ i A i j b j c = Ab \ \ \ where \ \ \ c_i = \sum_i A_{ij}b_j c=Ab   where   ci=iAijbj

  • 乘法(矩阵乘矩阵)

    C = A B     w h e r e     C i k = ∑ j A i j B j k C = AB\ \ \ where\ \ \ C_{ik} = \sum_j A_{ij}B_{jk} C=AB   where   Cik=jAijBjk

  • 求范数

    向量的模推广到矩阵,范数就是‘矩阵的模’。

    ∣ ∣ a ∣ ∣ 2 = [ ∑ i = 1 m a i 2 ] 1 2 ||a||_2 =[\sum_{i=1}^ma_i^2]^{\frac{1}{2}} ∣∣a2=[i=1mai2]21

    下面是计算张量的2范数|F范数【Frobenius范数】:

    torch.norm(torch.ones((4,9)))
    

    ∣ ∣ A ∣ ∣ F r o b = [ ∑ i j A i j 2 ] 1 2 ||A||_{Frob} =[\sum_{ij}A_{ij}^2]^{\frac{1}{2}} ∣∣AFrob=[ijAij2]21

2.3、导数

用的少。pytorch 实现了自动微分计算自动求导。

  • 压导数

    将导数拓展到不可微的函数。

    在这里插入图片描述

  • 计算图

    张量的计算通常会生成计算图。当你执行张量操作时,例如加法、乘法、矩阵乘法、激活函数等,这些操作会被记录到计算图中。计算图是一个有向无环图(DAG),其中节点表示张量操作,边表示操作之间的依赖关系。

    自动求导的两种模式

    链式法则: ∂ y ∂ x = ∂ y ∂ u n ∂ u n ∂ u n − 1 . . . ∂ u 2 ∂ u 1 ∂ u 1 ∂ x \frac{∂y}{∂x}=\frac{∂y}{∂u_n}\frac{∂u_n}{∂u_{n-1}}...\frac{∂u_2}{∂u_1}\frac{∂u_1}{∂x} xy=unyun1un...u1u2xu1

    • 正向积累 ∂ y ∂ x = ∂ y ∂ u n ( ∂ u n ∂ u n − 1 ( . . . ( ∂ u 2 ∂ u 1 ∂ u 1 ∂ x ) ) ) \frac{∂y}{∂x}=\frac{∂y}{∂u_n}(\frac{∂u_n}{∂u_{n-1}}(...(\frac{∂u_2}{∂u_1}\frac{∂u_1}{∂x}))) xy=uny(un1un(...(u1u2xu1)))

    • 反向积累、又称反向传递 ∂ y ∂ x = ( ( ( ∂ y ∂ u n ∂ u n ∂ u n − 1 ) . . . ) ∂ u 2 ∂ u 1 ) ∂ u 1 ∂ x \frac{∂y}{∂x}=(((\frac{∂y}{∂u_n}\frac{∂u_n}{∂u_{n-1}})...)\frac{∂u_2}{∂u_1})\frac{∂u_1}{∂x} xy=(((unyun1un)...)u1u2)xu1

      反向传播逻辑与高数手写复合函数求导完全一致。

      在这里插入图片描述

    求导和反向传播:计算图可以帮助自动计算函数的导数,特别是在深度学习中的反向传播算法中。通过在计算图中计算每个节点的梯度,可以从输出端反向传播梯度到输入端,以便优化模型的参数。

    x.requires_grad_(True)#使用requires_grad=True参数来指定需要对其求导,计算时会存储梯度
    x.grad#访问梯度,目前未计算是空的
    
    y = 2 * torch.dot(x,x )#内积
    y
    

    tensor(28., grad_fn=<MulBackward0>)

    y.backward()#求导
    x.grad
    

    tensor(28., grad_fn=<MulBackward0>)

    x.grad == 4 * x#判断 导数是不是 4x
    

    tensor([True, True, True, True])

    x.grad.zero_()#默认情况pytorch会累积梯度,需要清除之前的值。
    y = x.sum()# y =x1+x2+x3+...
    y.backward()
    y,x.grad
    

    (tensor(6., grad_fn=<SumBackward0>), tensor([1., 1., 1., 1.]))


    非标量调用 backward,需要传入 gradient 参数

    【在PyTorch中,反向传播(backward)函数用于计算非标量张量的梯度。当计算标量的梯度时,PyTorch会自动计算并传播梯度,而无需明确传入梯度参数。然而,当处理非标量张量时,需要手动传入梯度参数。】

x.grad.zero_()
y = x * x
#等价于 y.backword(torch.ones(len(x)))
y.sum().backward()
y,x.grad


>#### (tensor([0., 1., 4., 9.], grad_fn=\<MulBackward0>), tensor([0., 2., 4., 6.]))

>`y.sum().backward()` 是使用 PyTorch 的自动微分功能进行反向传播。它计算了 `y` 张量的和,并通过链式法则将梯度传播回各个输入张量。这里的输入张量是 `x`。

<hr>



~~~python
x.grad.zero_()
y =x * x 
#由于 y 是通过对 x 进行元素级乘法实现的(y = x * x),因此 y 对于每个元素 x[i] 的梯度是 2 * x[i]
u = y.detach()
#用于将张量 y 从计算图中分离出来,并且将其梯度信息置为无。这样做的目的是防止梯度回传时对 u 的梯度计算,从而实现对 u 的一种冻结。通常,当希望保留某个张量的值,但不想在反向传播过程中计算它的梯度时,就会使用 detach() 方法。通过将张量分离并赋给一个新的变量,在接下来的计算过程中使用这个新变量 u,而且它的梯度会被忽略,从而实现参数冻结或临时截断梯度流的目的。
z = u *x

z.sum().backward()
x.grad == u

tensor([True, True, True, True])

2.4、基础优化方法

  • 梯度计算往往是深度学习中成本最贵的。

  • 小批量随机梯度下降是深度学习默认的求解方法。

  • 两个重要的超参数是 批量大小和学习率。

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

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

相关文章

mfc100u.dll丢失的4种解决方法分享,快速修复mfc100u.dll文件

在现代数字化时代&#xff0c;计算机已经成为了我们生活和工作的不可或缺的一部分。然而&#xff0c;随着软件的不断发展和更新&#xff0c;有时我们可能会遇到一些令人头疼的问题&#xff0c;例如MFC100U.DLL文件的丢失。当你第一次看到这个错误提示时&#xff0c;估计是一脸懵…

学好Elasticsearch系列-核心概念

本文已收录至Github&#xff0c;推荐阅读 &#x1f449; Java随想录 文章目录 节点角色master&#xff1a;候选节点data&#xff1a;数据节点Ingest&#xff1a;预处理节点ml&#xff1a;机器学习节点remote_ cluster_ client&#xff1a;候选客户端节点transform&#xff1a;…

2022 China Open Source Report

| 翻译&#xff1a;黄绍雅、岳扬、刘文涛、李思颖 | 编辑&#xff1a;胡欣元 | 设计&#xff1a;胡欣元 As 2022 finally came to an end, we also emerged from the challenging years of the three-year-long COVID pandemic. The new edition of the "China Open Sourc…

【多选框、表格全选】element el-checkbox、el-table

话不多说 先看效果&#xff1a; 多选框&#xff1a; 表格全选&#xff1a; <template><div><div class"titleLabel"><div class"lineStyle"></div>统计部门</div><div style"display: flex"><e…

服务网格简介:探索现代微服务架构中的服务网格概念和价值

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

Tiktok最全客户开发以及运营攻略,建议收藏

Tiktok最近很多粉丝朋友问我要怎么做&#xff0c;今天就来分享一下如何利用Tiktok开发客户以及运营思路&#xff0c;文章略长&#xff0c;需要安装包看文末&#xff0c;喜欢的点赞加关注。 一、外贸企业为什么要做Tiktok‍ TikTok作为一个全球范围内流行的短视频平台&#xf…

Django3 模糊查询/filters.SearchFilter的使用,基于viewsets.ModelViewSet

背景描述 模型 from django.db import modelsfrom interfaces.validate import validate_include from testcases.models import Testcases from utils.base_models import BaseModel from utils.pure_validator import JSONValidatorclass Interfaces(BaseModel):id models…

嵌入式Linux驱动开发——常见框架梳理

前言 本文主要介绍了Linux驱动开发中一些常用的驱动框架&#xff0c;platform、input、iic、spi等&#xff0c;硬件平台使用的是正点原子的imx6ull开发板。 一&#xff1a;Pinctrl子系统、Gpio子系统 不管什么框架最后都是要追溯到配置IO的电气属性和复用功能 如果要使用外部…

一起学数据结构(1)——复杂度

目录 1. 时间复杂度&#xff1a; 1.1 时间复杂度的概念&#xff1a; 1.2 时间复杂度的表示及计算&#xff1a; 1.3 较为复杂的时间复杂度的计算&#xff1a; 2. 空间复杂度&#xff1a; 2.1 空间复杂度的概念&#xff1a; 2.2 空间复杂度的计算&#xff1a; 1. 时间复杂度…

Kubernetes 简介:容器编排与集群管理的进化

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

Mybatis-plus从入门到精通

1、什么是MyBatis-Plus MyBatis-Plus&#xff08;简称MP&#xff09;是一个基于MyBatis的增强工具&#xff0c;在MyBatis的基础上对其进行扩展&#xff0c;用于简化MyBatis操作&#xff0c;提高开发效率。它继承了MyBatis原生的所有特性&#xff0c;并且添加了一些额外的功能&…

《TCP IP网络编程》第十章

第 10 章 多进程服务器端 10.1 进程概念及应用 并发服务端的实现方法&#xff1a; 通过改进服务端&#xff0c;使其同时向所有发起请求的客户端提供服务&#xff0c;以提高平均满意度。而且&#xff0c;网络程序中数据通信时间比 CPU 运算时间占比更大&#xff0c;因此&#…

探析国内数字孪生引擎技术现状

在数字孪生软件来发中&#xff0c;渲染引擎是一个关键点&#xff0c;国内大多数字孪生平台引擎通常使用的是自研的渲染引擎或者采用开源的渲染引擎。下面通过一些常见的渲染引擎在国内数字孪生引擎中的应用带大家了解数字孪生软件开发的方式。 自研渲染引擎&#xff1a;许多数…

CNN + Vision Transformer 结合学习

介绍三篇结合使用CNNTransformer进行学习的论文&#xff1a;CvT&#xff08;ICCV2021&#xff09;&#xff0c;Mobile-Former&#xff08;CVPR2022&#xff09;&#xff0c;SegNetr&#xff08;arXiv2307&#xff09;. CvT: Introducing Convolutions to Vision Transformers, …

利用 trait 实现多态

我在书上看到基于 std::io::Write 的示例&#xff0c;它是一个 trait 类型&#xff0c;内部声明了一些方法。和 go 语言不同&#xff0c;rust 中类型必须明确实现 trait 类型&#xff0c;而 go 语言属于 duck 模式。 std::io::Write下面的例子中调用 write_all 方式来演示&…

标签是系列色并且加粗帆软

标签是系列色并且加粗 function(){return <span style"color:this.color;">FR.contentFormat(this.value, #,##0)</span>;}

UI 自动化的 PageObject 设计模式

目录 前言&#xff1a; 什么是 PageObject 模型&#xff1f; 为什么使用 PageObject 模型&#xff1f; PO 模式优点 PageObject 实践 前言&#xff1a; UI 自动化是一种软件测试方法&#xff0c;它主要用于检查应用程序的用户界面是否符合预期。PageObject 是 UI 自动化中…

AI大模型时代下运维开发探索第一篇:ReAct工程初探

引子 人工智能大模型的出现&#xff0c;已渐渐地影响了我们的日常生活和工作方式。生活中无处不在的AI&#xff0c;使我们的生活变得更加智能和便捷。工作中&#xff0c;AI大模型的高效和精准&#xff0c;极大地提升了我们解决问题的效率。 是的&#xff0c;我们不能忽视AI大…

Delphi 开发者,显示图片请忘掉VCL中的 TImage 吧

目录 序言 使用TImageCollection和TVirtualImageList组件支持高分辨率图像 一、总览 二、使用图像收集组件TImageCollection 2.1 图像收集组件编辑器 2.2 将现有 TImageList 载入 TImageCollection 三、使用Virtual ImageList 组件 3.1 Virtual ImageList Component 编辑…

【数据结构】| 王道考研——树的前世今生

目录 一. &#x1f981; 前言二. &#x1f981; 各种树的知识点1. 树1.1 概念1.2 属性1.3 常考性质1.4 树转换成二叉树1.5 森林转换为二叉树1.6 二叉树转换为森林1.7 树的遍历1.8 森林的遍历 2. 二叉树2.1满二叉树2.2 完全二叉树2.3二叉排序树2.4 平衡二叉树2.5 二叉树常考性质…