第3章 多层感知器

这章节我们来解决的问题是:如何使用神经网络实现逻辑电路中的“异或门”模型?

如下图:

根据第2章我们知道,单层感知器是能够解决“与门”、“或门”、“非门”这些简单的线性问题,但是不能解决“异或门”这类非线性问题。

1.1 解决异或门问题的思路

如果在单层感知器上增加一层,能够很好的解决异或问题。

例如网络结构如下:

我们把每一个感知器节点代表了一个分类器,那么几个节点学习到的分割线如下:

以上3个节点的组合就可以解决异或门问题。

1.2 sigmoid激活函数 -- 线性转为非线性

多层感知器中,我们期望分割面是非线性的,故选择为sigmoid为激活函数

sigmoid表达式和曲线:

sigmoid函数也叫 Logistic 函数,取值范围为(0,1),它可以将一个实数映射到(0,1)的区间。

求导如下:

这个公式在计算梯度的时候用到。

那么采样非线性激活函数,神经网络就有可能学习到平滑的曲线来分割平面,从线性到非线性

1.3 新的问题

按照单层感知器的权重更新,节点3的权重更新可以轻松求得;但是节点1和节点2权重的更新如何求解呢?

按照公式如下:

要求得w111必须要知道节点1的期望值,但是节点1,2的期望值不存在,不能直接求其梯度。

解决方案:误差反向传播算法(Backpropagation,BP算法)

1.4 误差反向传播算法 -- BP算法

神经网络的训练关键在于如何调整权值和阈值,采用的算法:

(1)单层感知机的算法:梯度下降算法;

(2)多层感知器的算法:误差反向传播算法(error Back Propagation),简称BP算法。

反向传播过程如下:

在多层神经网络中,从最后一层开始,逐层的反向进行误差信息传递,并更新相应权重。使用BP算法的多层前馈(向前传播方式没有回路或者环路)网络又称之为BP神经网络;

BP神经网络学习过程:

以下图来源:http://galaxy.agh.edu.pl/~vlsi/AI/backp_t_en/backprop.html

(1)以一个3层全连接网络来为例子

下面通过一个3层全连接网络来讲解,包含2个输入、2个隐藏层(第1层3个节点、第2层2个节点)、一个输出(第3层1个节点),节点计算如右图:

(2)前向传播

输入层到隐藏层的计算,即计算第一层输出y1,y2,y3

隐藏层到隐藏层的计算,即计算第2层输出y4,y5。

隐藏层到输出层,即计算输出y

(3)反向传播

反向传播,根据网络的连接路径,从输出层反向把误差项前向传递,并更新权重和偏置参数的过程。

误差项计算:将网络输出信号y与训练数据集的输出值z(期望值)进行比较,得到的差异被称为输出层神经元的误差信号d(不是均方误差,是计算梯度的某一项)

内部神经元的误差项的计算,有2种情况:

<1>误差权重:即前向传播的权重;

<2>如果传播的误差来自多个关联神经元,它们将被叠加。

(4)权重更新

权重更新,根据网络的连接路径,从输出层反向把误差反向传递并更新权重和偏置的过程。

权重更新公式:

(5)总结

来源:http://neuralnetworksanddeeplearning.com/chap2.html

1.5 多层感知器 -- 异或门例子

异或门数据集定义:

import numpy as np

def get_xy_data():
    """ XOR的训练集 -- 真值表 """
    x = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
    y = np.array([0, 1, 1, 0])
    return x,y

多层感知器模型定义:

import numpy as np

""" 定义感知器模型结构 """
class XORGateModel():
    def __init__(self):
        """ 初始化权重、偏置 """
        self.w = np.random.normal(size=6).reshape((3, 2))   # 权重
        self.b = np.random.normal(size=3)                   # 偏置
        self.lr = 0.1                                       # 学习率(超参数)

    def sigmoid(self, x):
        return 1/(1 + np.exp(-x))
    
    def dsigmoid(self, x):
        y = self.sigmoid(x)
        return y * (1 - y)

    def forward(self, x):
        """ 前向计算 """
        y1 = self.sigmoid((x[0]*self.w[0][0]) + (x[1]*self.w[0][1]) + self.b[0])
        y2 = self.sigmoid((x[0]*self.w[1][0]) + (x[1]*self.w[1][1]) + self.b[1])
        y3 = self.sigmoid((y1*self.w[2][0]) + (y2*self.w[2][1]) + self.b[2])
        return y3
    
    def update_weight(self, x, n, d):
        e = (x[0] * self.w[n][0]) + (x[1] * self.w[n][1]) + self.b[n]
        self.w[n][0] = self.w[n][0] + (self.lr * d * self.dsigmoid(e) * x[0])
        self.w[n][1] = self.w[n][1] + (self.lr * d * self.dsigmoid(e) * x[1])
        self.b[n]    = self.b[n]    + (self.lr * d * self.dsigmoid(e))

    def train(self, X, Y):
        """
        X,Y -- 训练集
        """
        for i in range(100000):   # 迭代
            j = 0
            C = 0
            for xi in X:
                yi = self.forward(xi)               # 前向计算
                Ci = np.power((Y[j] - yi), 2) / 2   # 计算误差
                C += Ci
                # 更新权重跟偏置
                if Ci > 0:
                    d = Y[j] - yi
                    d1 = self.w[2][0] * d
                    d2 = self.w[2][1] * d
                    self.update_weight(xi, 0, d1)   # 节点1
                    self.update_weight(xi, 1, d2)   # 节点2
                    self.update_weight(xi, 2, d)    # 节点3
                j += 1
            print("epoch{} 误差:{}, 权重:{}".format(i, C, self.w))
            # 什么时候退出?
            if C <= 0.05:
                print("=== 与门的4数据都正确了, 退出迭代")
                break

训练并保存参数:

# 训练
    import data_manager
    X, Y = data_manager.get_xy_data()  # 读取数据集
    model = XORGateModel()            # 实例化类对象
    model.train(X, Y)               # 执行训练
    # 验证训练结果是否正确
    for xi in X:
        print("验证  输入:{}   模型的前向计算结果:{}".format(xi, model.forward(xi)))
    # 保存模型参数
    np.savez("./params", model.w, model.b)

读取参数并预测:

import numpy as np

if __name__ == "__main__":
    # 加载参数
    r = np.load("./params.npz")
    print("权重", r["arr_0"])
    print("偏置", r["arr_1"])
    # 设置参数到网络结构
    import model
    and_model = model.AndGateModel()
    and_model.w = r["arr_0"]
    and_model.b = r["arr_1"]
    # 预测
    X = [[0,0], [0, 1], [1, 0], [1, 1]]
    for xi in X:
        print("预测  输入:{}  结果:{}".format(xi, and_model.forward(xi)))

代码地址:https://download.csdn.net/download/qq_21386397/87567645

有帮助,一键三连哦~~~~~~~~~~~~~~~~~~~~~~~~

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

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

相关文章

内存函数的简单实用

本篇要分享的是常见的内存函数 前面分享的函数都是和字符串相关&#xff0c;但是当我们在操作数据的时候不仅仅要操作字符数据 接下来分享几个与内存相关的函数 目录 本篇要分享的是常见的内存函数 1.memcpy 2.memmove 自定函数模拟实现memmove函数 3.memcmp 4.memset …

【算法经典题集】DP和枚举(持续更新~~~)

&#x1f63d;PREFACE&#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐ 评论&#x1f4dd;&#x1f4e2;系列专栏&#xff1a;算法经典题集&#x1f50a;本专栏涉及到的知识点或者题目是算法专栏的补充与应用&#x1f4aa;种一棵树最好是十年前其次是现在DPDP就是动态规划&a…

Web前端 JS WebAPI

1、操作DOM 1.1、什么DOM&#xff1f; DOM&#xff08;Document Object Model——文档对象模型&#xff09;&#xff1a;DOM是浏览器提供的一套专门用来操作网页内容的功能 DOM作用&#xff1a;开发网页内容特效和实现用户交互 DOM树是什么&#xff1f; 将 HTML 文档以树状…

手把手教你使用vue创建第一个vis.js

先看一下实现效果吧 &#xff0c;如下图 &#xff1a; 为什么要写这篇文章呢&#xff1f;因为之前有浅浅的了解一下vis.js&#xff0c;后期开发中没有使用vis&#xff0c;所以太深奥的也不懂&#xff0c;但是当时是用js写的。这两天有人问我用vue怎么写&#xff0c;然后说看到…

减治法实现插入排序,减治法实现二叉查找树(二叉搜索数,二叉排序数)的创建、插入与查找(含解析与代码实现)

&#x1f38a;【数据结构与算法】专题正在持续更新中&#xff0c;各种数据结构的创建原理与运用✨&#xff0c;经典算法的解析✨都在这儿&#xff0c;欢迎大家前往订阅本专题&#xff0c;获取更多详细信息哦&#x1f38f;&#x1f38f;&#x1f38f; &#x1fa94;本系列专栏 -…

嵌入式软件开发之Linux下C编程

目录 前沿 Hello World&#xff01; 编写代码 编译代码 GCC编译器 gcc 命令 编译错误警告 编译流程 Makefile 基础 何为 Makefile Makefile 的引入 前沿 在 Windows 下我们可以使用各种各样的 IDE 进行编程&#xff0c;比如强大的 Visual Studio。但是在Ubuntu 下如何进…

【Java版oj】day10 井字棋、密码强度等级

目录 一、井字棋 &#xff08;1&#xff09;原题再现 &#xff08;2&#xff09;问题分析 &#xff08;3&#xff09;完整代码 二、密码强度等级 &#xff08;1&#xff09;原题再现 &#xff08;2&#xff09;问题分析 &#xff08;3&#xff09;完整代码 一、井字棋 &a…

CAT8网线测试仪使用中:线缆的抗干扰参数解读以及线缆工艺改进注意事项

FLUKE Agent platform -深圳维信&#xff0c;带你更深入的了解铜缆测试&#xff0c;详细为您讲解什么是TCL/ELTCL&#xff0c;他们对数据的传输到底有什么影响呢&#xff1f; 前情分析&#xff1a;为什么用双绞线传输信号&#xff1f;&#xff08;一图就懂&#xff09; TCL&a…

【深度解刨C语言】符号篇(全)

文章目录一.注释二.续行符与转义符1.续行符2.转义符三.回车与换行四.逻辑操作符五.位操作符和移位操作符六.前置与后置七.字符与字符串八./和%1.四种取整方式2.取模与取余的区别和联系3./两边异号的情况1.左正右负2.左负右正九.运算符的优先级一.注释 注释的两种符号&#xff…

Sentinel

SentinelSentinel介绍什么是Sentinel?为什么需要流量控制&#xff1f;为什么需要熔断降级&#xff1f;一些普遍的使用场景本文介绍参考&#xff1a;Sentinel官网《Spring Cloud Alibaba 从入门到实战.pdf》Sentinel下载/安装项目演示构建项目控制台概览演示之前需先明确&#…

【webrtc】ICE 到VCMPacket的视频内存分配

ice的数据会在DataPacket 构造是进行内存分配和拷贝而后DataPacket 会传递给rtc模块处理rtc模块使用DataPacket 构造rtp包最终会给到OnReceivedPayloadData 进行rtp组帧。吊炸天的是DataPacket 竟然没有声明析构方法。RtpVideoStreamReceiver::OnReceivedPayloadData 的内存是外…

3.网络爬虫——Requests模块get请求与实战

Requests模块get请求与实战requests简介&#xff1a;检查数据请求数据保存数据前言&#xff1a; 前两章我们介绍了爬虫和HTML的组成&#xff0c;方便我们后续爬虫学习&#xff0c;今天就教大家怎么去爬取一个网站的源代码&#xff08;后面学习中就能从源码中找到我们想要的数据…

普通Java工程师 VS 优秀架构师

1 核心能力 1.1 要成为一名优秀的Java架构师 只懂技术还远远不够&#xff0c;懂技术/懂业务/懂管理的综合型人才&#xff0c;才是技术团队中的绝对核心。 不仅仅是架构师&#xff0c;所有的技术高端岗位&#xff0c;对人才的综合能力都有较高的标准。 架构路线的总设计师 规…

安卓渐变的背景框实现

安卓渐变的背景框实现1.背景实现方法1.利用PorterDuffXfermode进行图层的混合&#xff0c;这是最推荐的方法&#xff0c;也是最有效的。2.利用canvas裁剪实现&#xff0c;这个方法有个缺陷&#xff0c;就是圆角会出现毛边&#xff0c;也就是锯齿。3.利用layer绘制边框1.背景 万…

多线程案例——阻塞队列

目录 一、阻塞队列 1. 生产者消费者模型 &#xff08;1&#xff09;解耦合 &#xff08;2&#xff09;“削峰填谷” 2. 标准库中的阻塞队列 3. 自己实现一个阻塞队列&#xff08;代码&#xff09; 4. 自己实现生产者消费者模型&#xff08;代码&#xff09; 一、阻塞队列…

【Pytorch】 理解张量Tensor

本文参加新星计划人工智能(Pytorch)赛道&#xff1a;https://bbs.csdn.net/topics/613989052 这是目录张量Tensor是什么&#xff1f;张量的创建为什么要用张量Tensor呢&#xff1f;总结张量Tensor是什么&#xff1f; 在深度学习中&#xff0c;我们经常会遇到一个概念&#xff…

更改Hive元数据发生的生产事故

今天同事想在hive里用中文做为分区字段。如果用中文做分区字段的话&#xff0c;就需要更改Hive元 数据库。结果发生了生产事故。导致无法删除表和删除分区。记一下。 修改hive元数据库的编码方式为utf后可以支持中文&#xff0c;执行以下语句&#xff1a; alter table PARTITI…

Vue初入,了解Vue的发展与优缺点

作者简介&#xff1a;一名计算机萌新、前来进行学习VUE,让我们一起进步吧。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;我叫于豆豆吖的主页 前言 从本章开始进行Vue前端的学习&#xff0c;了解Vue的发展&#xff0c;以及背后的故事。 一.vue介…

ASEMI代理瑞萨TW9992AT-NA1-GE汽车芯片

编辑-Z TW9992AT-NA1-GE是一款低功耗NTSC/PAL模拟视频解码器&#xff0c;专为汽车应用而设计。它支持单端、差分和伪差分复合视频输入。集成了对电池短路和对地短路检测&#xff0c;先进的图像增强功能&#xff0c;如可编程的自动对比度调整&#xff08;ACA&#xff09;和MIPI…

【Linux】网络编程套接字(下)

&#x1f387;Linux&#xff1a; 博客主页&#xff1a;一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 看似不起波澜的日复一日&#xff0c;一定会在某一天让你看见坚持…