当前位置: 首页 > news >正文

做网站去哪个公司涉县住房和城乡规划建设局网站

做网站去哪个公司,涉县住房和城乡规划建设局网站,重庆做网站_重庆网站建设_重庆网络推广_重庆网络公司,用html5做的网站的原代码文章目录 1、简介1.1、基本概念1.2、基本原理1.2.1、自动微分1.2.2、梯度1.2.3、梯度求导1.2.4、梯度下降法1.2.5、张量梯度举例 1.3、Autograd的高级功能 2、梯度基本计算2.1、单标量梯度2.2、单向量梯度的计算2.3、多标量梯度计算2.4、多向量梯度计算 3、控制梯度计算4、累计… 文章目录 1、简介1.1、基本概念1.2、基本原理1.2.1、自动微分1.2.2、梯度1.2.3、梯度求导1.2.4、梯度下降法1.2.5、张量梯度举例 1.3、Autograd的高级功能 2、梯度基本计算2.1、单标量梯度2.2、单向量梯度的计算2.3、多标量梯度计算2.4、多向量梯度计算 3、控制梯度计算4、累计梯度5、梯度下降优化最优解⭐6、梯度计算注意事项7、张量转标量的选择⭐ 作者介绍双非本科大三网络工程专业在读阿里云专家博主专注于Java领域学习擅长web应用开发、数据结构和算法初步涉猎人工智能和前端开发。 个人主页逐梦苍穹 所属专栏人工智能 gitee地址xzl的人工智能代码仓库 ✈ 您的一键三连是我创作的最大动力 1、简介 本文目标掌握梯度计算 先补充一篇我的文章关于向量的计算方式https://xzl-tech.blog.csdn.net/article/details/140563909 自动微分Automatic Differentiation, Autograd是计算梯度的强大工具广泛应用于机器学习特别是深度学习模型的训练过程中。 在PyTorch中Autograd模块通过记录张量的操作并自动计算梯度极大地简化了模型的优化过程。 1.1、基本概念 张量Tensor PyTorch中的张量是自动微分的基础数据结构。每个张量都有一个属性 requires_grad它指示是否需要计算该张量的梯度。张量的 grad 属性用于存储计算得到的梯度。 计算图Computational Graph Autograd的核心是动态计算图每次进行操作时都会动态地构建计算图。计算图的节点表示张量边表示操作。在反向传播过程中Autograd沿着计算图从输出节点到输入节点计算梯度。 反向传播Backpropagation 反向传播是一种计算梯度的算法通过链式法则链式求导法则逐层计算梯度。 自动微分Autograd模块对张量做了进一步的封装具有自动求导功能。自动微分模块是构成神经网络训练的必要模块在神经网络的反向传播过程中Autograd 模块基于正向计算的结果对当前的参数进行微分计算从而实现网络权重参数的更新。 1.2、基本原理 1.2.1、自动微分 在PyTorch中自动微分通过记录对张量的所有操作来实现。当调用反向传播函数backward()时Autograd根据链式法则自动计算所有梯度。 链式法则 设 y f ( u ) y f(u) yf(u) 且 u g ( x ) u g(x) ug(x) 根据链式法则函数 ( y ) ( y ) (y)对 ( x ) ( x ) (x) 的导数为 [ d y d x d y d u ⋅ d u d x ] [ \frac{dy}{dx} \frac{dy}{du} \cdot \frac{du}{dx} ] [dxdy​dudy​⋅dxdu​] 在计算图中Autograd通过遍历所有节点按此法则计算梯度。 1.2.2、梯度 梯度 (Gradient) 梯度是多变量函数的偏导数向量它表示函数在各个变量方向上的变化率。 在数学上给定一个多变量函数 ( f ( x 1 , x 2 , . . . , x n ) ) ( f(x_1, x_2, ..., x_n) ) (f(x1​,x2​,...,xn​))它的梯度是一个向量 其分量是函数对每个变量的偏导数 [ ∇ f ( ∂ f ∂ x 1 , ∂ f ∂ x 2 , . . . , ∂ f ∂ x n ) ] [ \nabla f \left( \frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, ..., \frac{\partial f}{\partial x_n} \right) ] [∇f(∂x1​∂f​,∂x2​∂f​,...,∂xn​∂f​)] 梯度向量指向函数值增长最快的方向其长度表示函数值增长最快的速率。 1.2.3、梯度求导 梯度求导 (Gradient Calculation) 梯度求导是计算函数在特定点的梯度向量的过程。对于机器学习和深度学习中的目标函数通常是损失函数我们通过梯度求导来了解参数变化对目标函数的影响从而调整参数以最小化目标函数。 一维函数的导数 对于一维函数 ( f ( x ) ) ( f(x) ) (f(x))导数 ( f ′ ( x ) ) ( f(x) ) (f′(x))表示函数在点 ( x ) ( x ) (x)处的变化率。 数学上导数定义为 [ f ′ ( x ) lim ⁡ Δ x → 0 f ( x Δ x ) − f ( x ) Δ x ] [ f(x) \lim_{\Delta x \to 0} \frac{f(x \Delta x) - f(x)}{\Delta x} ] [f′(x)limΔx→0​Δxf(xΔx)−f(x)​] 多维函数的梯度 对于多维函数 ( f ( x 1 , x 2 , . . . , x n ) ) ( f(x_1, x_2, ..., x_n) ) (f(x1​,x2​,...,xn​))梯度是各个方向上的导数组成的向量 [ ∇ f ( ∂ f ∂ x 1 , ∂ f ∂ x 2 , . . . , ∂ f ∂ x n ) ] [ \nabla f \left( \frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, ..., \frac{\partial f}{\partial x_n} \right) ] [∇f(∂x1​∂f​,∂x2​∂f​,...,∂xn​∂f​)] 1.2.4、梯度下降法 梯度下降法 (Gradient Descent) 梯度下降法是一种优化算法通过逐次调整参数以最小化目标函数。具体步骤如下 初始化参数 ( θ ) ( \theta ) (θ)。计算当前参数的梯度 ( ∇ f ( θ ) ) ( \nabla f(\theta) ) (∇f(θ))。更新参数 ( θ θ − α ∇ f ( θ ) ) ( \theta \theta - \alpha \nabla f(\theta) ) (θθ−α∇f(θ))其中 ( α ) ( \alpha ) (α)是学习率。重复步骤2和3直到收敛。 1.2.5、张量梯度举例 标量对张量的梯度 假设有一个标量函数 ( f ) ( f ) (f)作用于张量 ( T ) ( T ) (T)梯度 ( ∇ f ) ( \nabla f ) (∇f)是一个与 ( T ) ( T ) (T)具有相同维度的张量 其元素是 ( f ) ( f ) (f)对 ( T ) ( T ) (T)中每个元素的偏导数 [ ( ∇ f ) i j k . . . ∂ f ∂ T i j k . . . ] [ (\nabla f){ijk...} \frac{\partial f}{\partial T{ijk...}} ] [(∇f)ijk...∂Tijk...∂f​] 例子张量的平方和函数 考虑一个张量的平方和函数 [ f ( T ) ∑ i , j , k , . . . T i j k . . . 2 ] [ f(T) \sum_{i,j,k,...} T_{ijk...}^2 ] [f(T)∑i,j,k,...​Tijk...2​] 对张量 ( T ) 的每个元素求导 [ ∂ f ∂ T i j k . . . 2 T i j k . . . ] [ \frac{\partial f}{\partial T_{ijk...}} 2T_{ijk...} ] [∂Tijk...​∂f​2Tijk...​] 所以梯度是 [ ∇ f 2 T ] [ \nabla f 2T ] [∇f2T] 在实际应用中通常需要对更复杂的函数计算梯度如神经网络的损失函数对模型参数的梯度。这时梯度计算不仅限于简单的平方和函数而是涉及到复杂的链式求导。 例子神经网络的反向传播 考虑一个简单的神经网络前向传播 [ y σ ( W x b ) ] [ y \sigma(Wx b) ] [yσ(Wxb)] 其中 ( σ ) ( \sigma ) (σ)是激活函数 ( W ) ( W ) (W) 是权重矩阵 ( x ) ( x ) (x) 是输入 ( b ) ( b ) (b)是偏置。 假设损失函数是均方误差 [ L 1 2 ( y − y ^ ) 2 ] [ L \frac{1}{2}(y - \hat{y})^2 ] [L21​(y−y^​)2] 我们需要计算损失函数对权重矩阵和偏置的梯度。 1.3、Autograd的高级功能 梯度累积 默认情况下调用 backward() 时梯度会累积到张量的 grad 属性中。可以通过 x.grad.zero_() 来清零梯度。 非标量输出的梯度 当输出不是标量时可以传递一个和输出形状相同的权重张量作为 backward() 的参数用于计算加权和的梯度。 禁用梯度计算 在不需要梯度计算的情况下可以使用 torch.no_grad() 或 with torch.no_grad(): 来临时禁用梯度计算从而提高性能和节省内存。 我们使用 backward 方法、grad 属性来实现梯度的计算和访问. 2、梯度基本计算 2.1、单标量梯度 import torch # 1. 单标量梯度的计算 # y x**2 20 def test01():# 定义需要求导的张量# 张量的值类型必须是浮点类型x torch.tensor(10, requires_gradTrue, dtypetorch.float64)print(x)# 变量经过中间运算f x ** 2 20print(f)# 自动微分f.backward()# 打印 x 变量的梯度# backward 函数计算的梯度值会存储在张量的 grad 变量中print(x.grad)print(x)程序运行结果 E:\anaconda3\python.exe D:\Python\AI\PyTorch\15-梯度计算\1-梯度基本计算.py tensor(10., dtypetorch.float64, requires_gradTrue) tensor(120., dtypetorch.float64, grad_fnAddBackward0) tensor(20., dtypetorch.float64) tensor(10., dtypetorch.float64, requires_gradTrue)Process finished with exit code 0解释 张量 x 的初始值 tensor(10., dtypetorch.float64, requires_gradTrue) 表示 x 的初始值是10并且它的梯度计算已被启用。中间变量 f 的值 tensor(120., dtypetorch.float64, grad_fnAddBackward0) 表示 f 的计算结果是120即 ( 1 0 2 20 ) (10^2 20) (10220)。梯度值 x.grad tensor(20., dtypetorch.float64) 表示 f 对 x 的梯度是20即 d d x ( x 2 20 ) 2 x 2 × 10 \frac{d}{dx}(x^2 20) 2x 2 \times 10 dxd​(x220)2x2×10。张量 x 的值保持不变 tensor(10., dtypetorch.float64, requires_gradTrue) 再次确认 x 的值保持为10。 2.2、单向量梯度的计算 # 2. 单向量梯度的计算 # y x**2 20 def test02():# 定义需要求导张量x torch.tensor([10, 20, 30, 40], requires_gradTrue, dtypetorch.float64)print(x)# 变量经过中间计算f1 x ** 2 20print(f1)# 注意:# 由于求导的结果必须是标量# 而 f 的结果是: tensor([120., 420.])# 所以, 不能直接自动微分# 需要将结果计算为标量才能进行计算print(f1.mean())f2 f1.mean() # f2 1/2 * x# 自动微分f2.backward()# 打印 x 变量的梯度print(x.grad)输出 E:\anaconda3\python.exe D:\Python\AI\PyTorch\15-梯度计算\1-梯度基本计算.py tensor([10., 20., 30., 40.], dtypetorch.float64, requires_gradTrue) tensor([ 120., 420., 920., 1620.], dtypetorch.float64,grad_fnAddBackward0) tensor(770., dtypetorch.float64, grad_fnMeanBackward0) tensor([ 5., 10., 15., 20.], dtypetorch.float64)Process finished with exit code 0解释 函数 f1 的定义 [ f 1 i x i 2 20 ] [ f_{1i} x_i^2 20 ] [f1i​xi2​20] f2 是 f1 的均值 [ f 2 1 4 ∑ i 1 4 f 1 i ] [ f2 \frac{1}{4} \sum_{i1}^4 f_{1i} ] [f241​∑i14​f1i​] 因此f2 对 x_i 的偏导数为 [ ∂ f 2 ∂ x i 1 4 ∂ f 1 i ∂ x i 1 4 ⋅ 2 x i 1 2 x i ] [ \frac{\partial f2}{\partial x_i} \frac{1}{4} \frac{\partial f_{1i}}{\partial x_i} \frac{1}{4} \cdot 2x_i \frac{1}{2} x_i ] [∂xi​∂f2​41​∂xi​∂f1i​​41​⋅2xi​21​xi​] 所以f2 对 x 的梯度 x.grad 为每个元素的一半 [ x . g r a d [ 1 2 ⋅ 10 , 1 2 ⋅ 20 , 1 2 ⋅ 30 , 1 2 ⋅ 40 ] [ 5 , 10 , 15 , 20 ] ] [ x.grad \left[ \frac{1}{2} \cdot 10, \frac{1}{2} \cdot 20, \frac{1}{2} \cdot 30, \frac{1}{2} \cdot 40 \right] [5, 10, 15, 20] ] [x.grad[21​⋅10,21​⋅20,21​⋅30,21​⋅40][5,10,15,20]] 2.3、多标量梯度计算 # 3. 多标量梯度计算 # y x1 ** 2 x2 ** 2 x1*x2 def test03():# 定义需要计算梯度的张量x1 torch.tensor(10, requires_gradTrue, dtypetorch.float64)x2 torch.tensor(20, requires_gradTrue, dtypetorch.float64)print(x1, x2)# 经过中间的计算y x1 ** 2 x2 ** 2 x1 * x2print(y)# TODO y已经是标量, 无需转换# 自动微分y.backward()# 打印两个变量的梯度print(x1.grad, x2.grad)输出 E:\anaconda3\python.exe D:\Python\AI\PyTorch\15-梯度计算\1-梯度基本计算.py tensor(10., dtypetorch.float64, requires_gradTrue) tensor(20., dtypetorch.float64, requires_gradTrue) tensor(700., dtypetorch.float64, grad_fnAddBackward0) tensor(40., dtypetorch.float64) tensor(50., dtypetorch.float64)Process finished with exit code 0解释-梯度计算细节 定义函数 ( y ) ( y ) (y) [ y x 1 2 x 2 2 x 1 ⋅ x 2 ] [ y x_1^2 x_2^2 x1 \cdot x2 ] [yx12​x22​x1⋅x2]计算 ( y ) ( y ) (y) [ y 102 202 10 ⋅ 20 100 400 200 700 ] [ y 102 202 10 \cdot 20 100 400 200 700 ] [y10220210⋅20100400200700]计算梯度 ( ∂ y ∂ x 1 \frac{\partial y}{\partial x1} ∂x1∂y​) [ ∂ y ∂ x 1 2 x 1 x 2 2 ⋅ 10 20 20 20 40 ] [ \frac{\partial y}{\partial x1} 2x1 x2 2 \cdot 10 20 20 20 40 ] [∂x1∂y​2x1x22⋅1020202040]计算梯度 ( ∂ y ∂ x 2 \frac{\partial y}{\partial x2} ∂x2∂y​) [ ∂ y ∂ x 2 2 x 2 x 1 2 ⋅ 20 10 40 10 50 ] [ \frac{\partial y}{\partial x2} 2x2 x1 2 \cdot 20 10 40 10 50 ] [∂x2∂y​2x2x12⋅2010401050] 2.4、多向量梯度计算 # 4. 多向量梯度计算 def test04():# 定义需要计算梯度的张量x1 torch.tensor([10, 20], requires_gradTrue, dtypetorch.float64, devicecuda)x2 torch.tensor([30, 40], requires_gradTrue, dtypetorch.float64, devicecuda)# 经过中间的计算y x1 ** 2 x2 ** 2 x1 * x2print(y)# 将输出结果变为标量y y.mean()print(y)# 自动微分y.backward()# 打印两个变量的梯度print(x1.grad, x2.grad)输出 E:\anaconda3\python.exe D:\Python\AI\PyTorch\15-梯度计算\1-梯度基本计算.py tensor([1300., 2800.], devicecuda:0, dtypetorch.float64,grad_fnAddBackward0) tensor(2050., devicecuda:0, dtypetorch.float64, grad_fnMeanBackward0) tensor([25., 40.], devicecuda:0, dtypetorch.float64) tensor([35., 50.], devicecuda:0, dtypetorch.float64)Process finished with exit code 0梯度计算细节 定义函数 ( y ) ( y ) (y) [ y x 1 2 x 2 2 x 1 ⋅ x 2 ] [ y x_1^2 x_2^2 x_1 \cdot x_2 ] [yx12​x22​x1​⋅x2​] 具体计算每个元素 第一个元素 ( 1 0 2 3 0 2 10 ⋅ 30 100 900 300 1300 ) ( 10^2 30^2 10 \cdot 30 100 900 300 1300 ) (10230210⋅301009003001300)第二个元素 ( 2 0 2 4 0 2 20 ⋅ 40 400 1600 800 2800 ) ( 20^2 40^2 20 \cdot 40 400 1600 800 2800 ) (20240220⋅4040016008002800) 所以 ( y [ 1300 , 2800 ] ) ( y [1300, 2800] ) (y[1300,2800]) 将结果转换为标量 [ y mean 1 2 ∑ y 1 2 ( 1300 2800 ) 4100 2 2050 ] [ y_{\text{mean}} \frac{1}{2} \sum y \frac{1}{2} (1300 2800) \frac{4100}{2} 2050 ] [ymean​21​∑y21​(13002800)24100​2050]计算梯度 对 ( x 1 ) ( x_1 ) (x1​) 的梯度 [ ∂ y mean ∂ x 1 1 2 ( 2 x 1 x 2 ) ] [ \frac{\partial y_{\text{mean}}}{\partial x_1} \frac{1}{2} \left( 2x_1 x_2 \right) ] [∂x1​∂ymean​​21​(2x1​x2​)]对第一个元素 ( 1 2 ( 2 ⋅ 10 30 ) 1 2 ( 20 30 ) 50 2 25 ) ( \frac{1}{2} (2 \cdot 10 30) \frac{1}{2} (20 30) \frac{50}{2} 25 ) (21​(2⋅1030)21​(2030)250​25)对第二个元素 ( 1 2 ( 2 ⋅ 20 40 ) 1 2 ( 40 40 ) 80 2 40 ) ( \frac{1}{2} (2 \cdot 20 40) \frac{1}{2} (40 40) \frac{80}{2} 40 ) (21​(2⋅2040)21​(4040)280​40) 所以 ( x 1. g r a d [ 25 , 40 ] ) ( x1.grad [25, 40] ) (x1.grad[25,40]) 对 ( x 2 ) ( x_2 ) (x2​)的梯度 [ ∂ y mean ∂ x 2 1 2 ( 2 x 2 x 1 ) ] [ \frac{\partial y_{\text{mean}}}{\partial x_2} \frac{1}{2} \left( 2x_2 x_1 \right) ] [∂x2​∂ymean​​21​(2x2​x1​)]对第一个元素 ( 1 2 ( 2 ⋅ 30 10 ) 1 2 ( 60 10 ) 70 2 35 ) ( \frac{1}{2} (2 \cdot 30 10) \frac{1}{2} (60 10) \frac{70}{2} 35 ) (21​(2⋅3010)21​(6010)270​35)对第二个元素 ( 1 2 ( 2 ⋅ 40 20 ) 1 2 ( 80 20 ) 100 2 50 ) ( \frac{1}{2} (2 \cdot 40 20) \frac{1}{2} (80 20) \frac{100}{2} 50 ) (21​(2⋅4020)21​(8020)2100​50) **所以 ** ( x 2. g r a d [ 35 , 50 ] ) ( x2.grad [35, 50] ) (x2.grad[35,50]) 3、控制梯度计算 我们可以通过一些方法使得在 requires_gradTrue 的张量在某些时候计算不进行梯度计算。 PyTorch 提供了几种方法来实现这一点包括上下文管理器、装饰器和全局设置。 使用上下文管理器 torch.no_grad()使用装饰器 torch.no_grad()使用全局设置 torch.set_grad_enabled(False) # 1. 控制不计算梯度 def test01():x torch.tensor(10, requires_gradTrue, dtypetorch.float64)print(x.requires_grad)# 第一种方式: 对代码进行装饰with torch.no_grad():y x ** 2print(y.requires_grad)# 第二种方式: 对函数进行装饰torch.no_grad()def my_func(x):return x ** 2print(my_func(x).requires_grad)# 第三种方式torch.set_grad_enabled(False)y x ** 2print(y.requires_grad)程序运行结果: E:\anaconda3\python.exe D:\Python\AI\PyTorch\15-梯度计算\2-控制梯度计算.py True False False FalseProcess finished with exit code 04、累计梯度 累计梯度每一次训练前都需要清楚现有梯度如果不清楚则会累加。 # 2. 注意: 累计梯度 def test02():# 定义需要求导张量x torch.tensor([10, 20, 30, 40], requires_gradTrue, dtypetorch.float64)for _ in range(3):f1 x ** 2 20f2 f1.mean()# 默认张量的 grad 属性会累计历史梯度值# 所以, 需要我们每次手动清理上次的梯度# 注意: 一开始梯度不存在, 需要做判断if x.grad is not None:x.grad.data.zero_()f2.backward()print(x.grad)输出 E:\anaconda3\python.exe D:\Python\AI\PyTorch\15-梯度计算\2-控制梯度计算.py tensor([ 5., 10., 15., 20.], dtypetorch.float64) tensor([ 5., 10., 15., 20.], dtypetorch.float64) tensor([ 5., 10., 15., 20.], dtypetorch.float64)Process finished with exit code 0如果不清除梯度值则累加 5、梯度下降优化最优解⭐ 原理 梯度下降法是一种优化算法旨在通过反复调整参数使目标函数的值达到最小 梯度下降的更新公式为 [ x new x old − η ⋅ d d x ] [ x_{\text{new}} x_{\text{old}} - \eta \cdot \frac{d}{dx} ] [xnew​xold​−η⋅dxd​] x new x_{\text{new}} xnew​更新后的参数值。 x old x_{\text{old}} xold​当前的参数值。 η \eta η学习率表示每次更新的步幅的大小。 d d x \frac{d}{dx} dxd​目标函数 ( f ) ( f ) (f) 对参数 ( x ) ( x ) (x) 的梯度表示 ( x ) ( x ) (x)方向上的变化率。 代码 # 3. 梯度下降优化最优解 def test03():# y x**2x torch.tensor(10, requires_gradTrue, dtypetorch.float64)for _ in range(5000):# 正向计算f x ** 2# 梯度清零if x.grad is not None:x.grad.data.zero_()# 反向传播计算梯度f.backward()# 更新参数x.data x.data - 0.001 * x.gradprint(%.10f % x.data)结果 第一个结果是9.9800000000最后一个结果0.0004494759 数学解释 初始化参数 ( x ) ( x ) (x) [ x 10 ] [ x 10 ] [x10]目标函数 ( f ) ( f ) (f) [ f ( x ) x 2 ] [ f(x) x^2 ] [f(x)x2]计算梯度 [ d ( f ) d ( x ) 2 x ] [ \frac{d(f)}{d(x)} 2x ] [d(x)d(f)​2x]对于初始 ( x 10 ) ( x 10 ) (x10)梯度为 ( 2 × 10 20 ) ( 2 \times 10 20 ) (2×1020)。更新参数 [ x new x old − 0.001 ⋅ d ( f ) d ( x ) ] [ x_{\text{new}} x_{\text{old}} - 0.001 \cdot \frac{d(f)}{d(x)} ] [xnew​xold​−0.001⋅d(x)d(f)​]对于初始 ( x 10 ) ( x 10 ) (x10)更新后的 ( x ) 为 [ x new 10 − 0.001 × 20 10 − 0.02 9.98 ] [ x_{\text{new}} 10 - 0.001 \times 20 10 - 0.02 9.98 ] [xnew​10−0.001×2010−0.029.98] 重复更新 这个过程会在循环中重复多次每次都根据新的 x 值计算梯度并更新参数。随着迭代次数的增加x 会逐渐减小最终趋近于 0这是因为对于函数 ()2f(x)x2 而言最小值在 0x0 处取得。 为什么选择梯度的负方向 选择梯度的负方向是因为梯度表示函数值增加最快的方向。为了最小化函数我们需要沿着梯度的反方向移动即梯度的负方向。 学习率的选择 学习率 η η η 决定了每次参数更新的步幅大小。选择合适的学习率非常重要 学习率太大会导致更新步幅过大可能会跳过最优解导致发散。学习率太小会导致更新步幅过小收敛速度过慢可能需要更多的迭代次数才能接近最优解。 总结 梯度下降法是通过反复调整参数使目标函数的值达到最小的一种优化算法。每次更新参数时沿着梯度的负方向移动一个步幅这个步幅由学习率决定。通过这种方式逐步逼近目标函数的最优解。在实际应用中选择合适的学习率和迭代次数对于模型的优化效果至关重要。 6、梯度计算注意事项 当对设置 requires_gradTrue 的张量使用 numpy 函数进行转换时, 会出现如下报错 Can’t call numpy() on Tensor that requires grad. Use tensor.detach().numpy() instead. 此时, 需要先使用 detach 函数将张量进行分离, 再使用 numpy 函数. 注意detach 之后会产生一个新的张量, 新的张量作为叶子结点并且该张量和原来的张量共享数据, 但是分离后的张量不需要计算梯度。 # -*- coding: utf-8 -*- # Author: CSDN逐梦苍穹 # Time: 2024/7/20 3:22 import torch# 1. detach 函数用法 def test01():x torch.tensor([10, 20], requires_gradTrue, dtypetorch.float64)# Cant call numpy() on Tensor that requires grad. Use tensor.detach().numpy() instead.# print(x.numpy()) # 错误print(x.detach().numpy()) # 正确# 2. detach 前后张量共享内存 def test02():x1 torch.tensor([10, 20], requires_gradTrue, dtypetorch.float64)# x2 作为叶子结点x2 x1.detach()print(x1)print(x2)# 两个张量的值一样# TODO id() 函数用于返回对象的唯一标识符identityprint(id(x1.data), id(x2.data))x2.data torch.tensor([100, 200])print(x1)print(x2)# x2 不会自动计算梯度: Falseprint(x2.requires_grad)if __name__ __main__:print(test01)test01()print(test02)test02()程序运行结果: E:\anaconda3\python.exe D:\Python\AI\PyTorch\15-梯度计算\3-detach.py test01 [10. 20.] test02 tensor([10., 20.], dtypetorch.float64, requires_gradTrue) tensor([10., 20.], dtypetorch.float64) 3035001264464 3035001264464 tensor([10., 20.], dtypetorch.float64, requires_gradTrue) tensor([100, 200]) FalseProcess finished with exit code 0不会自动计算梯度 7、张量转标量的选择⭐ 在机器学习和深度学习中梯度的计算和应用是优化模型的核心部分。 梯度的作用 梯度是指函数在某一点的导数或变化率表示该点处函数值变化最迅速的方向。 在深度学习中梯度主要用于以下方面 ①优化模型参数通过梯度下降法或其变体调整模型参数以最小化损失函数。 ②反向传播在训练神经网络时通过计算损失函数相对于模型参数的梯度更新参数使得模型的预测更准确。 为什么梯度的值可以不一样 梯度的值取决于你选择的损失函数和如何将多维输出转换为标量。 例如求和和求均值两种方法在将向量转换为标量时会导致不同的梯度值。 均值和求和得到的梯度在作用上的区别 求和 梯度值较大每个元素的梯度直接反映其对总和的贡献。适用于所有元素的贡献需要累加的情况。 更新步幅更大在梯度下降中更新步幅较大因为梯度值较大。 求均值 梯度值较小每个元素的梯度反映其对均值的贡献。适用于考虑整体均衡贡献的情况。 更新步幅较小在梯度下降中更新步幅较小因为梯度值较小。 总结 梯度的作用梯度用于优化模型参数使得损失函数最小化。梯度的值可以不一样不同的标量化方法如求和和求均值会导致不同的梯度值。求和与求均值的区别求和使梯度较大更新步幅较大求均值使梯度较小更新步幅较小。选择哪种方法取决于具体应用和需求。
http://www.zqtcl.cn/news/235624/

相关文章:

  • 枣阳网站建设吧yw最新域名备案查询
  • 西安知名网站建设公司什么网站可以分享wordpress
  • ugc网站开发2022恢复线下教学通知
  • 网站界面尺寸珠海网站建设制作哪家专业
  • 上海闸北城市建设有限公司网站想学设计没有基础怎么办
  • 免费微网站哪个好用在线网页代理浏览免费
  • 广州建设专业网站寻找做项目的网站
  • 湛江网站建设方案服务卖wordpress主题
  • 扬州做网站的网络公司wordpress设置登录背景图片
  • 有哪些好的网站建设移动网站建设解决方案
  • 江苏网站建设公司排名高校门户网站建设问题
  • 网站怎么加关键词视频网站程序
  • 建设网站需要的人员及资金建设一个网站的具体流程
  • 北京长空建设有限公司网站网站开发制作培训学校
  • 哪些网站可以免费做推广呢o2o营销模式
  • 注册网站的流程南京今天的最新消息
  • 做网站的没有进项票怎么办张家口市一建公司官网
  • 建设网站的本质智慧团建手机版
  • 嘉兴网站建设有前途吗沈阳男科医院排名10强名单公布
  • 手机网站变灰17种新型商业模式
  • 图书网站开发需求文档模板做网站现在用什么语言
  • 创建网站主题在哪里接单赚钱平台
  • 企业做网站的流程权威发布新闻的含义
  • 国外大型购物网站桂林视频网站制作
  • 平度那里有做网站的网站设计技术入股
  • 张家港专业做网站网站设计与建设ppt
  • 香奈儿网站设计分析网站建设新闻发布注意事项
  • 建设网站策划南京网站开发建设
  • 哪些网站可以做任务挣钱如何查询企业电话号码
  • 福田网站 建设深圳信科手机 网站制作