【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.5

w_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_31

w_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_23

y_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_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,learning_rate):

    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

    # 计算输出层关于损失函数的梯度
    d_loss_predicted_output = -(y_true - y_pred)

    # 计算权重关于损失函数的梯度
    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

    d_loss_w_1_11 = d_loss_predicted_output * w_2_11 * x_1
    d_loss_w_1_21 = d_loss_predicted_output * w_2_11 * x_2
    d_loss_w_1_12 = d_loss_predicted_output * w_2_21 * x_1
    d_loss_w_1_22 = d_loss_predicted_output * w_2_21 * x_2
    d_loss_w_1_13 = d_loss_predicted_output * w_2_31 * x_1
    d_loss_w_1_23 = d_loss_predicted_output * w_2_31 * x_2

    # 使用梯度下降法更新权重
    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_31

    w_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

    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


def parm_init():
    # 初始化定义权重
    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.5

    w_2_11 = 1.0
    w_2_21 = 1.0
    w_2_31 = 1.0

    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 = 40.0
    x_2 = 80.0
    y_true = 60.0
    learning_rate = 1e-5

    epoch = 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())

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

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

相关文章

RocketMQ实战教程之RocketMQ安装(含Docker安装,建议收藏!)

RocketMQ实战教程之RocketMQ安装 这里实例采用centos系统天翼云为例,分别采用传统安装以及Docker安装的方式来进行RocketMQ的安装.JDK8我这边已经安装配置好了,这里就不在赘述.直接进入正题: 传统安装包安装 系统要求 64位操作系统,推荐 Linux/Unix/macOS64位 JDK…

Java 对外API接口开发 java开发api接口如何编写

Java API API(Application Programming Interface)是指应用程序编程接口,的JavaAPI是指JDK提供的各种功能的Java类 String类 String类的初始化: (1)使用字符串常量直接初始化 初始化:String s…

第11章 集合与迭代器

目录 目录 目录 11.1 Collection集合 11.1.1 集合的概念 11.1.2 Collection接口 1、添加元素 2、删除元素 3、查询与获取元素 11.2 List 有序集合 11.2.1 新增方法 11.2.2 ArrayList 11.2.3 LinkedList 1、单向链表 2、双向链表 3、删除元素 11.3 Set 无序集合 …

深度学习-转置卷积

转置卷积 转置卷积(Transposed Convolution),也被称为反卷积(Deconvolution),是深度学习中的一种操作,特别是在卷积神经网络(CNN)中。它可以将一个低维度的特征图&#x…

深入 Rust 标准库,Rust标准库源代码系统分析

系列文章目录 送书第一期 《用户画像:平台构建与业务实践》 送书活动之抽奖工具的打造 《获取博客评论用户抽取幸运中奖者》 送书第二期 《Spring Cloud Alibaba核心技术与实战案例》 送书第三期 《深入浅出Java虚拟机》 送书第四期 《AI时代项目经理成长之道》 …

智能猫眼锁核心解决方案以及芯片简介SSD222

书接上回,前篇文章我们诠释了IP 网络摄像系统的定义以及组成部分的功能,也大概的讲了一下所针对的市场以及举例介绍了一款相关芯片,详情可点击下面卡片浏览高集成IP摄像SOC处理方案简介https://blog.csdn.net/Chipsupply/article/details/139…

PDF Reader Pro for Mac 直装激活版:专业PDF阅读编辑软件

在数字化时代,PDF文件已成为我们日常工作和学习中不可或缺的一部分。然而,如何高效、便捷地阅读、编辑和管理这些PDF文件,却一直是许多人面临的难题。现在,有了PDF Reader Pro for Mac,这些难题将迎刃而解。 PDF Reade…

谷歌快速收录怎么做?

快速收录顾名思义,就是让新的的网页内容能够迅速被谷歌搜索引擎抓取、索引和显示在搜索结果中,这对于做seo来说非常重要,因为它有助于新发布的内容尽快出现在谷歌的搜索结果中,从而增加网站的流量 想做谷歌快速收录谷歌推荐了几种…

AD162A低功耗语音解码芯片,助眠耳机方案推荐—云信通讯

睡眠一直是很多人所追寻的目标,无论是因为工作压力过大,还是日常烦扰的思绪,一个好的睡眠质量对每个人来说都至关重要。为了解决这个问题,一些科技公司开发了高品质的助眠耳机,通过音乐和声音来帮助入睡,为…

华为大咖说 | 企业应用AI大模型的“道、法、术” ——道:认知篇

本文作者:郑岩(华为云AI变革首席专家)全文约3313字,阅读约需8分钟,请仔细看看哦~ 前阵子,我在公司内部发了一篇Sora的科普贴,本来只是个简单的技术总结,但让我意外的是,…

linux系统安全加固

目录 1、账户安全基本措施 1)系统账户清理 2)密码安全控制 3)命令历史限制 2、用户切换及提权 1)使用 su命令切换用户 2)使用sudo机制提升权限 3、系统引导和安全登录控制 1)开机安全控制 2&…

docker如何拉取nginx最新镜像并运行

要拉取Docker Hub上的最新Nginx镜像,您可以使用以下命令: docker pull nginx 这个命令会从Docker Hub下载最新版本的Nginx镜像。如果您想要拉取特定版本的Nginx镜像,可以指定版本号,例如: docker pull nginx:1.18.0 拉…

实在智能签约世界机械500强特变电工 ,加速能源装备巨头智能化升级

近日,世界机械500强、中国企业500强特变电工集团正式与实在智能达成战略合作,由实在智能为其部署RPA数字员工解决方案,助力集团公司各级财务部门提升自动化水平,进一步实现集团内降本增效目标。 关于特变电工 特变电工是国家级高…

AI工具推荐:提升工作效率与生活质量

有哪些好用,且国内可用的AI工具? 副本 在AI大发展的年代,还有人在工作、生活中没有使用过AI吗? 今天为大家推荐几款国内可用、好用的AI工具,不论是自媒体文案写作、打工人汇报PPT、还是论文、公文写作,总…

Centos7离线安装RabbitMQ教程

目录 安装包准备开始安装1. 创建目录2. 上传文件3. 安装erlang语言4. 安装socat5. 安装rabbitmq6. 启动、停止rabbitmq7. 设置开机启动8. 开启web界面管理工具9. 开启防火墙(root)10. 访问页面11. 附录 安装包准备 (1)准备RabbitMQ的安装包(…

使用中心点检测进行对象检测、3D 检测和姿态估计:

检测将对象识别为图像中轴对齐的框。大多数成功的物体检测器都枚举了几乎详尽的潜在物体位置列表,并对每个位置进行分类。这是浪费、低效的,并且需要额外的后处理。在本文中,我们采用了不同的方法。我们将一个对象建模为一个点,即…

张驰咨询:告别杂乱无章,让精益生产培训帮你搞定一切!

在当今快速变化和竞争激烈的市场环境中,企业要想持续发展,提升生产效率和降低成本是关键。精益生产培训作为一种高效的生产方式和管理哲学,为企业提供了实现这些目标的有效途径。以下是张驰咨询对精益生产培训核心理念、实践方法及其对企业持…

关于光照模型

关于光照模型 早期学习笔记,转载自早期Excel。 存在大量格式错误、可读性非常低,建议等待作者修复后阅读、或者作为查找性材料使用。 中文名英文名/缩写说明长什么样兰伯特光照模型Lambert Lighting1.兰伯特反射(Lambert)是最常见的一种漫反射&#x…

C++ const_cast学习

语法&#xff0c; const_cast<type_name>(expression) type_name是转换的类型&#xff0c;expression是被转换的对象或者表达式&#xff1b; const_case有两个功能&#xff0c;分别是去掉const和加上const&#xff0c;更多用于去掉const&#xff0c;修改被const修…

亚马逊卖家账号注册复杂吗?需要什么辅助工具吗?

在当今数字化的商业世界中&#xff0c;亚马逊作为全球最大的电商平台之一&#xff0c;吸引着无数的卖家和买家。对于想要进入亚马逊销售市场的卖家来说&#xff0c;首先要完成的一项重要任务就是注册亚马逊卖家账号。本文将详细介绍亚马逊注册的步骤、所需时间&#xff0c;以及…