反向传播+代码实现

简介: 反向传播+代码实现

ad2b2a4be3c94baf8e194e3f2d7750b5.png


y=wx的反向传播代码实现


import torch
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]
#w是Tensor(张量类型),Tensor中包含data和grad,data和grad也是Tensor。
# grad初始为None,调用l.backward()方法后w.grad为Tensor,
# 故更新w.data时需使用w.grad.data。
# 如果w需要计算梯度,那构建的计算图中,跟w相关的tensor都默认需要计算梯度。
w=torch.Tensor([1.0])
#True:需要计算梯度
w.requires_grad=True
def forward(x):
    return x * w
# 构建计算图
def loss(x,y):
    y_pred=forward(x)
    return (y_pred-y)*(y_pred-y)
print("训练之前:",4,forward(4).item())
for epoch in range(100):
    for x,y in zip(x_data,y_data):
        l=loss(x,y)
        #自动将需要梯度的地方计算出来
        #存储到w中
        #l.backward()会把计算图中所有需要梯度(grad)的地方都会求出来,
        # 然后把梯度都存在对应的待求的参数中,最终计算图被释放。
        l.backward()
        print("grad:",x,y,w.grad.item())
        #grad是修改后的w权值
        #data是转化为标量 不能使用张量计算 会发生自动类型转换
        w.data=w.data-0.01*w.grad.data
        #要单个所以要释放,如果是连续的则不需要清零
        # w.data.zero_() 错
        w.grad.data.zero_()
    print("进程轮数:",epoch,l.item())
print("训练之后:",4,forward(4).item())


y=w1x+w2x+b的反向传播代码实现  


import torch
x_data = [1.0,2.0,3.0]
y_data = [2.0,4.0,6.0]
#学习率
learn_rate=0.01
#True:需要计算梯度
w1=torch.tensor([1.0])
w1.requires_grad=True
w2=torch.tensor([1.0])
w2.requires_grad=True
b=torch.tensor([1.0])
b.requires_grad=True
def forward(x):
    return w1*x+w2*x+b
def loss(x,y):
    y_test=forward(x)
    return (y_test-y)*(y_test-y)
print("训练之前:",4,forward(4).item())
for epoch in range(100):
    for x,y in zip(x_data,y_data):
        #损失函数原型
        l=loss(x,y)
        l.backward()
        #pytorch中,.item()方法 是得到一个元素张量里面的元素值
        print("grad:",x,y,w1.grad.item(),w2.grad.item(),b.grad.item())
        #orch.autograd包主要功能是完成网络反向传播时的链式求导
        #过程大致为:先通过输入的tensor数据类型的变量在神经网络的前向传播中生成一张计算图,
        #然后再根据这个计算图和输出结果准确计算出各个参数需要更新的梯度,并通过完成反向传播对参数进行梯度更新。
        #在实践中使用autograd包中的variable类进行封装,封装之后计算图中每一个节点就是一个variable对象
        #因此如果用X代表选中的节点,那么X.data 就是tensor数据对象,X.grad就是X的梯度对象,X.grad.data就是X的梯度数据值啦
        w1.data=w1.data-learn_rate*w1.grad.data
        w2.data=w2.data-learn_rate*w2.grad.data
        b.data=b.data-learn_rate*b.grad.data
        w1.grad.data.zero_()
        w2.grad.data.zero_()
        b.grad.data.zero_()
    print("轮数:",epoch,l.item())
print("训练之后:",4,forward(4).item())


目录
相关文章
|
算法 数据挖掘 Python
三种梯度下降方法与代码实现(二)
本文属于 线性回归算法【AIoT阶段三】(尚未更新),这里截取自其中一段内容,方便读者理解和根据需求快速阅读。本文通过公式推导+代码两个方面同时进行,因为涉及到代码的编译运行,如果你没有NumPy,Pandas,Matplotlib的基础,建议先修文章:数据分析三剑客【AIoT阶段一(下)】(十万字博文 保姆级讲解),本文是梯度下降的第二部分,学之前需先修:梯度下降【无约束最优化问题】,后续还会有:梯度下降优化,梯度下降优化进阶 (暂未更新)
315 0
三种梯度下降方法与代码实现(二)
|
机器学习/深度学习 算法 数据挖掘
三种梯度下降方法与代码实现(一)
本文属于 线性回归算法【AIoT阶段三】(尚未更新),这里截取自其中一段内容,方便读者理解和根据需求快速阅读。本文通过公式推导+代码两个方面同时进行,因为涉及到代码的编译运行,如果你没有NumPy,Pandas,Matplotlib的基础,建议先修文章:数据分析三剑客【AIoT阶段一(下)】(十万字博文 保姆级讲解),本文是梯度下降的第二部分,学之前需先修:梯度下降【无约束最优化问题】,后续还会有:梯度下降优化,梯度下降优化进阶 (暂未更新)
443 0
三种梯度下降方法与代码实现(一)
|
9月前
|
机器学习/深度学习 算法 Python
反向传播原理的链式法则
反向传播原理的链式法则
|
TensorFlow 算法框架/工具 开发者
Softmax 多分类的代码实现 | 学习笔记
快速学习 Softmax 多分类的代码实现
Softmax 多分类的代码实现 | 学习笔记
|
机器学习/深度学习
深度学习入门(8)激活函数ReLU和 Sigmoid的计算图表示方式及其误差反向传播的代码实现
深度学习入门(8)激活函数ReLU和 Sigmoid的计算图表示方式及其误差反向传播的代码实现
深度学习入门(8)激活函数ReLU和 Sigmoid的计算图表示方式及其误差反向传播的代码实现
|
9月前
|
机器学习/深度学习 算法
反向传播原理的梯度下降算法
反向传播原理的梯度下降算法
|
机器学习/深度学习 算法框架/工具 网络架构
Lenet神经网络解读及其代码实现
Lenet神经网络解读及其代码实现
Lenet神经网络解读及其代码实现
|
19天前
|
机器学习/深度学习 存储 Python
深入剖析SVM核心机制:铰链损失函数的原理与代码实现
铰链损失(Hinge Loss)是支持向量机(SVM)中核心的损失函数,广泛应用于机器学习模型训练。其数学形式为 \( L(y, f(x)) = \max(0, 1 - y \cdot f(x)) \),其中 \( y \) 是真实标签,\( f(x) \) 是预测输出。铰链损失具有凸性、非光滑性和稀疏性等特性,能够最大化分类边际并产生稀疏的支持向量,提高模型泛化能力。它在正确分类、边际内分类和错误分类三种情况下有不同的损失值,适用于线性可分问题且对异常值不敏感。铰链损失通过严格的边际要求和连续梯度信息,提供了高效的优化目标,适合构建鲁棒的分类模型。
155 77
深入剖析SVM核心机制:铰链损失函数的原理与代码实现
|
机器学习/深度学习
深度学习入门(9)神经网络Affine与Softmax层的计算图表示方式及其误差反向传播的代码实现
深度学习入门(9)神经网络Affine与Softmax层的计算图表示方式及其误差反向传播的代码实现
深度学习入门(9)神经网络Affine与Softmax层的计算图表示方式及其误差反向传播的代码实现

热门文章

最新文章