深度学习的基础_多层感知机的手动实现

多层感知机(Multilayer Perceptron,简称MLP)是一种前馈人工神经网络。它包含至少三层节点:一个输入层、一个或多个隐藏层以及一个输出层。除输入节点外,每个节点都是一个带有非线性激活函数的神经元(或称为处理单元)。MLP利用一种称为反向传播的监督学习技术进行训练,通常与梯度下降算法结合使用。

一:多层感知机的介绍

组成部分:

  1. 输入层:接收输入数据。
  2. 隐藏层:由多个神经元组成,每个神经元与上一层的每个神经元相连。
  3. 输出层:产生网络的最终输出。

工作原理:

  1. 前向传播:数据从输入层开始,通过隐藏层,最终到达输出层。在每一层,数据都会通过加权求和后应用一个激活函数。
  2. 激活函数:常用的激活函数包括Sigmoid、tanh、ReLU等,它们为网络引入非线性,使得网络能够学习复杂的模式。
  3. 损失函数:用于评估模型的预测与实际值之间的差异,常见的损失函数包括均方误差(MSE)和交叉熵损失。
  4. 反向传播:根据损失函数计算梯度,然后通过网络反向传播这些梯度,以更新权重和偏置。

例如一个激活函数如下:

6b6b22f63baf481e941cbf3bcd26f96e.png

训练过程:

  1. 初始化:随机初始化网络权重和偏置。
  2. 迭代:通过多次迭代训练数据集,每次迭代都包括前向传播和反向传播。
  3. 优化:使用梯度下降或其他优化算法调整权重和偏置,以最小化损失函数。

应用领域:

  • 图像识别
  • 语音识别
  • 自然语言处理
  • 推荐系统
  • 游戏和模拟

多层感知机是深度学习的基础之一,也是许多复杂神经网络架构的构建块。随着深度学习的发展,MLP的概念被扩展到了更深的网络结构,如卷积神经网络(CNN)和循环神经网络(RNN)。

二:手动实现多层感知机

接下来将展示一个简单多层感知机模型的基本框架,演示了如何手动实现一个神经网络的前向传播和反向传播过程。这个例子中,我们将构建一个具有一个隐藏层的MLP,用于二分类问题。

请注意,这个例子是非常基础的,并没有涉及到诸如权重初始化策略、激活函数的选择、正则化、批处理、学习率衰减等许多实际应用中重要的概念。在实际应用中,通常会使用更高级的库,如TensorFlowPyTorch,它们提供了更高效、更灵活的方式来构建和训练神经网络。

导入模块

import numpy as np

这里我们导入了numpy库,它是一个强大的Python库,用于进行数值计算。在神经网络中,我们经常使用numpy来处理矩阵运算。

Step1:激活函数和它的导数

# 激活函数
def sigmoid(x):return 1 / (1 + np.exp(-x))# 激活函数的导数
def sigmoid_derivative(x):return x * (1 - x)

sigmoid函数是一个常用的激活函数,它将任何实数值映射到(0, 1)区间内。它的导数sigmoid_derivative用于在反向传播过程中计算梯度。

Step2:多层感知机类

class MultiLayerPerceptron:

这里定义了一个名为MultiLayerPerceptron的类,它表示我们的多层感知机模型。

初始化方法

def __init__(self, input_size, hidden_size, output_size):# 初始化权重和偏置self.weights_input_to_hidden = np.random.uniform(size=(input_size, hidden_size))self.bias_hidden = np.random.uniform(size=(1, hidden_size))self.weights_hidden_to_output = np.random.uniform(size=(hidden_size, output_size))self.bias_output = np.random.uniform(size=(1, output_size))

初始化方法__init__设置了多层感知机的结构。我们定义了输入层到隐藏层和隐藏层到输出层的权重以及隐藏层和输出层的偏置。这些权重和偏置被初始化为均匀分布的随机值。

前向传播方法

def forward(self, X):# 输入层到隐藏层的正向传播self.hidden_input = np.dot(X, self.weights_input_to_hidden) + self.bias_hiddenself.hidden_output = sigmoid(self.hidden_input)# 隐藏层到输出层的正向传播self.final_input = np.dot(self.hidden_output, self.weights_hidden_to_output) + self.bias_outputself.final_output = sigmoid(self.final_input)return self.final_output

forward方法实现了前向传播,即数据从输入层流向隐藏层,再从隐藏层流向输出层。我们计算了隐藏层和输出层的输入和输出,并使用sigmoid激活函数。

反向传播方法

 def backward(self, X, y, output):# 输出层到隐藏层的反向传播output_error = y - outputoutput_delta = output_error * sigmoid_derivative(output)# 隐藏层到输入层的反向传播hidden_error = output_delta.dot(self.weights_hidden_to_output.T)hidden_delta = hidden_error * sigmoid_derivative(self.hidden_output)# 更新权重和偏置self.weights_hidden_to_output += self.hidden_output.T.dot(output_delta)self.bias_output += np.sum(output_delta, axis=0, keepdims=True)self.weights_input_to_hidden += X.T.dot(hidden_delta)self.bias_hidden += np.sum(hidden_delta, axis=0, keepdims=True)

backward方法实现了反向传播,即计算损失函数关于每个权重的梯度,并更新权重和偏置。首先计算输出层的误差和梯度,然后计算隐藏层的误差和梯度,最后更新权重和偏置。

训练方法

  def train(self, X, y, epochs=1000, learning_rate=0.01):for epoch in range(epochs):output = self.forward(X)self.backward(X, y, output)# 打印训练进度if epoch % 100 == 0:loss = np.mean(np.square(y - output))print(f"Epoch {epoch}, Loss: {loss}")

这样就得到了一个名为MultiLayerPerceptron的表示我们的多层感知机模型的类。

Step3:训练模型

train方法用于训练多层感知机模型。它接受输入数据X和目标数据y,并重复执行前向传播和反向传播过程epochs次。每100个epoch,它会打印当前的损失,以便观察训练进度。

# 示例数据
X = np.array([[0, 0],[0, 1],[1, 0],[1, 1]])# 理想输出
y = np.array([[0],[1],[1],[0]])# 创建多层感知机模型
mlp = MultiLayerPerceptron(input_size=2, hidden_size=3, output_size=1)# 训练模型
mlp.train(X, y)

最后,我们定义了输入数据X和目标数据y,它们分别对应于异或问题的输入和输出。我们创建了MultiLayerPerceptron的实例,并调用train方法来训练模型。

在这个例子中,我们定义了一个MultiLayerPerceptron类,它有初始化方法、前向传播方法、反向传播方法以及一个训练方法。我们使用了一个简单的二分类问题(异或问题)来训练我们的网络。

 

想要探索更多元化的数据分析视角,可以关注之前发布的相关内容。

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

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

相关文章

Word快速重复上一步操作的三种高效方法

在日常工作、学习和生活中,我们经常需要执行一系列重复性的操作。这些操作可能简单如复制粘贴、调整图片大小,也可能复杂如编辑文档、处理数据等。为了提高效率,掌握快速重复上一步操作的方法显得尤为重要。本文将介绍三种高效的方法&#xf…

给力!Python配置文件,这一篇就够了!

在开发过程中,我们常常会用到一些固定参数或者是常量。对于这些较为固定且常用到的部分,往往会将其写到一个固定文件中,避免在不同的模块代码中重复出现从而保持核心代码整洁。 这里插播一条粉丝福利,如果你在学习Python或者有计划…

【C题成品论文已出】24数学建模国赛C题成品论文(附参考代码)免费分享

24高教社杯数学建模国赛C题成品论文 一、问题一模型建立与求解 1.1模型建立 (1)决策变量设计 表示一个26158的矩阵,其中26是平旱地梯田和山坡地的总数,15是在这几类土地上可以种植的农作物数量,8则表示从2023到203…

KCP实现原理探析

KCP 是一个轻量级的、高效的、面向 UDP 的传输协议库,专为需要低延迟和高可靠性的实时应用设计。本文针对 KCP 的主要机制和实现与原理进行分析。 1. 术语 术语 全称 说明 TCP Transmission Control Protocol 传输控制协议 RTT Round Trip Time 往返时延 …

【鸿蒙HarmonyOS NEXT】调用后台接口及List组件渲染

【鸿蒙HarmonyOS NEXT】调用后台接口及List组件渲染 一、环境说明二、调用后台接口及List组件渲染三、总结 一、环境说明 DevEco Studio 版本: API版本:以12为主 二、调用后台接口及List组件渲染 后台接口及返回数据分析 JSON数据格式如下&#xf…

Git创建项目

方法一 1.在gitee中新建仓库demo01,并勾选开源许可证,完成后gitee上面的项目demo01里只包含一个LICENSE文件 2.直接在本地电脑中新建项目文件夹demo01,双击进入这个文件夹,右键Git bash here,输入 git clone https:…

跨域问题(CORS)

文章目录 介绍解决一、添加跨域头,允许跨域1.后端配置CORS策略(4种方法)2.配置nginx 二、代理 介绍 跨域资源共享(CORS, Cross-Origin Resource Sharing)是浏览器的一个安全机制,用来防止来自一个域的网页对另一个域下的资源进行…

Linux操作系统在虚拟机VM上的安装【CentOS版本】

目录 准备工作 "CPU虚拟化"的方法 VMware的安装 Linux镜像文件的下载 开始安装 声明 新建虚拟机 安装CentOS7.6 配置Linux(CentOS7.6)操作系统 配置分区【学习者可以直接点击自动配置分区,不过还是建议学习一下手动分区】 分区原则 添加分区 …

提示工程颠覆:DSPy 引领全新范式革命

几个月前,我清楚地记得,Prompt Engineering 还是热门话题。就业市场上充斥着提示工程师的岗位,仿佛这是未来的必备技能。 然而,现在情况已经大不相同了。提示工程并不是一门艺术或科学,更像是“聪明的汉斯”现象——人类为系统提供了必要的背景,以便系统能更好地作出回应…

Maven聚合与继承

聚合 当我们一次想要构建多个项目时,而不是到每一个模块的目录下分别执行mvn命令。这个时候就需要使用到maven的聚合特性 这里第一个特殊的地方是packaging,值设置为pom。我们正常开发的其他模块中都没有声明packaging,默认使用了默认值jar&a…

【Qt】仿照qq界面的设计

widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QDebug>//QT中信息调试类&#xff0c;用于输出数据&#xff0c;无需使用该类的实例化对象&#xff0c;直接使用成员函数即可 #include <QIcon>//图标类 #include <QPushButton&…

代码随想录——回文子串(Leetcode 647)

题目链接 我的题解&#xff08;双指针&#xff09; 思路&#xff1a; 当然&#xff0c;以下是对您提供的代码的解释&#xff1a; class Solution {public int countSubstrings(String s) {// 初始化回文子字符串的数量int count 0;// 遍历字符串的每个字符&#xff0c;使用…

综合评价 | 基于熵权-变异系数-博弈组合法的综合评价模型(Matlab)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 根据信息熵的定义&#xff0c;对于某项指标&#xff0c;可以用熵值来判断某个指标的离散程度&#xff0c;其信息熵值越小&#xff0c;指标的离散程度越大&#xff0c; 该指标对综合评价的影响&#xff08;即权重&…

基于鸿道Intewell操作系统的运动控制系统方案

随着工业控制行业的蓬勃发展&#xff0c;操作系统实时与非实时业务的深度融合应用需求日益增长&#xff0c;特别是在Windows或Linux平台上处理机器视觉等复杂场景时&#xff0c;传统实时操作系统&#xff08;RTOS&#xff09;面临显著挑战。这些挑战主要体现在两方面&#xff1…

欢迎体验 tuya open-sdk for arduino

我们很高兴地宣布 tuya open-sdk 1.0.0 发布&#xff0c;tuya open-sdk 包括&#xff1a;https://github.com/tuya/tuya-open-sdk-for-device 和 https://github.com/tuya/arduino-tuyaopen 等多个系列&#xff0c;1.1.0 版本正在紧张开发中&#xff0c;敬请期待&#xff01; …

视频监控系统布局策略:EasyCVR视频汇聚平台构建高效、全面的安全防线

随着科技的飞速发展&#xff0c;视频监控系统已成为现代社会安全防范的重要组成部分&#xff0c;广泛应用于公共场所、企业园区、住宅小区等各个领域。一个科学合理的视频监控系统布局与选型策略&#xff0c;不仅能够显著提升安全监控的效率和效果&#xff0c;还能在关键时刻提…

DNN学习平台(GoogleNet、SSD、FastRCNN、Yolov3)

DNN学习平台&#xff08;GoogleNet、SSD、FastRCNN、Yolov3&#xff09; 前言相关介绍1&#xff0c;登录界面&#xff1a;2&#xff0c;主界面&#xff1a;3&#xff0c;部分功能演示如下&#xff08;1&#xff09;识别网络图片&#xff08;2&#xff09;GoogleNet分类&#xf…

揭秘Vue 2生命周期:从创建到毁灭的全面指南

Vue.js作为当前最受欢迎的前端框架之一&#xff0c;其生命周期方法是每个Vue开发者必须掌握的核心内容。下面将详细解释Vue2中的每个生命周期钩子的作用、概念和应用场景&#xff0c;并提供代码演示来进一步阐明其工作原理。以下是关于vue2中的生命周期每个参数的作用、概念、应…

海外网络加速方案:解决海外访问难题

随着全球化的浪潮不断推进&#xff0c;越来越多的人和企业开始涉足海外市场&#xff0c;寻求更广阔的资源与机遇。然而&#xff0c;在海外访问过程中&#xff0c;网络速度慢、连接不稳定等问题频繁出现&#xff0c;不仅影响了个人网络体验&#xff0c;更对企业的日常运营和国际…

【学术会议征稿】2024年第十届机械制造技术与工程材料国际学术会议(ICMTEM 2024)

2024年第十届机械制造技术与工程材料国际学术会议&#xff08;ICMTEM 2024&#xff09; 2024 10th International Forum on Manufacturing Technology and Engineering Materials 第十届机械制造技术与工程材料国际学术会议&#xff08;ICMTEM 2024&#xff09;将于2024年10月…