学习笔记-李沐动手学深度学习(一)(01-07,概述、数据操作、tensor操作、数学基础、自动求导)

个人随笔

第三列是 jupyter记事本
在这里插入图片描述
官方github上啥都有(代码、jupyter记事本、胶片)
https://github.com/d2l-ai
在这里插入图片描述

多体会

【梯度指向的是值变化最大的方向】

符号

在这里插入图片描述

维度

(弹幕说)2,3,4越后面维度越低 4就是一维有4个标量
在这里插入图片描述

00-预告

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

01-课程安排

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

02-深度学习介绍

【语言是一个符号】
【深度学习是机器学习的一种】
最热的方向:深度学习和CV、NLP结合

【AI地图】
① 如下图所示,X轴是不同的模式,最早的是符号学,然后概率模型、机器学习。Y轴是我们想做什么东西,感知是我了解这是什么东西,推理形成自己的知识,然后做规划。
② 感知类似我能看到前面有个屏幕,推理是基于我看到的东西想象未来会发生什么事,根据看到的现象、数据,形成自己的知识,知道所有知识后能进行长远的规划,未来怎么做

在这里插入图片描述

① 自然语言处理目前还是停留在感知上,人几秒钟能反应过来的东西都属于感知范围,即使像中文翻译成英文,英文翻译成中文那种。
② 计算机视觉可以在图片里面可以做一些推理。
③ 自然语言处理里面有符号,所以有符号学,并且还可以用概率模型、机器学习。计算机视觉面对的是图片,图片里面都是一个个像素,像素很难用符号学来解释,所以计算机视觉大部分用概率模型、机器学习来解释。
④ 深度学习是计算机视觉中的一种方法,它还有其他应用方法。

图片分类

在这里插入图片描述

① 可以看到从12年开始,图片分类错误率开始有一个比较大的下降,12年就是深度学习引入图片分类的开始。

② 17年的时候,几乎所有的团队都可以做到5%以内的错误率,基本上可以达到人类在图片识别上的精度了。可以说在图片分类上,深度学习已经做的很好了
在这里插入图片描述

物体检测和分割

① 知道图片是内容,在什么地方,这就是物体检测。

② 物体分割是指每个像素它到底是飞机还是人。

在这里插入图片描述

样式迁移

相当于滤镜
在这里插入图片描述

人脸合成

在这里插入图片描述

文字生成图片

在这里插入图片描述

文字生成

在这里插入图片描述

无人驾驶

在这里插入图片描述

【案例】广告点击

在这里插入图片描述
p是用户点击的概率
在这里插入图片描述
在这里插入图片描述

【完整的故事】

在这里插入图片描述

QA

有效和可解释性是不同的

有效应该是 简单的解释一下
可解释性更深入

领域专家:甲方、产品经历、提业务需求的人,了解业务的人
数据科学家:乙方,实现需求的人, 搬砖工程师(偏广)
AI专家: 资深数据科学家, 不仅能实现 还要提高精度(偏深)

如何找论文?后续会讲

03-安装(CPU,后续将GPU)

d2l:Diving Into Deep Learning动手学深度学习的缩写
在这里插入图片描述

conda env remove d2l-zh
conda create -n d2l-zh -y python=3.8 pip
conda activate d2l-zh

pip install -y jupyter d2l torch torchvision

wget https://zh-v2.d2l.ai/d2l-zh.zip
unzip d2l-zh.zip
jupyter notebook

弹幕说:这个create -n -y d2l啥的不行啊,改成create -n d2l -y可以用了

老师操作(感觉本地配环境,这部分全都可以跳过)

视频中老师演示的是在亚马逊云上 创建的云环境ubuntu18.04,并且刚拿到机器后装了一些基本的内容:miniconda(具体在linux系统下安装时再看吧)

在这里插入图片描述
本地连接远程机器:
在这里插入图片描述
在这里插入图片描述
此时连接成功,后面有很多细节,安装 基本东西来着:(apt是一种linux的包管理软件)
sudo apt update更新机器
sudo apt install build-essential
sudo apt install python3.8
安装miniconda,复制官网链接,本地wget+链接安装:(是什么系统就装什么)
在这里插入图片描述
在这里插入图片描述
bash本地安装miniconda:

yes
在这里插入图片描述
此时就安装到 机器的根目录下,然后bash后就进入了conda环境
在这里插入图片描述
此时可以在conda环境上安装各种需要的包
在这里插入图片描述

老师基于【wget 下载地址链接】 即可下载下来,下载地址链接是到了安装包链接后右键copy如下图
在这里插入图片描述
在这里插入图片描述
然后自己装unzip并解压
在这里插入图片描述

在这里插入图片描述
视频用的pytorch版本
在这里插入图片描述
老师后面将远端地址(因为是 本地ssh远程连接到了 亚马逊云上的一台ubuntu18.04)映射到了本地机器
在这里插入图片描述

此时可以启动jupyter后直接访问 刚刚下载的课程的jupyter
在这里插入图片描述

在这里插入图片描述
看到刚刚装的东西

本地实操

【实操】用conda创建一个python=3.8名为ljm-d2l-learn的虚拟环境
conda create -n ljm-d2l-leran -y python=3.8
conda env list查看环境
conda activate ljm-d2l-learn进行环境
pip install jupyter d2l torch torchvision安装(开梯子巨快)

pip install rise安装rise插件,这样可以 以幻灯片方式查看 jupyter记事本中的课件
rise安装前,显示jupyter中幻灯片内容的效果:
在这里插入图片描述
rise安装后:
刷新页面后点击这个
在这里插入图片描述
以幻灯片形式展示:
在这里插入图片描述
自己测试了一下,在base环境上就能显示该按钮

04-数据操作+数据预处理

N维数组

① 机器学习用的最多的是N维数组,N维数组是机器学习和神经网络的主要数据结构。

笔记中所提到的x维tensor和x维数组是一回事

0维:标量(即一个数字)
1维:向量
2维:矩阵(每一行是一个样本,每一列是不同样本的相同种特征)
在这里插入图片描述
3维:如图片
4维:n个三维数组放在一起,如一个RGB图片的批量,一个batch
5维:如视频的批量(多了一个时间的维度)
在这里插入图片描述

创建数组

① 创建数组需要:形状、指定每个元素的数据类型、元素值。
如下图表示 所有元素的值是 按照正态分布表示的, 右图指 元素值 可以按均匀分布来产生
在这里插入图片描述

访问元素

① 可以根据切片,或者间隔步长访问元素。
② [::3,::2]是每隔3行、2列访问。

注:索引都是从0开始
1.访问第一行第二列的元素
2.访问第一行所有元素
3.访问第一列所有元素
4.访问第一至三行(左闭右开,即 第一、二行,不含第三行) 的 第一列及之后的所有元素
5.跳着访问:每隔3行 、每隔两列 取一个元素
在这里插入图片描述

张量(tensor)数据操作

多体会
1.看打印出的tensor中括号数量来判断tensor(或者说数组)是几维的

二维数组:
含三个一维数组的二维数组
在这里插入图片描述

三维数组:
含一个二维数组的三维数组
在这里插入图片描述
含两个二维数组的三维数组
在这里插入图片描述

2.打印出来的torch.Size()中的 一维数组中有几个元素就是几维数组

在这里插入图片描述

个人补充-为什么需要张量?张量的意义?

1.支持基于GPU加速(numpy型数据不支持)
2.支持自动求导(自动微分)(即计算梯度)
3.tensor类型数据变换更灵活多样
(土堆)包装了神经网络所需的理论基础参数的数据类型
在这里插入图片描述
在这里插入图片描述

【开源博主完整代码】
# 查看pytorch中的所有函数名或属性名
import torch

print(dir(torch.distributions))

print('1.张量的创建')
# ones 函数创建一个具有指定形状的新张量,并将所有元素值设置为 1
t = torch.ones(4)
print('t:', t)

x = torch.arange(12)
print('x:', x)
print('x shape:', x.shape)  # 访问向量的形状

y = x.reshape(3, 4)  # 改变一个张量的形状而不改变元素数量和元素值
print('y:', y)
print('y.numel():', y.numel())  # 返回张量中元素的总个数

z = torch.zeros(2, 3, 4)  # 创建一个张量,其中所有元素都设置为0
print('z:', z)

w = torch.randn(2, 3, 4)  # 每个元素都从均值为0、标准差为1的标准高斯(正态)分布中随机采样。
print('w:', w)

q = torch.tensor([[1, 2, 3], [4, 3, 2], [7, 4, 3]])  # 通过提供包含数值的 Python 列表(或嵌套列表)来为所需张量中的每个元素赋予确定值
print('q:', q)

print('2.张量的运算')
x = torch.tensor([1.0, 2, 4, 8])
y = torch.tensor([2, 2, 2, 2])
print(x + y)
print(x - y)
print(x * y)
print(x / y)
print(x ** y)  # **运算符是求幂运算
print(torch.exp(x))

X = torch.arange(12, dtype=torch.float32).reshape(3, 4)
Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
print('cat操作 dim=0', torch.cat((X, Y), dim=0))
print('cat操作 dim=1', torch.cat((X, Y), dim=1))  # 连结(concatenate) ,将它们端到端堆叠以形成更大的张量。

print('X == Y', X == Y)  # 通过 逻辑运算符 构建二元张量
print('X < Y', X < Y)
print('张量所有元素的和:', X.sum())  # 张量所有元素的和

print('3.广播机制')
a = torch.arange(3).reshape(3, 1)
b = torch.arange(2).reshape(1, 2)
print('a:', a)
print('b:', b)
print('a + b:', a + b)  # 神奇的广播运算

print('4.索引和切片')
X = torch.arange(12, dtype=torch.float32).reshape(3, 4)
print('X:', X)
print('X[-1]:', X[-1])  # 用 [-1] 选择最后一个元素
print('X[1:3]:', X[1:3])  # 用 [1:3] 选择第二个和第三个元素]

X[1, 2] = 9  # 写入元素。
print('X:', X)

X[0:2, :] = 12  # 写入元素。
print('X:', X)

print('5.节约内存')
before = id(Y)  # id()函数提供了内存中引用对象的确切地址
Y = Y + X
print(id(Y) == before)

before = id(X)
X += Y
print(id(X) == before)  # 使用 X[:] = X + Y 或 X += Y 来减少操作的内存开销。

before = id(X)
X[:] = X + Y
print(id(X) == before)  # 使用 X[:] = X + Y 或 X += Y 来减少操作的内存开销。

print('6.转换为其他 Python对象')
Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
A = Y.numpy()
print(type(A))  # 打印A的类型
print(A)
B = torch.tensor(A)
print(type(B))  # 打印B的类型
print(B)

a = torch.tensor([3.5])
print(a, a.item(), float(a), int(a))
导入torch库

在这里插入图片描述

访问张量形状shape和元素总数numel

张量表示由一个数值组成的数组,这个数组可能有多个维度

x = torch.arange(12):初始化[0, 12) 左闭右开区间上的所有数字 为一个一维向量
在这里插入图片描述

x.shape
输出torch.Size([12]): 说明这是一个一维向量,该向量的长度为12

numel:number of element,张量中元素的总数,是一个标量(数值)
在这里插入图片描述
在这里插入图片描述
直接生成一个 形状为 3,4的 元素为 0-11的向量
在这里插入图片描述

改变张量形状reshape

x = x.reshape(3,4) # 一维张量改为3行四列的张量
在这里插入图片描述

创建全0、全1张量

y = torch.zeros((2,3,4)): 创建 形状为 (2,3,4)的全0 张量 (即2个3行4列的二维数组组成的三维数组)
在这里插入图片描述

创建特定值张量

y = torch.tensor([[2,1,4,3],[1,2,3,4],[4,3,2,1]]) : 告诉torch 要创建的二维tensor(个人感觉的tips:因为有两个[ [)的
第一行元素是 [2,1,4,3]
第二行元素是[1,2,3,4]
第三行元素是[4,3,2,1]

z = torch.tensor([[[2,1,4,3],[1,2,3,4],[4,3,2,1]]]): 同理 三个 [ [ [ 就变成三维tensor
print(z.shape)
torch.Size([1, 3, 4]) : 一个 由一个三行四列的二维数组 组成的三维tensor(或称数组)(或者说 有一个三维数组, 其中有一个元素,该元素是一个 三行四列的二维数组)
【个人总结】打印出来的torch.Size()中的 一维数组中有几个元素就是几维数组
在这里插入图片描述

张量运算操作

所有的运算都是按元素进行的

x = torch.tensor([1.0,2,4,8]) :创建一个 元素类型都是浮点型的数组
x = torch.tensor([1,2,4,8]):创建一个元素类型都是整型的数组
在这里插入图片描述

张量合并操作(torch.cat)

cat>合并两个数组,dim.在第几维上进行合并

x = torch.arange(12,dtype=torch.float32).reshape((3,4))
y = torch.tensor([[2.0,1,4,3],[1,2,3,4],[4,3,2,1]])
m = torch.cat((x,y),dim=0) # 按第0个维度(对于二维数组来说,0就是行)合并起来
n = torch.cat((x,y),dim=1) # 按第一个维度(对于二维数组来说,1就是列)合并起来
在这里插入图片描述
弹幕说:个人理解,dim=0 添加记录,dim=1拼接特征
dim=几,就在第几个中括号内合并
0,1用作方向的表示方法在pytorch和numpy中有很多
0 和 1 这种表示法与 .shape的结果是对应的,0代表沿着第0个维度,1代表沿着第1个维度

张量逻辑运算(根据逻辑运算符构建二元张量)

在这里插入图片描述

张量累加运算(.sum())

在这里插入图片描述

张量广播运算

前提是需要 两个tensor的维度相同,形状可以不同(在新版本的python和torch中好像 条件放宽了,可能是和numpy中广播的要求一致,具体用到再看)
注意:numpy中的广播和pytorch中的广播的要求好像在不同的python版本中有不同?torch中要求广播运算的两个tensor维度必须相同、形状可不同(好像 对于新版本的python和pytorch的广播要求和numpy的一致了,具体用到再看);numpy中在某些维度不同的数组之间也能进行广播
在这里插入图片描述

numpy中的广播

广播原则(broadcast)(尤其是形状不同的两个数组进行计算时)
广播:一个人说话,大家都能听见

【个人总结】 从数组的形状 的后面向前数,
tips:对于二维数组,如果二者的行形状相同或列形状相同,就可以计算

形状为(3,3,2)和(3,3)的数组不能运算
形状为(3,3,2)和(3,2)的数组可以运算
(4,1)和(4,6)可以
(1,6)和(4,6)可以

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

张量访问运算

x[-1]:访问最后一行
x[1:3]:访问第1、2行
在这里插入图片描述

张量元素改写

在这里插入图片描述

张量内存变化

id:类似于C++中的指针(相当于一个变量的唯一标识号)
如下图中: 之前的变量y相当于被析构掉了(新的变量Y的id不等于以前的)
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

tensor和Numpy互转

在这里插入图片描述

数据预处理

csv全称“Comma-Separated Values”

创建数据集

csv文件中的每列含义: 房子有多少房间,进门的路是什么样的,房子的价格
NA:未知的
在这里插入图片描述

加载数据集

在这里插入图片描述

【举例】读取一个csv文件并预处理为pytorch中的tensor(含pandas基本操作)

iloc:index location

遇到Na数据: 通常可以丢掉,但是太可惜了。因此常用的是 插值法(如本例中,将 原来是NaN的数据 填成剩下的元素的均值,如2和4的均值是3)
在这里插入图片描述
在这里插入图片描述
【过程】
1.原数据:
在这里插入图片描述
处理:
2.对于数值类型数据:拿到输入和输出数据,并 将输入数据中(是数字类型的数据)缺失值NaN填为 剩下的数据的均值
在这里插入图片描述

3.对于非数值类型数据:
方法一是将 所有NaN的非数值数据单独做成一个特别的类(化为one-hot)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
4.现在我们已经将所有的缺失值NaN和字符串 都变成了数值,此时就可以 将数据变为pytorch的tensor了
如下
在这里插入图片描述

QA

1.view和reshape的区别:

弹幕说:数据库里面的View是视图,视图的作用就是提供更为便利的方式去操作数据。
如下图举个例子(实际 这种情况很少见)
改b就相当于直接把a改了
在这里插入图片描述

3.如何看维度:
.shape()
.dim()方法
(弹幕说)2,3,4越后面维度越低 4就是一维有4个标量
在这里插入图片描述

4.pytorch的tensor和numpy的ndarray类似吗?
不类似

5.tensor和array的区别:
tensor是数学上的概念,ndarray是 n dimensionarray
array是计算机中的概念
但我们是混着用的,类似的
(弹幕说)传统张量在力学里面用的挺多,和深度学习的张量确实不是一个东西感觉~

6.有图形化的torch编程方案吗
暂无

7.内存?
python一般会自动释放

9.view和reshape没有本质区别
弹幕说:建議reshape,view報錯的可能情況更多

05-线性代数

理论

在这里插入图片描述
标量:
在这里插入图片描述
向量:
在这里插入图片描述
在这里插入图片描述
矩阵:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
矩阵的范数:
在这里插入图片描述
正交矩阵:
在这里插入图片描述
特征向量和特征值:
在这里插入图片描述

代码实现

标量、向量(创建和访问向量元素)

在这里插入图片描述

向量长度、向量维度、创建矩阵

在这里插入图片描述

矩阵转置、对称矩阵

在这里插入图片描述

多维矩阵、矩阵克隆

在这里插入图片描述

矩阵相乘、矩阵加标量

哈达玛积(矩阵按元素乘法)
在这里插入图片描述

向量求和、矩阵求和

在这里插入图片描述

矩阵按某轴求和(计算后丢掉维度)、矩阵平均值mean

按哪个轴求和

弹幕说:
对哪个维度求和,就把哪个维度的数值变为1,比如第0个维度是2,对该维度求和就是把该维度变为1,即将该维度的数加在一起,再比如第一个维度是5(行),就把相同列的5行的数加起来,即把这个维度变为1
对哪个维度求和,最终发生改变的就是哪个维度,即该维度消失
在这里插入图片描述
在这里插入图片描述
两个维度求和:个人理解即 先对第一个维度求和,再对第二个维度求和
在这里插入图片描述

在这里插入图片描述

矩阵按某轴求和(计算后不丢掉维度)、矩阵广播

目的:按照某个维度求和时,不想将该维度丢掉(丢掉后的结果如上面几个图, 即如果一个三维矩阵按一个维度求和后 会变成二维矩阵,如果一个二维矩阵按一个维度求和会变成一个标量)

实现:设置keepdims=True。好处是可以 用于后续实现广播操作
注意:numpy中的广播和pytorch中的广播的要求好像在不同的python版本中有不同?torch中要求广播运算的两个tensor维度必须相同、形状可不同(好像 对于新版本的python和pytorch的广播要求和numpy的一致了,具体用到再看);numpy中在某些维度不同的数组之间也能进行广播

在这里插入图片描述
在这里插入图片描述

矩阵某轴累加cumsum(前缀和)、向量点积dot

在这里插入图片描述

在这里插入图片描述

矩阵向量积(mv ,Matrix Vector Multiplication)、矩阵相乘

注意理解pytorch中轴的方向:torch.Size([4])代表一个 长度为4的列向量 (可以回看dim=0的方向)
在这里插入图片描述

矩阵L2范数norm、L1范数abs().sum()、F范数norm

在这里插入图片描述

【补充】按特定轴求和

按那个(或哪些)轴求和,就把 shape的哪个(或哪些)数字消掉并得到 最终的shape

如shape[2,5,4]按:
axis=1求和:得到 shape[2,4]
axis=2求和:得到shape[2,5]

如shape[2,5,4]按:
axis=0和2求和:得到shape[5]
axis=1和2求和:得到shape[2]

当使用keepdims=true时,按哪个或哪些轴求和,就把对应的shape变为1(右边蓝字)
如shape[2,5,4]按:
axis=1求和:得到shape[2,1,4]
axis=1和2求和:得到shape[2,1,1]
在这里插入图片描述
在这里插入图片描述

QA

在这里插入图片描述
在这里插入图片描述

1.如果有很多字符串或特征,基于one-hot把其变成0、1, 那样就有很多列,变得很稀疏
对机器学习来说 ,稀疏矩阵不会有很多影响

2.深度学习、机器学习为什么用tensor
统计学更爱用tensor

3.copy和clone
体会深浅拷贝,clone一定是深拷贝,copy可能是浅拷贝

4.可以

5.torch区分行、列向量吗?
(弹幕)因为向量就是一维的,在计算机里就是一个数组,没有行列之分。想要区分,就要按矩阵来看
个人理解:torch中行列向量都是 一维向量,一维向量不区分行或列(不像线代那样)。
如果必须要区分,可以用 二维数组 中 存放多个一维数组(每个一维数组中只有一个元素)表示列向量

6.自己看下前面的笔记吧

7.后面讲

8.后面讲(词向量?)

9.机器学习中的张量就是多维数组,和数学中的张量不同

10.【重点体会核心思想和概念,工具只是工具】类似于在不同时代用不同工具,如 学车, 几十年前用 自行车,现在用 汽车。
工具只是工具(如python、C++、pytorch)

06-矩阵计算

在深度学习中我们很少对向量的函数求导,绝大多数情况下都是对标量求导, 因此之前学的很多 向量、矩阵求导是用不到的

标量导数与亚导数

在这里插入图片描述

在这里插入图片描述

向量与标量的求导(重点是搞对形状)

要搞清形状:
对于y=f(x)

y标x标时,求导是标(如上节)
y向x标,求导是向量
y标x向时,求导是向量
y向x向,求导是矩阵
在这里插入图片描述

标量y对向量x求导

弹幕说:别猜了 这里的差异是分子布局和分母布局的原因 结果遵循分子布局就是行向量 遵循分母布局就是列向量

举例:
x是一个长为2的向量,y定义为 第一个元素平方+2第二个元素的平方
下图画的椭圆就是 y=x1的平方+2
x2的平方
梯度和等高线是正交的(即**【梯度指向的是值变化最大的方向】**)
在这里插入图片描述

0T:全0行向量 (感觉 加粗0相当于列向量,转置变成行向量)
<u,v> :指向量u和v的内积
弹幕说:L2 norm的平方,平方后根号没了,变成各项x的平方和,然后对x进行求导,每一行就是2xi,然后就是原来列向量x的转置的2倍
在这里插入图片描述

向量对标量求导(分子/分母布局)

列(或行)向量对于标量的导数还是列(或行)向量
在这里插入图片描述

向量y对向量x求导

如x、y都是列向量时
在这里插入图片描述

下图中0是全0矩阵,I是单位矩阵,A是和x无关的矩阵
在这里插入图片描述

矩阵对矩阵求导

在这里插入图片描述

QA(接上节)

NP:Non-Polynomial
14.如果是凸函数能拿到最优, 如果非凸函数 在实际计算中几乎拿不到最优解(纯数学理论或许可能)

07-自动求导

向量链式法则

在这里插入图片描述
<x,w>指向量x和w的内积
因为<x,w>=x^T w
在这里插入图片描述
矩阵的例子:
X:mxn的矩阵,w:向量
在这里插入图片描述

自动求导

在这里插入图片描述

计算图(原理)

计算图等价于上节我们用 链式法则求导的过程,是一个无环图
操作子:一步一步操作
每个圈表示一个输入、一个操作
在这里插入图片描述

tf和mxnet都可以显式构造计算图(如下图上面,直接定义出来公式)
在这里插入图片描述

基于计算图的两种自动求导方式

这里是概述原理,应用的时候底层都做好了,不需要自己实现自动求导
【两种方式】正向计算(正向累积)、反向计算(反向累计、即 AI中的反向传播back propagation)(即 如下图, 括号的计算优先级就展示了 计算的方向)
在这里插入图片描述

在这里插入图片描述
正向上节讲了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

反向累积总结、复杂度

前向计算时,存储所有的中间值,反向时直接用中间结果
在这里插入图片描述

正向forward和反向backward的计算复杂度差不多。
但 反向复杂度的内存复杂度是On(深度神经网络很耗GPU资源)
正向累积 内存复杂度O1(因为无论网络多深,都不需要存中间计算结果。但 当需要计算一个变量的梯度时需要将 整个网络都计算一遍,效率太低)
在这里插入图片描述

【代码】自动求导

【例子1】

x.requires_grad_(True) # 等价于 x = torch.arange(4.0,requires_grad=True)。告诉我们要存储梯度,这样后续就可以直接基于x.grad访问梯度了
在这里插入图片描述
内积:<x,x> 。y对其求导相当于=2*(xT+xT)=4xT
在这里插入图片描述
上图中28=2*(0x0+1x1+2x2+3x3)
通过调用反向传播函数来自动计算y关于x每个分量的梯度
利用backward()计算所有梯度,会自动累积到.grad属性中

在这里插入图片描述
上图中x = [0. , 1., 2., 3. ],则 对于 y=2*xT和x的内积 的 x的梯度(即导数)为 [4x0, 4x1, 4x2, 4x3]

【例子2】下面计算 x的另一个函数(y=x.sum()):

默认情况下,PyTorch会累积梯度,因此在计算另一个函数时 需要清除之前的梯度值

pytorch中_表示重写这个变量,如 x.grad.zero_()重写梯度grad(即把梯度清0)
理论上求向量的sum的梯度:SUM函数其实就是x_1+x_2+…x_n,求偏导自然是全1啊
在这里插入图片描述

在这里插入图片描述

【例子3】如 y=x*x假设y和x都是向量时,理论上y是一个矩阵,但是在深度学习中我们很少对向量的函数求导,绝大多数情况下都是对标量求导,因此 实际上我们会 对y.sum(这就是个标量了)求导 而不是直接对y求导(不求和直接算梯度结果是一个矩阵,就越来越复杂了), 因此之前学的很多 向量、矩阵求导是用不到的

注:这里的*是哈达玛积(那不就是 向量或矩阵按元素计算吗)
x = [0. , 1., 2., 3. ],则 对于 y=x *x的.sum() 为 x1 ^ 2+x2^ 2+x3^ 2…+xn^n,导数即 2x1+2x2+2x3+…+2xn
则 x的梯度(即导数)为 [0., 2.,4.,6.]

在这里插入图片描述

【例子4】将某些计算移动到记录的计算图之外。

【意义】对于后续网络中,需要固定其中部分参数时,很有用
detach:拆卸 脱离
u = y.detach() # y.detach把y当作一个常数,而不是关于x的一个函数,并声明为u,即u是一个常数,值为xx,而不是一个关于x的变量(y此时仍然是 x的函数)
则z就是 一个常数u
变量x,导数即为常数u
在这里插入图片描述
在这里插入图片描述

【例5】

⑧ 即使构建函数的计算图需要通过Python控制流(例如,条件、循环或任意函数调用),仍然可以计算得到的变量的梯度。

如下例中, 返回值都是根据 输入的值指定的,即每次算b时候,torch会把计算图在背后存起来
norm函数是用于计算向量的范数,也就是向量的长度
norm()是求欧几里得范数,欧几里得范数指得就是通常意义上的距离范数。例如在欧式空间里,它表示两点间的距离(向量x的模长)。

f(a)是a的分段线性函数,则d=f(a)=ka,梯度就是k,k=d/a

在这里插入图片描述

QA

在这里插入图片描述
在这里插入图片描述

17.python实现和数学实现是不同的

18.需要。

19.设计上的理念。
对一个比较大的批量 一次算不完,就 切成几份,然后累加起来 最后发出去。

21.对于向量求导 ,会越算越复杂, 如变成矩阵甚至更复杂的

24.是的

25.因为backward不会自动计算, 只有当你需要计算梯度时,显式写出backward才会计算。
因为 计算梯度的时间和空间成本很大

27.可以,即高阶求导

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

dubbo:深入理解Apache Dubbo与实战

dubbo核心组件 层次名 作 用 Service 业务层。包括业务代码的接口与实现&#xff0c;即开发者实现的业务代码 config 配置层。主要围绕ServiceConfig &#xff08;暴露的服务配置&#xff09;和ReferenceConfig &#xff08;引用的服务配置&#xff09;两个实现类展开&#xf…

canvas绘制旋转的椭圆花

查看专栏目录 canvas实例应用100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

网络安全全栈培训笔记(57-服务攻防-应用协议RsyncSSHRDPFTP漏洞批量扫描口令拆解)

第57天 服务攻防-应用协议&Rsync&SSH&RDP&FTP&漏洞批量扫描&口令拆解 知识点&#xff1a; 1、服务攻防-远程控制&文件传输等 2、远程控制-RDP&RDP&弱口令&漏洞 3、文件传输-FTP&Rsyc&弱口令&漏洞 章节内容&#xff1a; …

【Java】--网络编程:基于TCP协议的网络通信

【Java】–网络编程&#xff1a;基于TCP协议的网络通信 文章目录 【Java】--网络编程&#xff1a;基于TCP协议的网络通信一、TCP协议1.1 概念1.2 三次握手1.2.1 文字描述1.2.2 画图演示 1.3 四次挥手1.3.1 文字描述1.3.2 画图演示 二、基于TCP的Socket网络编程2.1 概念2.2 服务…

c#中使用UTF-8编码处理多语言文本的有效策略

使用UTF-8编码处理多语言文本的有效策略 在当今的全球化时代&#xff0c;软件开发者常常需要处理包含多种语言的文本。这不仅涉及英文和其他西方语言&#xff0c;还包括中文、日文、韩文等多字节字符系统。在这篇博客中&#xff0c;我将探讨如何有效地使用UTF-8编码来处理混合语…

大模型实战营Day5笔记

大模型部署背景 大模型部署是指将训练好的模型在特定的软硬件环境中启动的过程&#xff0c;使模型能够接收输入并返回预测结果。大模型的内存开销巨大&#xff0c;7B模型仅权重需要14G内存。另外大模型是自回归生成&#xff0c;需要缓存Attention的 k/v。 LMDeploy 简…

学生宿舍人走断电管理系统的意义和功能

学生宿舍人走断电管理系统是石家庄光大远通电气公司一款智能化的电力管理设备&#xff0c;旨在解决学生宿舍安全用电问题。以下是一些该系统的功能特点: 1.智能控制:系统能够自动识别宿舍内是否有人&#xff0c;当无人时自动断电&#xff0c;避免能源浪费和安全事故的发生。 2.…

Prometheus插件安装kafka_exporter

下载地址 https://github.com/danielqsj/kafka_exporter/releases 解压 tar -zxvf kafka_exporter-1.7.0.linux-amd64.tar.gzmv kafka_exporter-1.7.0.linux-amd64 kafka_exporter服务配置 cd /usr/lib/systemd/systemvi kafka_exporter.service内容如下 [Unit] Descript…

容器技术2-镜像与容器储存

目录 一、镜像制作 1、ddocker build 2、docker commit 二、镜像存储 1、公共仓库 2、私有仓库 三、镜像使用 四、容器存储 1、镜像元数据 2、存储驱动 3、数据卷 一、镜像制作 1、ddocker build 基于 Dockerfile 自动构建镜像 其机制为&#xff1a;每一行都会基于…

【webrtc】neteq测试工程

设置git代理 $ git config --global http.https://github.com.proxy socks5://127.0.0.1:7890 git config --global https.https://github.com.proxy socks5://127.0.0.1:7890导入cmake直接构建 win32 debug v143 编译opus Build started...

【零基础入门TypeScript】数组

目录 数组的特点 声明和初始化数组 句法 访问数组元素 示例&#xff1a;简单数组 示例&#xff1a;单语句声明和初始化 数组对象 例子 示例&#xff1a;数组构造函数接受逗号分隔值 数组方法 数组解构 例子 使用 for…in 循环遍历数组 TypeScript 中的数组 使用变…

vue:element-ui表单动态验证规则

一、需求&#xff1a; 实现当是否发送消息选择是时&#xff0c;业务类型字段必填。 二、实现&#xff1a; 当你在一个表单中使用 el-form 和 el-form-item 来创建表单项时&#xff0c;el-form-item 的 :rules 属性可以用来设置该表单项的验证规则。我们希望根据用户在 "…

前端JS加密与Buspsuite的坦诚相待

前端JS加密测试场景下的困惑 在渗透测试过程中经常会遇到JS前端加密的场景&#xff0c;假如不借助任何工具的情况下&#xff0c;我们一般是把JS代码进行扣取&#xff0c;本地进行加解密生成Payload&#xff0c;然后在Burpsuite里进行Payload替换。这种方式就存在一个很明显的问…

机器学习:什么是监督学习和无监督学习

目录 一、监督学习 &#xff08;一&#xff09;回归 &#xff08;二&#xff09;分类 二、无监督学习 聚类 一、监督学习 介绍&#xff1a;监督学习是指学习输入到输出&#xff08;x->y&#xff09;映射的机器学习算法&#xff0c;监督即理解为&#xff1a;已知正确答案…

【Web前端开发基础】CSS的定位和装饰

CSS的定位和装饰 目录 CSS的定位和装饰一、学习目标二、文章内容2.1 定位2.1.1 定位的基本介绍2.1.2 定位的基本使用2.1.3 静态定位2.1.4 相对定位2.1.5 绝对定位2.1.6 子绝父相2.1.7 固定定位2.1.8元素的层级关系 2.2 装饰2.2.1 垂直对齐方式2.2.2 光标类型2.2.3 边框圆角2.2.…

Keepalived + Nginx双主架构

Keepalived Nginx双主架构 环境准备&#xff1a; keepalived_master1服务器nginx&#xff1a;172.20.26.167 keepalived_master2服务器nginx&#xff1a;172.20.26.198 各服务器关闭selinux、防火墙等服务。 开机安装部署nginx 在172.20.26.167服务器上 yum install ngi…

基于ADAS的车道线检测算法matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 图像预处理 4.2 车道线特征提取 4.3 车道线跟踪 5.完整工程文件 1.课题概述 基于ADAS的车道线检测算法,通过hough变换和边缘检测方法提取视频样板中的车道线&#xff0c;然后根据车道线的弯曲情况…

在Excel中批量添加前后缀的三种方法,总有一种适合 你

你可以使用高级Excel函数将前缀和后缀快速应用于列。在使用大型电子表格时,为每个单元格添加后缀或前缀可能会花费很长时间,并使你疲惫不堪。 在这里,你可以通过几种快速简单的方式添加后缀或前缀,从而减少所需的手动操作。​我们将通过三种不同的方法向Excel电子表格添加…

互联网盲盒小程序,解锁了盲盒全新模式!

随着潮流玩具的兴起&#xff0c;盲盒因此产生&#xff0c;在时间的推移下&#xff0c;盲盒的发展正处于鼎盛时期。在今年&#xff0c;盲盒市场也将迎来300亿元的市场规模&#xff0c;而盲盒的受众群体也在收入能力较高的年轻人中。 盲盒具有独特的购买方式&#xff0c;它能够让…

硬件监测和系统诊断 -- TechTool Pro 18 中文

TechTool Pro 18是一款功能强大的硬件和软件诊断工具&#xff0c;它提供了多种功能来帮助用户维护和优化Mac电脑的性能。这些功能包括&#xff1a;硬盘检测和修复、内存测试、驱动器克隆、数据恢复、网络和连接测试、系统健康检查以及定期维护等。 TechTool Pro 18还具有直观的…