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

2023-11-05

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


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、基础优化方法

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动手学DL——深度学习预备知识随笔【深度学习】【PyTorch】 的相关文章

随机推荐

  • 线程池的基本创建方式and执行流程!

    一 什么是线程池 1 线程池 线程池是一种线程管理的机制 它是一组线程的集合 可以用来执行多个任务 线程池维护了一个固定数量的线程集合 可以从线程池中取出一个线程来执行任务 当任务执行完毕后 线程又会返回到线程池中 等待下一个任务的到来 当
  • 大学生电赛学习之路

    可以看到全国大学生电子设计大赛的认可度是非常高的 属于A类学科竞赛 电子设计大赛的形式也是给出题目 参赛者有四天三夜的时间解决问题 题目大致可以分为 控制类 测量类 高频类以及电力电子类 该竞赛会在单数年的9月份举行 但是对于新生来说电赛确
  • apk部分手机安装失败_安装apk解析包时出现错误怎么办?小编快速帮你解决

    Android智能手机的用户都会或多或少的遇到到这样的问题 安装apk解析包时出现错误 那么遇到这样的问题该如何解决 其实导致apk程序安装失败的原因是多方面的 而这所有的错误都基本归结于一点 解析包时出现错误 因此 我们只有采取逐个排查的
  • B、M、MB、K、KB、G、GB的关系

    一 概念 1 比特Bit 位 b 表示信息的最小单位 即计算机最小的存储单位 是二进制数的一位包含的信息或2个选项中特别指定1个的需要信息量 它代表从一个二进制数组中选出一元 0或1 所提供的信息量 若此二元出现的概率相等 2 字节Byte
  • Uncaught TypeError: Cannot read property ‘Component‘ of undefined

    Cannot read property Component of undefined 1 问题描述 2 解决方案 问题描述 上一篇文章中在本地搭建了第一个React项目后 跟着react中文文档学习 封装时钟的外观代码如下 class C
  • 23、账号与权限管理

    账号与权限管理 例如 生产当中 要自己创建账号 30天与 90天账号密码 本章内容 管理员用户账号和组账号 管理目录和文件的属性 文章目录 1 组的分类 2 用户的分类 3 passwd 文件账号记录详细说明 4 charge 命令 修改账
  • 关于FLAG_ACTIVITY_MULTIPLE_TASK

    FLAG ACTIVITY MULTIPLE TASK 总结 1 使用改标记 需要自行管理Activity 2 需要与FLAG ACTIVITY NEW DOCUMENT或者FLAG ACTIVITY NEW TASK共同使用 This f
  • Error in created hook: “TypeError: Object(...) is not a function“

    最近我在请求列表的时候发现请求列表报这个错 起初我是以为我的参数没有对 传给后台的是个对象 而不是json对象 但是我记得我转换了的 后来发现是我在引入封装请求的时候写错了 代码如下 import imgList from api base
  • 华为服务器手机日志文件损坏,服务器日志文件

    服务器日志文件 内容精选 换一换 华为云帮助中心 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用华为云服务 客户端IP指的是访问者 用户设备 的IP地址 在Web应用
  • 自动驾驶通信中间件ecal源码分析—1. 什么是ecal

    前面做了一套自动驾驶通信中间件 阅读了ROS 1 0 roscpp和ecal相关源码 接下来将逐步对ecal的核心源码进行简要分析 1 什么是ecal ecal是德国大陆开源的一套自动驾驶通信中间件 The enhanced Communi
  • 获取input上传文件文件名及扩展名

    1 使用input标签的type file 上传文件 获取上传文件的文件名和扩展名 代码如下
  • 安装httpd软件包

    安装httpd软件包 root www yum repos d mount dev sr0 media mount media WARNING device write protected mounted read only root ww
  • ESP32运行microPython报错:rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) configsip: 0, SPIWP:0xee

    使用Esp32调试microPython的时候 上传代码后一直报错 附 报错原因 以及解决方法 Arduino以及idf 均会出现 如下内容 无限循环打印 rst 0xc SW CPU RESET boot 0x13 SPI FAST FL
  • 自动化测试文档整理

    自动化测试 广义上讲一切使用代码或程序来辅助或代替人工测试的行为都认为是自动化测试 自动化测试作用 提高工作效率 释放人力 可以把人从一些重复性的工作中解放出来 应用环节 主要应用在回归测试和兼容性测试 适合自动化测试产品特点 1 需求比较
  • 基于深度学习的推荐算法——推荐系统模型搭建基础及DeepCrossing原理

    本章节从推荐系统模型搭建基础和DeepCrossing原理讲解及实操两方面展开 一 推荐系统模型搭建基础 1 Keras搭建模型 keras搭建模型主要有两种模式 一种是Sequential API 另外一种是Functional API
  • 10.用户登录——什么是token、生成token、token获取用户信息免密登录、登录装饰器

    1 为什么需要登录认证 换句话来说 为什么需要session cookie和token 这个认证信息需要的原因 就是比如说我们今天使用淘宝点击添加购物车 然后就需要一个请求 但是发送这个请求之前 需要验证是哪个用户所登录 所以就需要一个类似
  • 毕业设计-基于深度学习的人脸表情识别

    目录 前言 课题背景和意义 实现技术思路 一 深度学习理论基础 二 AdaBoost 结合 SVM 算法表情识别 三 基于 MTCNN 算法的人脸表情识别 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕
  • ideaj项目添加Junit

    像如下图片这样无法使用 test 是以为没有导入Junit包所导致的 所以先把对应的jar包导入进去 1 打开idea 点击右上角的文件 找到项目结构 2 打开项目结构之后 找到依赖 点击 号 在对应的ideaj安装路径的lib文件目录中找
  • C# 四种随机数生成算法 线性同余 莱默算法 Wichmann-Hill 延迟斐波那契数列

    Net自带随机数的调用 实质为线性同余 后面有介绍 double matrix new double 20 20 rows matrix LoadData C Somewhere SomeFile txt int lo 0 int hi 2
  • 动手学DL——深度学习预备知识随笔【深度学习】【PyTorch】

    文章目录 2 预备知识 2 1 数据操作 2 2 线性代数 矩阵计算 2 3 导数 2 4 基础优化方法 2 预备知识 2 1 数据操作 batch 以图片数据为例 一次读入的图片数量 小批量样本可以充分利用GPU进行并行计算提高计算效率