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

news2024/9/21 21:54:18

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

一:多层感知机的介绍

组成部分:

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

工作原理:

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

例如一个激活函数如下:

训练过程:

  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_hidden
        self.hidden_output = sigmoid(self.hidden_input)
        
        # 隐藏层到输出层的正向传播
        self.final_input = np.dot(self.hidden_output, self.weights_hidden_to_output) + self.bias_output
        self.final_output = sigmoid(self.final_input)
        
        return self.final_output

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

反向传播方法

 def backward(self, X, y, output):
        # 输出层到隐藏层的反向传播
        output_error = y - output
        output_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.coloradmin.cn/o/2091238.html

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

相关文章

c# net8调用vc写的dll

dll程序(vc,x86) 头文件 extern "C" int __declspec(dllexport) WINAPI add(int a, int b);实现 int WINAPI add(int a, int b) {return a b; }c#/net8 函数声明: [DllImport("dll/Dll1.dll", CallingConvention CallingCo…

redis的一些重要的基础知识

文章目录 1. rehash1.1 redis的hash表的数据结构 2. AOF日志2.1 简要介绍2.2 AOF重写 3. RDB快照3.1 执行过程3.2 存在问题解决方式 1. rehash 本文只介绍数据结构和结果图,如果要看文字描述过程,可以参考链接:rehash的详细过程 1.1 redis的…

最近 3 个 火火火火 的开源项目!

01 为你的敏感照片添加安全水印 EasyWatermark 是由开发者 rosuH 发起的一个开源项目,旨在帮助用户安全、轻松地为他们的照片添加水印。 这个工具不仅能够保护你的知识产权,还能在一定程度上防止照片被未经授权的人使用。EasyWatermark的核心功能包括&am…

WGCNA加权基因共表达网络一步法分析学习

WGCNA(Weighted Gene Co-expression Network Analysis,加权重基因共表达网络分析) WGCNA是一种用于分析基因表达数据的系统生物学方法。主要用于识别在基因表达数据中呈现共表达模式的基因模块,并将这些模块与样本特征&#xff0…

LSTM-Autoencoder深度学习模型在电动机异常检测中的应用

LSTM-Autoencoder深度学习模型在电动机异常检测中的应用 LSTM-Autoencoder Deep Learning Model for Anomaly Detection in Electric Motor Citation: Lachekhab, F.; Benzaoui, M.; Tadjer, S.A.; Bensmaine, A.; Hamma, H. LSTM-Autoencoder Deep Learning Model for Anoma…

Stable Diffusion绘画 | LightFlow工作流插件:一键导入,高效生图

LightFlow 是腾讯开源的工作流插件,通过它可以非常轻松地导入和导出工作流文件,从而快速地加载整个工作流。 下载后,放置在:SD安装目录\extensions,重载UI 即可使用,插件位置在生成图片区域下方&#xff1…

2024年8月31日CSDN自动提示的用法

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

视频结构化从入门到精通———检索比对类应用

检索比对类应用 1 认识“检索比对” 1.检索和比对的区别 检索和比对是信息处理和数据分析中常见的两种操作,虽然二者在一定程度上都有涉及到信息的提取和分析,但其侧重点和应用场景有所不同。检索主要关注从大规模数据集中定位相关信息,而比…

腾讯云TRTC无UI集成——分享屏幕主流、辅流(Vue2+JS+TRTC无UI集成)

先阐述一下问题,在项目中用到腾讯云的TRTC,A端发布A1、A2两个视频源,在B端订阅A1、A2使用两个view进行播放渲染 问题主流视频源和辅流视频源渲染在同一view上,控制台报错 // 播放远端视频 TRTCService.js; setRemoteVideo(view)…

智慧工地可视化整体解决方案(Word完整版)

第 一 章 系统总体设计 1.1 总体架构 1.1.1 系统拓扑 1.1.2 系统组成 1.2 设计概述 1.3 平台系统功能 1.3.1 总部数据看板 1.3.2 项目部数据看板 1.3.3 视频联网系统 1.3.4 实名制考勤系统 1.3.5 安全生产系统 1.3.6 塔吊安全监控子系统 1.3.7 施工升降机安全监控管系统 1.3.8 …

Codeforces Round 969 (Div. 2 ABCDE题) 视频讲解

A. Dora’s Set Problem Statement Dora has a set s s s containing integers. In the beginning, she will put all integers in [ l , r ] [l, r] [l,r] into the set s s s. That is, an integer x x x is initially contained in the set if and only if l ≤ x ≤…

Java程序天生就是多线程程序Java程序天生就是多线程程序吗?

一个Java程序从main()方法开始执行,然后按照既定的代码逻辑执行,看似没有其他线程参与,但实际上Java程序天生就是多线程程序,因为执行main()方法的是一个名称为main的线程。而一个Java程序的运行就算是没有用户自己开启的线程&…

AIGC提示词(2):塑造未来内容创作的核心力量

引言 🌟 在这个数字化的时代,人工智能生成内容(AIGC)正变得越来越普遍。从自动写作到图像生成,AI正以前所未有的速度和多样性创造内容。然而,要实现高质量和相关性强的内容生成,关键在于有效地…

Python变量类型

参考: Python 变量类型 | 菜鸟教程 (runoob.com) 变量赋值 Python 中的变量赋值不需要类型声明(重点注意这一点)。 每个变量在内存中创建,都包括变量的标识,名称和数据这些信息。 每个变量在使用前都必须赋值&#xff…

golang zap日志模块封装sentry

我们自己写个log日志包,把zap和sentry封装到一起。 下面直接贴上主要部分代码(两个模块初始化部分的代码请自行查阅官方文档): logger.go package logimport ("github.com/getsentry/sentry-go""go.uber.org/zap…

使用Redis如何实现集群会话同步?

使用Redis如何实现集群会话同步? 1、为什么选择Redis?2、如何实现?1. 环境准备2. 配置Web服务器3. 测试与验证4. 监控与优化 💖The Begin💖点点关注,收藏不迷路💖 在分布式Web应用中&#xff0c…

探索全能型AI与专业型AI的未来趋势

目录 前言1. 全能型AI与专业型AI的对比1.1 经济市场与用户吸引力1.2 精度与效果 2. AI模型的全面评估与比较2.1 精度2.2 速度2.3 鲁棒性 3. 专精化与可扩展性的权衡3.1 专精化的优势与挑战3.2 全能型AI的可扩展性 结语 前言 在人工智能领域,随着技术的迅猛发展&…

解决:pip install flash-attn安装失败案例【cuda】【torch】【flash-attn】

问题描述 在一个容器中部署项目环境中,遇到的flash-attn库总是安装失败,报错信息大致是:FileNotFoundError: [Errno 2] No such file or directory: :/usr/local/cuda/bin/nvcc,以及后来可能会提示’torch’未安装,却…

Android中服务(service)的基本用法

文章目录 Android中服务(service)的基本用法服务是什么定义一个服务启动和停止服务 Android中服务(service)的基本用法 服务是什么 服务(Service)是Android中实现程序后台运行的解决方案,它非…

智能停车场管理小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,车位信息管理,车位预订管理,系统管理 微信端账号功能包括:系统首页,地图,我的 开发系统:Windows 架构模式…