反向传播——机器学习

news2024/11/18 1:23:32

目录

一、实验内容

二、实验过程

1、算法思想

2、算法原理

3、算法分析

三、源程序代码

四、运行结果及分析

 五、实验总结


 

一、实验内容


  1. 掌握线性反向传播的原理;
  2. 掌握线性反向传播的算法Python实现;
  3. 熟悉非线性反向传播的原理;
  4. 掌握非线性反向传播的算法Python实现。

二、实验过程


1、算法思想


        反向传播是利用函数的链式求导来进行推导的,目的是通过不断调整权重和偏置来不断减小误差,最终得到误差最小的神经网络。

2、算法原理


        反向传播线性回归的思想是一样的,是一种与最优化方法(如梯度下降法)结合使用的,逐渐调节参数,用来训练人工神经网络的常见方法。

3、算法分析


(1)将训练集数据输入到n的输入层,经过隐藏层,最后达到输出层并输出结果,这是n的前向传播过程;

(2)由于n的输出结果与实际结果有误差,则计算估计值与实际值之间的误差,并将该误差从输出层向隐藏层反向传播,直至传播到输入层;

3)在反向传播的过程中,根据误差调整各种参数的值;不断迭代上述过程,直至收敛。

三、源程序代码


import numpy as np
import math
import tensorflow as tf
import matplotlib.pyplot as plt
 
 
def grad_sigmoid(n):
    # 求sigmoid梯度
    return np.array(tf.sigmoid(1.0 - tf.sigmoid(n)))
 
 
def g(p):
    # 目标函数值
    t = []
    index = 0
    for i in p:
        t.append(1.0 + math.sin(p[index] * np.pi/4))
        index += 1
    return t
 
 
# 采用1-2-1网络,输入为1维,隐藏层为2维,输出为一维
# 隐藏层为对数-S型层
# 输出层为线性层
# N为batch size; 训练集一批401个,输入p在[-2,2]区间以0.01间距的等距采样,有对应的目标向量t=g(p)。
# D_in 输入维度
# H为隐藏层维度
# D_out 输出维度
N, D_in, H, D_out = 401, 1, 2, 1
 
# 生成训练集,输入向量p和目标向量t
p = np.linspace(start=-2.0, stop=2.0, num=N)
t = g(p)
p = np.array([p])
t = np.array([t])
print("输入向量:")
print(p)
print("输入向量长度:")
print(len(p))
print("目标向量:")
print(t)
print("目标向量长度:")
print(len(t))
 
print("随机生成初始权值矩阵:")
# w1 = np.random.randn(H, D_in)
# w2 = np.random.randn(D_out, H)
w1 = np.array([[-0.27], [-0.41]])
w2 = np.array([[0.09, -0.17]])
print("W1:")
print(w1)
print("W2:")
print(w2)
 
print("随机生成初始偏置")
# b1 = np.random.randn(H, D_in)
# b2 = np.random.randn(D_out, D_out)
b1 = np.array([[-0.48], [-0.13]])
b2 = 0.48
print("b1:")
print(b1)
print("b2:")
print(b2)
 
# 设置学习率为0.1
alpha = 0.01
 
for i in range(900):
    # 前向传播计算
    n1 = w1.dot(p) + b1
    a1 = np.array(tf.sigmoid(n1))
    a2 = w2.dot(a1) + b2
    # n2==a2  输出层为线性层
    # 计算误差
    loss = np.square(a2 - t).sum()/N
    if i % 10 == 0 or i == 900:
        print(i, loss)
 
    # 最后层敏感度计算,最后一层为线性函数,导数为1,
    s2 = -2.0 * (t - a2)
    # w2_sub 为 w2的对角矩阵
    w2_sub = np.array([[w2[0][0], 0], [0, w2[0][1]]])
    s1 = (grad_sigmoid(n1).T.dot(w2_sub) * s2.T).T
    grad_w2 = np.array(np.zeros((D_out, H)))
    grad_w1 = np.array(np.zeros((H, D_in)))
    grad_b2 = np.array(np.zeros((D_out, D_out)))
    grad_b1 = np.array(np.zeros((H, D_in)))
    # 计算批处理的梯度
    for m in range(0, N - 1):
        grad_w2 += 1 / N * a1.T[m] * s2[0][m]
        grad_w1 += 1 / N * np.array([p[0][m] * s1.T[m]]).transpose()
        grad_b2 += 1 / N * s2[0][m]
        grad_b1 += 1 / N * np.array([s1.T[m]]).transpose()
    # 更新权重偏置,向梯度相反的方向下降
    w1 -= alpha * grad_w1
    w2 -= alpha * grad_w2
    b1 -= alpha * grad_b1
    b2 -= alpha * grad_b2
print("训练结束:")
print("w1:")
print(w1)
print("w2:")
print(w2)
print("b1:")
print(b1)
print("b2:")
print(b2)
# test = np.array([np.random.uniform(-2, 2, size=N)])
test = np.array([np.linspace(start=-2.0, stop=2.0, num=N)])
out = w2.dot(tf.sigmoid(w1.dot(test) + b1)) + b2
plt.xlabel('in')
plt.ylabel('out')
plt.xlim(xmax=2, xmin=-2)
plt.ylim(ymax=2, ymin=0)
colors1 = '#00CED1'
colors2 = '#054E9F'
area1 = np.pi * 2 ** 1  # 点面积
area2 = np.pi * 1 ** 1  # 点面积
# 画散点图
plt.scatter(p, t, s=area1, c=colors1, alpha=1, label='origin')
plt.scatter(test, out, s=area2, c=colors2, alpha=0.5, label='test')
plt.legend()
plt.show()



四、运行结果及分析


 五、实验总结


        反向传播就是要将神经网络的输出误差,一级又一级地传播到神经网络的输入。在该过程中,需要计算每一个权重对总的损失函数的影响, 即损失函数对每个权重的偏导。根据权重对误差的影响,再乘以步长,就可以更新整个神经网络的权重。 当一次反向传播完成之后,网络的参数模型就可以得到更新。

        更新一轮之后,接着输入下一个样本, 算出误差后又可以更新一轮,再输入一个样本,又来更新一轮,通过不断地输入新的样本迭代地更新模型参数,就可以缩小计算值与真实值之间的误差,最终完成神经网络的训练。

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

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

相关文章

图的存储方式

一、邻接矩阵 图的邻接矩阵存储方式就是用两个数组来表示图。一个一维数组存储图的顶点信息,另一个二维数组存储图中边的信息。 对于无向图来说,我们可以用1表示两顶点相连,用0表示两顶点不相连。任意顶点的度为邻接矩阵中该节点的行或列的…

pytorch案例代码-2

循环神经网络——基础知识 适合前后有联系的连续数据预测,比如天气预测、股市预测、自然语言等,而这些用DNN、CNN来做计算量就太大或者没法做,h0是先验,也可以前面接上CNNFC后面连上RNN,就可以完成图像到文本的转换&am…

AE VAE 代码和结果记录

Auto Encoder 在MNIST 上记录 直接上代码 import os os.chdir(os.path.dirname(__file__)) import torch import torch.nn as nn import torch.nn.functional as F import torchvision from torchvision import transforms from torchvision.utils import save_image from to…

数据结构-学习-01-线性表之顺序表-初始化、销毁、清理、获取长度、判断为空、获取元素等实现

一、测试环境 名称值cpu12th Gen Intel Core™ i7-12700H操作系统CentOS Linux release 7.9.2009 (Core)内存3G逻辑核数2gcc 版本4.8.5 20150623 二、个人理解 数据结构分为逻辑结构和物理结构(也称为存储结构)。 1、逻辑结构 逻辑结构又可以分为以下…

JS 事件

事件 事件是 JS 和 HTML 交互的桥梁。采用“观察者模式”,使用仅在事件发生时执行的监听器(也叫处理程序)订阅事件 事件流 事件流描述的是页面接收事件的顺序。分为 3 各阶段: 事件捕获:最先触发,可以做…

致敬经典 睛彩再现——AVS产业联盟和中国移动咪咕公司携手推动AVS3视频、音频标准

2022年11月14日,中国移动咪咕公司首发AVS3移动端规模化商用版本咪咕视频6.0.7.00,该版本下设的“致敬经典 睛彩再现”专区、以及“菁彩视听”双Vivid直播视角(Audio Vivid & HDR Vivid),通过国家自主的AVS3、Audio…

回顾复习【矩阵分析】初等因子 和 矩阵的相似 || 由不变因子求初等因子 || 由初等因子和秩求Smith标准形(不变因子)

目录 1. 由不变因子,引出 初等因子的概念2. 【必看】例子:已知 不变因子,求初等因子。3.【必看】 例子:已知 秩和初等因子,求史密斯标准形(不变因子)4. 分块矩阵 初等因子的 求法5. 数字矩阵的相似 与 入-矩阵的等价1. 由不变因子,引出 初等因子的概念 例如,下面两个矩阵…

Kotlin 开发Android app(十):Android控件绑定ViewBinding

上一节中,我们知道了Android的布局,这种把界面和逻辑控制分开,是编程里很好的分离方式,也大大的解耦了界面和逻辑控制,使得编程的逻辑不在和界面挂钩。 有了界面的布局,我们需要把界面和代码部分进行绑定&…

OpenPose训练教程

找遍全网都没有非常完整的OpenPose训练教程 决定自己摸索并且记录下来 openpose作者发布了一份训练代码,下面根据这个来操作 GitHUB地址: openpsoe_train 环境:ubuntu 执行matklab脚本的时候懒得下载新的matlab 就在windows下运行的 感觉没…

品质为先,服务不停,广州流辰信息公司恪守初心,匠心为民!

随着互联网技术的蓬勃发展,越来越多的企业也感受到了日益激烈的竞争,也意识到墨守成规的发展模式必当会让企业停滞不前,只有一步一个脚印,始终跟随市场的脚步创新升级,才有可能在汹涌的市场洪流中站稳脚跟。广州流辰信…

精简 Windows10

下载链接文后评论里找: 旧机福音 极限精简Win10系统Tiny10https://baijiahao.baidu.com/s?id1743901721464184983不想成天折腾操作系统,一直以来都认为跟着微软每月升级就好了。但是现实啪啪的打脸:升级到Windows11 22H2 后, 连…

常见算法设计与分析的简单C++代码实现(排列、二分法搜索、Dijkstra算法、元素换位、单调子序列、硬币问题、运动员最佳匹配问题)

常见算法设计与分析的简单C代码实现(排列、二分法搜索、Dijkstra算法、元素换位、单调子序列、硬币问题、运动员最佳匹配问题)1 一些简单排列问题2 二分法查找3 前后元素换位4 找最长单调递增子序列(O(n2)复杂度)5最小硬币问题一、…

c3p0,DBCP,Druid(德鲁伊)数据库连接池

c3p0,DBCP,Druid(德鲁伊)数据库连接池 每博一文案 佛说:前世 500 次的回眸,才换来今生的一次擦肩而过。 人与人之间的缘分,真的无需强求,并不是所有的感情都能天长地久,…

C#压缩图片

SqlSer数据库设置保存图片字段类型为Image类型 对应保存 方法参数为图片路径&#xff0c;压缩后路径&#xff0c;压缩最大宽度&#xff0c;压缩最大高度 引用类型using System.Data; using System.Drawing; using System.IO; \完整类 /// <summary> /// 按比例缩放&…

七牛qshell 批量上传 mac 本地目录

七牛qshell 批量上传 mac 本地目录下载路径及使用方法(官方)下载到自己指定的文件夹添加环境变量,使qshell在任意地方可以执行添加密钥 生成账户文件下载路径及使用方法(官方) https://developer.qiniu.com/kodo/1302/qshell记录自己部署遇到的问题及操作步骤 下载到自己指定…

音视频开发核心知识点及源码解析,还不赶紧收藏起来

随着基础设施的完善&#xff08;光纤入户、wifi覆盖、5G普及&#xff09;的影响&#xff0c;将短视频、直播、视频会议、在线教育、在线医疗瞬间推到了顶峰&#xff0c;人们对音视频的需求和要求也越来越强烈 音视频开发还具有许多方向&#xff0c;比如&#xff1a; 如果对音视…

C语言:while后加分号与for后加分号的区别

while 后面不能加分号&#xff0c;否则虽然编译可以通过&#xff0c;但是执行程序时会发生死循环#include <stdio.h> int main() { int i1,total0; while(i<100)//不能在 while 后面加分号 { totali; i;//循环…

个人付费专栏上线预热

个人付费专栏上线预热 专栏地址&#xff1a;请点击访问 文章目录一、订阅这个专栏有什么好处&#xff1f;二、实战项目预告1. 活动类站点 &#xff08;已完成前端后端&#xff09;2. 电商项目 &#xff08;筹备中&#xff0c;一比一还原设计图&#xff09;3. 论坛问答系统 &…

每日三题-爬楼梯、买卖股票的最佳时机、正则表达式匹配

&#x1f468;‍&#x1f4bb;个人主页&#xff1a; 才疏学浅的木子 &#x1f647;‍♂️ 本人也在学习阶段如若发现问题&#xff0c;请告知非常感谢 &#x1f647;‍♂️ &#x1f4d2; 本文来自专栏&#xff1a; 算法 &#x1f308; 算法类型&#xff1a;Hot100题 &#x1f3…

IP 摄像机移动应用 SDK 开发入门教程(安卓版)

涂鸦智能安卓版摄像机&#xff08;IP Camera&#xff0c;简称 IPC&#xff09;SDK 是基于智能生活 App SDK 开发而成。 通过移动应用控制物理网设备是常见的使用场景&#xff0c;但由于设备的品类丰富&#xff0c;增大了应用开发难度。因此 智能生活 App SDK 提供了常见的垂直…