深入理解多层感知机(MLP):原理与代码解析

news2024/12/23 9:22:25

文章目录

  • 1. MLP的原理
    • 1.1 结构
    • 1.2 激活函数
    • 1.3 前向传播
    • 1.4 反向传播算法
  • 2.MLP分类任务应用
  • 3.参考文献:

多层感知机(MLP)是一种经典的神经网络模型,由多个神经元层组成。它的结构和功能使其成为深度学习中的重要组成部分。MLP在各种任务中表现出色,如图像分类、文本分类、预测和回归等。

1. MLP的原理

1.1 结构

MLP由输入层、隐藏层和输出层组成。输入层接收输入数据,隐藏层通过学习特征表示,输出层产生最终的预测结果。隐藏层和输出层的每个神经元都具有激活函数,用于引入非线性映射。
在这里插入图片描述

1.2 激活函数

常用的激活函数包括Sigmoid、ReLU、Tanh等。激活函数的作用是在神经网络中引入非线性性质,使其能够学习复杂的非线性关系。

1.3 前向传播

MLP的前向传播过程即从输入层到输出层的计算过程。它涉及到权重和偏置的计算、激活函数的应用等。通过一个简单的二分类任务为例来演示MLP的前向传播过程。

import numpy as np

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

# MLP的前向传播
def forward_propagation(inputs, weights, biases):
    hidden_layer = sigmoid(np.dot(inputs, weights[0]) + biases[0])
    output_layer = sigmoid(np.dot(hidden_layer, weights[1]) + biases[1])
    return output_layer

# 输入数据
inputs = np.array([1, 2, 3])
# 权重和偏置
weights = [np.array([[0.2, 0.3, 0.4], [0.3, 0.4, 0.5]]), np.array([0.5, 0.6])]
biases = [np.array([0.1, 0.2]), np.array([0.3])]

# 前向传播计算
output = forward_propagation(inputs, weights, biases)
print("预测结果:", output)

代码中,定义了一个forward_propagation函数,该函数接收输入数据、权重和偏置作为参数,并通过矩阵乘法和激活函数进行前向传播计算。最终输出的output_layer即为MLP的预测结果。

1.4 反向传播算法

反向传播算法是用于训练MLP模型的关键步骤。通过计算梯度来调整权重和偏置,以最小化预测结果与真实结果之间的误差。在本文中,将使用反向传播算法来训练MLP模型并进行分类任务。

2.MLP分类任务应用

使用Python和NumPy库来实现MLP模型,并使用一个简单的数据集进行训练和测试。

import numpy as np

# MLP类
class MLP:
    def __init__(self, num_inputs, num_hidden, num_outputs):
        self.weights = [np.random.randn(num_inputs, num_hidden), np.random.randn(num_hidden, num_outputs)]
        self.biases = [np.zeros(num_hidden), np.zeros(num_outputs)]
    
    def forward_propagation(self, inputs):
        hidden_layer = sigmoid(np.dot(inputs, self.weights[0]) + self.biases[0])
        output_layer = sigmoid(np.dot(hidden_layer, self.weights[1]) + self.biases[1])
        return output_layer
    
    def train(self, inputs, targets, num_epochs, learning_rate):
        for epoch in range(num_epochs):
            # 前向传播
            output = self.forward_propagation(inputs)
            
            # 反向传播
            error = targets - output
            delta = error * output * (1 - output)
            hidden_error = np.dot(delta, self.weights[1].T)
            hidden_delta = hidden_error * hidden_layer * (1 - hidden_layer)
            
            # 权重和偏置更新
            self.weights[1] += learning_rate * np.dot(hidden_layer.T, delta)
            self.biases[1] += learning_rate * np.sum(delta, axis=0)
            self.weights[0] += learning_rate * np.dot(inputs.T, hidden_delta)
            self.biases[0] += learning_rate * np.sum(hidden_delta, axis=0)
    
    def predict(self, inputs):
        output = self.forward_propagation(inputs)
        return output

# Sigmoid激活函数
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

# 数据集
inputs = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
targets = np.array([[0], [1], [1], [0]])

# 创建MLP模型
mlp = MLP(num_inputs=2, num_hidden=4, num_outputs=1)

# 训练模型
mlp.train(inputs, targets, num_epochs=10000, learning_rate=0.1)

# 测试模型
test_inputs = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
predictions = mlp.predict(test_inputs)
print("预测结果:", predictions)

首先定义一个MLP类,其中包含MLP模型的初始化、前向传播、训练和预测方法。我使用一个简单的逻辑门数据集进行训练和测试,其中inputs表示输入数据,targets表示对应的目标结果。通过调用train方法进行训练,并通过调用predict方法进行预测。

3.参考文献:

  1. Bishop, C. M. (1995). Neural Networks for Pattern Recognition. Oxford University Press.
  2. Goodfellow, I., Bengio, Y., & Courville, A. (2016). Deep Learning. MIT Press.

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

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

相关文章

【Java算法题】剑指offer_算法之01搜索算法

前言 刷题链接: https://www.nowcoder.com/exam/oj/ta?page2&tpId13&type265 1. 搜索算法 JZ53 数字在升序数组中出现的次数 思路:遍历数组,count记录k值出现次数,返回count public class Solution {public int GetN…

【word wps文字】目录页码中的格式在打印或打印预览时变为和正文页码格式一样,如何调整?

一、问题背景 之前在闲鱼上,有个人找我改word排版,有一个需求就是正文页码两边需要横杠。 但是目录中显示的页码,不需要横杠。 我当时是一个一个在目录中删除横杠的,借助了查找与替换功能。 更改后,目录页码如下所…

Java与SpringBoot对redis的使用方式

目录 1.Java连接redis 1.1 使用Jedis1.2 使用连接池连接redis1.3 java连接redis集群模式 2.SpringBoot整合redis 2.1 StringRedisTemplate2.2 RedisTemplate 1.Java连接redis redis支持哪些语言可以操作 (去redis官网查询) 1.1 使用Jedis (1)添加jedis…

HTML+CSS实训——Day14——项目其他页面的完善

仓库地址&#xff1a;HTML实训 前言 今天我们继续用老师提供的api&#xff0c;完善一些剩余的功能&#xff0c;因为我的git push好像传乱了&#xff0c;所以仓库大家看看最新的就好&#xff0c;最新的一天一定包括前一天所做的内容。 Collect.htmlcss 收藏界面 <!DOCT…

Dijkstra迪杰斯特拉算法求最短路径(C++实现)

名人说&#xff1a;一花独放不是春&#xff0c;百花齐放花满园。——《增广贤文》 作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 〇、Dijkstra迪杰斯特拉算法介绍1、Dijkstra算法是什么&#xff1f;2、Dijkstra算法…

低代码工具:jvs-list(列表引擎)2.1.7功能清单及新增功能介绍

在低代码开发平台中&#xff0c;列表页是一个用于显示数据列表的页面。它通常用于展示数据库中的多条记录&#xff0c;并提供搜索、排序和筛选等功能&#xff0c;以方便用户对数据进行查找和浏览。 jvs-list是jvs快速开发平台的列表页的配置引擎&#xff0c;它和普通的crud 具…

Rocky Linux9.的系统中安装MySQL8 实战

前言 Centos7 已经停止维护&#xff0c;学习其他linux系统势在必行&#xff0c;今天我们要探讨的是&#xff1a; 在Rocky linux9的系统上安装MySQL8 文章目录 前言1. 从Appstream中进行安装1.1 更新系统中的所有软件包1.2 安装MySQL1.3 启动并测试1.4 查看MySQL版本 2. 初始化操…

获取地理位置请求免费天气接口

需求&#xff1a;根据地理位置信息去请求免费的天气接口数据&#xff0c;拿到数据后进行展示&#xff0c;这边我用到了俩个key&#xff0c;一个是高德天气的key和心知天气的key&#xff0c;为什么要这么麻烦呢&#xff0c;是因为之前写过一版不需要获取地理位置&#xff0c;直接…

嵌入式系统开发中的常见挑战和困难

当涉及嵌入式系统开发时&#xff0c;可能会遇到以下一些常见的挑战和困难&#xff1a; 复杂的硬件和软件集成&#xff1a;嵌入式系统通常涉及硬件和软件的紧密集成&#xff0c;需要同时理解和处理硬件和软件层面的问题。这种复杂性可能导致调试和故障排除变得更加困难。 有限…

【哈佛积极心理学笔记】第19讲 让爱情天长地久

第19讲 让爱情天长地久 What makes relationship thrive, some characteristic: work hard the fix mindset: “you are so smart, you are so intelligent” the malleable mindset: “you work so hard” Finding mindset: “finding the right partner” (fix) some thin…

PLC领域从业者的工作待遇现状如何?

目前从事可编程逻辑控制器&#xff08;PLC&#xff09;领域的人员在工作待遇方面相对较好。PLC是工业自动化中广泛使用的控制设备&#xff0c;用于监控和控制各种工业过程和机械设备。以下是关于从事PLC的人员工作待遇的一些常见情况和趋势&#xff1a; 薪资水平&#xff1a;P…

【算法与数据结构】242、LeetCode有效的字母异位词

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;题目要求判断两个字符串是否为字母异位词。什么是字母异位词呢&#xff1f;顾名思义&#xff0c;就是字…

深入理解相机硬件抽象层

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、概览二、Camera HIDL 接口三 、Camera Provider 主程序四、Camera HAL3 接口 一、概览 始于谷歌的Treble开源项目&#xff0c;基于接口与实现的分离…

【AUTOSAR】UDS协议的代码分析与解读(二)----ECU诊断协议概述

UDSO诊断服务技术规范 1 范围 本规范规定了增强型诊断需求的诊断服务部分的内容&#xff0c;定义了通用电子系统需遵循的UDS通用执行 规则。 本规范适用于集团x事业部所有平台车型&#xff0c;所有电子控 制单元(ECU) 的诊断需求&#xff0c;均需按此规范执行。 本规范定义的…

Python神经网络编程学习笔记

文章目录 神经网络基本原理线性分类器学习率一个线性分类器的局限性逻辑AND、逻辑OR逻辑XOR 神经元sigmoid function的logistic function(逻辑函数) 多层神经元演示只有两层&#xff0c;每层两个神经元的神经网络的工作矩阵大法(点乘)使用矩阵乘法的三层神经网络示例反向传播误…

AJAX概述

1.1什么是AJAX. Ajax即AsynchronousJavascript And XML&#xff1a;异步数据回调。 使用Ajax技术网页应用能够快速地将更新呈现在用户界面上&#xff0c;不需要重载&#xff08;刷新&#xff09;整个页面【只刷新局部】&#xff0c;这使得程序能够更快地回应用户的操作。、 1…

H5U PLC EtherCAT总线伺服回原(6098H=3)

回原方式35请参看下面文章 汇川H5U PLC通过 EtherCAT总线控制伺服回原_RXXW_Dor的博客-CSDN博客大部分运动控制都会对机械回原点进行大篇幅讲解,也可以看出机械回原点的重要性。常规的回原点方式大概有几十种吧,本文会给出常用回原点的注意事项,和编程推荐写法。如果原点回…

二层和三层交换机到底有啥区别?二者如何切换?

概要 计算机网络中的交换机是用于在局域网&#xff08;LAN&#xff09;中转发数据包的重要设备。其中&#xff0c;二层交换机和三层交换机是两种常见的交换机类型。本文将详细介绍二层交换机和三层交换机的特点、工作原理、各自的优缺点以及在思科、华为、瞻博网络三家厂商如何…

互联网架构师联合总结的 Java 面试攻略,GitHub 标星 30K!

2023 年的互联网行业竞争越来越严峻&#xff0c;面试也是越来越难&#xff0c;一直以来我都想整理一套完美的面试宝典&#xff0c;奈何难抽出时间&#xff0c;这套 1000道的 Java 面试手册是行业内各大神联合总结出来的&#xff0c;上传到 Git 上目前 star 数达到了 30K 这套互…

金九银十Java面试八股文汇总(2023最新整理)

前言 这才刚刚进入 6 月&#xff0c;我就看到了许多朋友在焦急的准备“金九银十”跳槽面试&#xff0c;甚至很多即将毕业的大学生都在备战秋招&#xff0c;对于学历还算优秀的大学生来说&#xff0c;这是一次离大厂最近的机会&#xff0c;毕竟是应届毕业生&#xff0c;不会对技…