【AI基础】反向传播

文章目录

  • 1. 先写出第一步
  • 2.将其封装成函数
  • 3. pytorch版

在这里插入图片描述

1. 先写出第一步

# 定义输入值和期望输出
x_1 = 40.0
x_2 = 80.0
expected_output = 60.0'''
初始化
'''
# 定义权重
w_1_11 = 0.5
w_1_12 = 0.5
w_1_13 = 0.5
w_1_21 = 0.5
w_1_22 = 0.5
w_1_23 = 0.5w_2_11 = 1.0
w_2_21 = 1.0
w_2_31 = 1.0'''前向传播
'''
z_1 = x_1 * w_1_11 + x_2 * w_1_21
z_2 = x_1 * w_1_12 + x_2 * w_1_22
z_3 = x_1 * w_1_13 + x_2 * w_1_23
y_pred = z_1 * w_2_11 + z_2 * w_2_21 + z_3 * w_2_31# print(z_1, z_2, z_3, y_pred)
print("前向传播预测值为: ", y_pred)# 计算损失函数值(L2损失)
loss = 0.5 * (expected_output - y_pred) ** 2
print("当前的loss值为:",loss)'''
开始计算梯度
'''# 计算输出层关于损失函数的梯度
d_loss_predicted_output = -(expected_output - y_pred)
# print(d_loss_predicted_output)
#
# 计算权重关于损失函数的梯度
d_loss_w_2_11 = d_loss_predicted_output * z_1
d_loss_w_2_21 = d_loss_predicted_output * z_2
d_loss_w_2_31 = d_loss_predicted_output * z_3
# print(d_loss_w_2_11,d_loss_w_2_21,d_loss_w_2_31)d_loss_w_1_11 = d_loss_predicted_output * w_2_11 * x_1
# print(d_loss_w_1_11)
d_loss_w_1_21 = d_loss_predicted_output * w_2_11 * x_2
# print(d_loss_w_1_21)
d_loss_w_1_12 = d_loss_predicted_output * w_2_21 * x_1
# print(d_loss_w_1_12)
d_loss_w_1_22 = d_loss_predicted_output * w_2_21 * x_2
# print(d_loss_w_1_22)
d_loss_w_1_13 = d_loss_predicted_output * w_2_31 * x_1
# print(d_loss_w_1_13)
d_loss_w_1_23 = d_loss_predicted_output * w_2_31 * x_2
# print(d_loss_w_1_23)# 使用梯度下降法更新权重
learning_rate = 1e-5
w_2_11 -= learning_rate * d_loss_w_2_11
w_2_21 -= learning_rate * d_loss_w_2_21
w_2_31 -= learning_rate * d_loss_w_2_31w_1_11 -= learning_rate * d_loss_w_1_11
w_1_12 -= learning_rate * d_loss_w_1_12
w_1_13 -= learning_rate * d_loss_w_1_13
w_1_21 -= learning_rate * d_loss_w_1_21
w_1_22 -= learning_rate * d_loss_w_1_22
w_1_23 -= learning_rate * d_loss_w_1_23'''前向传播
'''z_1 = x_1 * w_1_11 + x_2 * w_1_21
z_2 = x_1 * w_1_12 + x_2 * w_1_22
z_3 = x_1 * w_1_13 + x_2 * w_1_23y_pred = z_1 * w_2_11 + z_2 * w_2_21 + z_3 * w_2_31
print("Final: ",y_pred)# print("前向传播预测值为: ", y_pred)
loss = 0.5 * (expected_output - y_pred) ** 2
print("当前的loss值为:",loss)

2.将其封装成函数

def forward_propagation(layer_1_list, layer_2_list):w_1_11, w_1_12, w_1_13, w_1_21, w_1_22, w_1_23 = layer_1_listw_2_11, w_2_21, w_2_31 = layer_2_listz_1 = x_1 * w_1_11 + x_2 * w_1_21z_2 = x_1 * w_1_12 + x_2 * w_1_22z_3 = x_1 * w_1_13 + x_2 * w_1_23y_pred = z_1 * w_2_11 + z_2 * w_2_21 + z_3 * w_2_31return y_preddef compute_loss(y_true, y_pred):loss = 0.5 * (y_true - y_pred) ** 2return lossdef backward_propagation(layer_1_list,layer_2_list,learning_rate):w_1_11, w_1_12, w_1_13, w_1_21, w_1_22, w_1_23 = layer_1_listw_2_11, w_2_21, w_2_31 = layer_2_listz_1 = x_1 * w_1_11 + x_2 * w_1_21z_2 = x_1 * w_1_12 + x_2 * w_1_22z_3 = x_1 * w_1_13 + x_2 * w_1_23# 计算输出层关于损失函数的梯度d_loss_predicted_output = -(y_true - y_pred)# 计算权重关于损失函数的梯度d_loss_w_2_11 = d_loss_predicted_output * z_1d_loss_w_2_21 = d_loss_predicted_output * z_2d_loss_w_2_31 = d_loss_predicted_output * z_3d_loss_w_1_11 = d_loss_predicted_output * w_2_11 * x_1d_loss_w_1_21 = d_loss_predicted_output * w_2_11 * x_2d_loss_w_1_12 = d_loss_predicted_output * w_2_21 * x_1d_loss_w_1_22 = d_loss_predicted_output * w_2_21 * x_2d_loss_w_1_13 = d_loss_predicted_output * w_2_31 * x_1d_loss_w_1_23 = d_loss_predicted_output * w_2_31 * x_2# 使用梯度下降法更新权重w_2_11 -= learning_rate * d_loss_w_2_11w_2_21 -= learning_rate * d_loss_w_2_21w_2_31 -= learning_rate * d_loss_w_2_31w_1_11 -= learning_rate * d_loss_w_1_11w_1_12 -= learning_rate * d_loss_w_1_12w_1_13 -= learning_rate * d_loss_w_1_13w_1_21 -= learning_rate * d_loss_w_1_21w_1_22 -= learning_rate * d_loss_w_1_22w_1_23 -= learning_rate * d_loss_w_1_23layer_1_list = [w_1_11, w_1_12, w_1_13, w_1_21, w_1_22, w_1_23]layer_2_list = [w_2_11, w_2_21, w_2_31]return layer_1_list,layer_2_listdef parm_init():# 初始化定义权重w_1_11 = 0.5w_1_12 = 0.5w_1_13 = 0.5w_1_21 = 0.5w_1_22 = 0.5w_1_23 = 0.5w_2_11 = 1.0w_2_21 = 1.0w_2_31 = 1.0layer_1_list = [w_1_11,w_1_12,w_1_13,w_1_21,w_1_22,w_1_23]layer_2_list = [w_2_11,w_2_21,w_2_31]return layer_1_list, layer_2_listif __name__ == '__main__':# 定义输入值和期望输出x_1 = 40.0x_2 = 80.0y_true = 60.0learning_rate = 1e-5epoch = 100'''初始化'''# 初始化定义权重layer_1_list, layer_2_list = parm_init()for i in range(epoch):# 正向传播y_pred = forward_propagation(layer_1_list,layer_2_list)# 计算损失loss = compute_loss(y_true, y_pred)print(f"第{i}次 预测值为: ", y_pred, " 误差为: ",loss)# 反向传播layer_1_list,layer_2_list = backward_propagation(layer_1_list,layer_2_list,learning_rate)

3. pytorch版

import torch
import torch.optim as optim

def forward_propagation(x_1, x_2, layer_1_list, layer_2_list):
w_1_11, w_1_12, w_1_13, w_1_21, w_1_22, w_1_23 = layer_1_list
w_2_11, w_2_21, w_2_31 = layer_2_list
z_1 = x_1 * w_1_11 + x_2 * w_1_21
z_2 = x_1 * w_1_12 + x_2 * w_1_22
z_3 = x_1 * w_1_13 + x_2 * w_1_23
y_pred = z_1 * w_2_11 + z_2 * w_2_21 + z_3 * w_2_31
return y_pred

def compute_loss(y_true, y_pred):
loss = 0.5 * (y_true - y_pred) ** 2
return loss

def backward_propagation(layer_1_list, layer_2_list, optimizer):

# 清零梯度
optimizer.zero_grad()# 反向传播
loss.backward()# 使用优化器更新权重
optimizer.step()# 返回更新后的权重
return layer_1_list, layer_2_list

def parm_init():
# 初始化定义权重
w_1_11 = torch.tensor(0.5, requires_grad=True)
w_1_12 = torch.tensor(0.5, requires_grad=True)
w_1_13 = torch.tensor(0.5, requires_grad=True)
w_1_21 = torch.tensor(0.5, requires_grad=True)
w_1_22 = torch.tensor(0.5, requires_grad=True)
w_1_23 = torch.tensor(0.5, requires_grad=True)

w_2_11 = torch.tensor(1.0, requires_grad=True)
w_2_21 = torch.tensor(1.0, requires_grad=True)
w_2_31 = torch.tensor(1.0, requires_grad=True)layer_1_list = [w_1_11, w_1_12, w_1_13, w_1_21, w_1_22, w_1_23]
layer_2_list = [w_2_11, w_2_21, w_2_31]
return layer_1_list, layer_2_list

if name == ‘main’:
# 定义输入值和期望输出
x_1 = torch.tensor([40.0])
x_2 = torch.tensor([80.0])
y_true = torch.tensor([60.0])
learning_rate = 1e-5

epoch = 100'''
初始化
'''
# 初始化定义权重
layer_1_list, layer_2_list = parm_init()# 使用SGD优化器进行权重更新
optimizer = optim.SGD(layer_1_list + layer_2_list, lr=learning_rate)for i in range(epoch):# 正向传播y_pred = forward_propagation(x_1, x_2, layer_1_list, layer_2_list)# 计算损失loss = compute_loss(y_true, y_pred)# 反向传播layer_1_list, layer_2_list = backward_propagation(layer_1_list, layer_2_list, optimizer)print(f"第{i}次 预测值为: ", y_pred.item(), " 误差为: ",loss.item())

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

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

相关文章

基于 vLLM 搭建 DeepSeek-V2 Chat 服务

直奔主题。 安装vLLM 官方实现的代码还没有 merge 到 vLLM 主分支,所以直接 git clone DeepSeek 的分支。 git clone https://github.com/zwd003/vllm.git cd vllm pip install -e .源码安装大概耗时 10 分钟。 OpenAI 接口规范启动 官方 Github 放的是单条推理…

通过短信群发平台拓客引流营销的效果好不好?

通过短信群发平台进行营销拓客引流的效果可以是非常显著的,但具体效果会受到多种因素的影响,如目标受众的选择、短信内容的吸引力、发送时间和频率的合理性等。 以下是一些短信群发平台营销拓客引流的优势: 1.广泛覆盖:短…

噪声条件分数网络——NCSN原理解析

1、前言 本篇文章,我们讲NCSN,也就是噪声条件分数网络。这是宋飏老师在2019年提出的模型,思路与传统的生成模型大不相同,令人拍案叫绝!!! 参考论文: ①Generative Modeling by Es…

cesium圆形扩散扫描效果封装

效果 封装类 优化了着色器代码;增加了边框大小调整参数,增加了清除效果方法 注:在页面销毁时需要调用清除方法 CircleDiffusion.clear()/*** circleDiffusion:圆扩散特效封装类**/// 圆扩散 class CircleDiffusion {viewer;last…

docker容器安装nexus3以及nexus3备份迁移仓库数据

一、安装步骤 1.搜索nexus3镜像 docker search nexus3 2.拉取镜像 docker pull sonatype/nexus3或者指定版本 docker pull sonatype/nexus3:3.68.0 3.查看拉取的镜像 docker images | grep "nexus3" 4.启动nexus服务 直接启动 docker run -d --name nexus3 -…

怎么查看公网IP?

在网络通信中,每个设备都会被分配一个IP地址,用于在互联网上进行唯一标识和通信。公网IP是指可以被公开访问的IP地址,可以用来建立远程连接或者进行网络访问等操作。怎么查看公网IP呢?下面将介绍几种常用的方法。 使用命令行查询公…

LabVIEW高温往复摩擦测试系统中PID控制

在LabVIEW开发高温往复摩擦测试系统中实现PID控制,需要注意以下几个方面: 1. 系统建模与参数确定 物理模型建立: 首先,需要了解被控对象的物理特性,包括热惯性、摩擦系数等。这些特性决定了系统的响应速度和稳定性。实验数据获取…

吉时利Keithley 2010数字万用表7.5 位

Keithley 2010数字万用表,7.5 位 吉时利 2010 数字万用表、7.5 位、低噪声万用表将高分辨率与生产应用所需的高速度和高准确度相结合,例如测试精密传感器、换能器、A/D 和 D/A 转换器、调节器、参考、连接器、开关和继电器。2010 基于与吉时利 2000、20…

人工智能应用-实验6-卷积神经网络分类minst手写数据集

文章目录 🧡🧡实验内容🧡🧡🧡🧡代码🧡🧡🧡🧡分析结果🧡🧡🧡🧡实验总结🧡🧡 &#x1f9…

521源码-在线客服-CRMChat网页版客服系统 UNIAPP 全方位在线客服系统源码与管理体系平台

CRMChat客服系统:基于Swoole4Tp6RedisVueMysql构建的高效沟通桥梁 CRMChat是一款独立且高性能的在线客服系统,它结合了Swoole4、Tp6、Redis、Vue以及Mysql等先进技术栈,为用户提供了卓越的在线沟通体验。该系统不仅支持在Pc端、移动端、小程…

列表页9大样式,保准你看了就能掌握。

上文:一张图集齐B端列表页的16大组件,召唤神龙,看后恍然大悟。 普通列表/基础列表/常规列表 不适合移动端展示 复杂列表 加入了统计 适合移动端 项目列表 适合移动端 应用列表 适合移动端 多级列表 复杂的多级结构,下图展示了…

美国教育数据分析

文章目录 第1关:认识数据第2关:数据预处理第3关:数学成绩预测 第1关:认识数据 编程要求 根据提示,在右侧Begin-End区域补充代码,查看数据属性名称。 测试说明 程序会调用你实现的方法,查看数据…

SpringBoot——整合MyBatis

目录 MyBatis 项目总结 1、创建SQL表 2、新建一个SpringBoot项目 3、pom.xml添加依赖 4、application.properties配置文件 5、User实体类 6、UserMapper接口 7、UserMapper.xml映射文件 8、UserController控制器 9、SpringBootMyBatisApplication启动类 10、使用Po…

C语言 | Leetcode C语言题解之第98题验证二叉搜索树

题目: 题解: /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ bool isValid(struct TreeNode * root,long left,long right){if(!root){return true;}long…

一个超级简单的Python UI库:NiceGUI

大家好,图形用户界面(GUI)的开发往往被看作是一项复杂且繁琐的任务。Python作为一门强大的编程语言,提供了许多优秀的库来帮助开发者实现这一目标。今天,我们将介绍一个名为NiceGUI的库,它能帮助你轻松构建…

Science Robotics 封面论文:一种使用半球形纳米线阵列实现机器人视觉的超宽视场针孔复眼

研究背景 从生物复眼中汲取灵感,拥有一系列生动多样视觉功能特征的人工视觉系统最近脱颖而出。然而,这些人工系统中的大多数都依赖于可转换的电子设备,这些电子设备受到全局变形的复杂性和受限几何形状的影响,以及光学和探测器单元…

好的架构是进化来的,不是设计来的

很多年前,读了子柳老师的《淘宝技术这十年》。这本书成为了我的架构启蒙书,书中的一句话像种子一样深埋在我的脑海里:“好的架构是进化来的,不是设计来的”。 2015 年,我加入神州专车订单研发团队,亲历了专…

Wav2Vec 2.0:语音表示自监督学习框架

Wav2Vec 2.0是目前自动语音识别的模型之一。 Wav2Vec 2.0 代表了无监督预训练技术在语音识别领域的重大进步。这些方法通过直接从原始音频中学习,无需人工标记,因此可以有效利用大量未标记的语音数据集。相比于传统的监督学习数据集通常只有大约几百小时…

文章解读与仿真程序复现思路——电力系统保护与控制EI\CSCD\北大核心《基于改进Q学习算法和组合模型的超短期电力负荷预测》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

Cookie 和 Session概念及相关API

目录 1.Cookie概念 2.理解会话机制 (Session) 3.相关API 3.1HttpServletRequest 3.2HttpServletResponse 3.3HttpSession 3.4Cookie 4.代码示例: 实现用户登陆 1.Cookie概念 Cookie 是存储在用户本地终端(如计算机、手机等)上的数据片段。 它…