【深度学习基础模型】前馈神经网络(Feed Forward Neural Networks, FFNN)详细理解并附实现代码。

【深度学习基础模型】前馈神经网络(Feed Forward Neural Networks, FFNN)

【深度学习基础模型】前馈神经网络(Feed Forward Neural Networks, FFNN)


文章目录

  • 【深度学习基础模型】前馈神经网络(Feed Forward Neural Networks, FFNN)
  • 1.算法原理介绍
    • 1.1 前馈神经网络(Feed Forward Neural Networks, FFNN)
    • 1.2 感知器(Perceptron)
    • 1.3 监督学习与反向传播
  • 2.FFNN和感知器的应用
    • 2.1逻辑门的建模
    • 2.2分类问题
    • 2.3回归问题
  • 3.Python实现FFNN的应用实例
    • 3.1感知器实现AND逻辑门
    • 3.2前馈神经网络实现分类任务(MNIST手写数字识别)
  • 4.总结


参考地址:https://www.asimovinstitute.org/neural-network-zoo/
论文地址:https://www.ling.upenn.edu/courses/cogs501/Rosenblatt1958.pdf

1.算法原理介绍

1.1 前馈神经网络(Feed Forward Neural Networks, FFNN)

前馈神经网络是最基本的神经网络结构之一,其主要特征是信息从输入层经过若干个隐藏层,最终传递到输出层,每一层中的神经元仅与相邻层的神经元相连,信息不会反馈。FFNN的结构简单但功能强大,特别适合进行回归和分类任务。

工作原理:

  • 层次结构:前馈神经网络一般包括三类层次:
    (1)输入层:接收输入数据。
    (2)隐藏层:通过神经元和权重处理输入。
    (3)输出层:输出最终的预测结果。
  • 全连接:两层之间是全连接的,每个神经元与上一层的每个神经元相连。
  • 激活函数:在隐藏层中使用非线性激活函数(如ReLU、Sigmoid)来增加模型的非线性表示能力
  • 输出:输出层的神经元生成网络的最终结果,通常是分类标签或回归值。

训练方式:

  • FFNN使用反向传播算法(Backpropagation)进行训练,具体步骤为:
    (1)前向传播:根据当前权重和输入计算输出。
    (2)计算误差:计算网络预测值与真实标签之间的误差,常用损失函数如均方误差(MSE)。
    (3)反向传播:通过链式法则计算每个权重对误差的梯度。
    (4)更新权重:利用梯度下降等优化算法更新权重。

1.2 感知器(Perceptron)

感知器是最简单的神经网络单元,也是神经网络的基本构件。单层感知器仅包含输入层和输出层,它将输入值经过加权和后,通过激活函数输出二元分类结果。感知器的主要限制在于它只能处理线性可分的数据。

感知器的工作流程:

  • 计算输入值的加权和。
  • 应用一个阈值(通常通过激活函数),决定输出是1还是0。

1.3 监督学习与反向传播

  • 监督学习:是神经网络训练的主要方式,网络根据标注好的训练数据集(即输入和对应的目标输出)进行学习。
  • 反向传播算法:一种常用的监督学习算法,通过最小化误差函数(如均方误差)来更新网络权重,使得输出尽量接近目标值。反向传播的核心是通过计算损失函数对每个权重的梯度,并通过梯度下降来更新权重

2.FFNN和感知器的应用

2.1逻辑门的建模

感知器可以用来模拟简单的逻辑门(如与门AND、或门OR等)。逻辑门是二元输入的简单函数,可以输出0或1。

2.2分类问题

前馈神经网络广泛用于分类任务,如手写数字识别(MNIST数据集)或图像分类。通过一系列隐藏层和激活函数,网络能够从输入数据中学习复杂的特征。

2.3回归问题

前馈神经网络还可以用于回归任务,通过输出一个连续值而非离散标签(例如预测房价或股票价格)。

3.Python实现FFNN的应用实例

下面的代码示例展示了如何使用Python和深度学习框架(如PyTorch)来实现一个简单的前馈神经网络来解决逻辑门(如AND门)的分类问题。

代码实现:

3.1感知器实现AND逻辑门

# 导入必要的库
import torch
import torch.nn as nn
import torch.optim as optim# 定义感知器模型
class Perceptron(nn.Module):def __init__(self):super(Perceptron, self).__init__()# 一个输入到输出的全连接层self.fc = nn.Linear(2, 1)  # 输入为2个特征,输出为1个结果def forward(self, x):return torch.sigmoid(self.fc(x))  # 使用sigmoid激活函数# AND门的训练数据
X = torch.Tensor([[0, 0], [0, 1], [1, 0], [1, 1]])  # 输入
Y = torch.Tensor([[0], [0], [0], [1]])  # 输出 (AND逻辑)# 创建感知器模型实例
model = Perceptron()# 定义损失函数和优化器
criterion = nn.BCELoss()  # 二元交叉熵损失函数
optimizer = optim.SGD(model.parameters(), lr=0.1)  # 随机梯度下降优化器# 训练模型
for epoch in range(1000):optimizer.zero_grad()  # 梯度清零outputs = model(X)  # 前向传播loss = criterion(outputs, Y)  # 计算损失loss.backward()  # 反向传播optimizer.step()  # 更新权重if (epoch+1) % 100 == 0:print(f'Epoch [{epoch+1}/1000], Loss: {loss.item():.4f}')# 测试模型
with torch.no_grad():test_input = torch.Tensor([[0, 0], [0, 1], [1, 0], [1, 1]])predicted = model(test_input).round()  # 四舍五入得到01的预测值print("Predicted output for AND gate: \n", predicted)

代码解释:

  • 1.定义感知器模型:
class Perceptron(nn.Module):def __init__(self):super(Perceptron, self).__init__()self.fc = nn.Linear(2, 1)  # 全连接层

定义了一个简单的感知器模型,输入为2个特征,输出为1个结果(模拟AND门的输出)。

  • 2.前向传播(forward函数):
def forward(self, x):return torch.sigmoid(self.fc(x))  # 使用Sigmoid激活函数

forward函数中,通过全连接层的输出并应用sigmoid激活函数来将输出限制在[0, 1]之间。

  • 3.定义训练数据:
X = torch.Tensor([[0, 0], [0, 1], [1, 0], [1, 1]])  # 输入
Y = torch.Tensor([[0], [0], [0], [1]])  # AND逻辑门的输出

这是AND逻辑门的输入和输出数据集。

  • 4.训练过程:
optimizer.zero_grad()  # 梯度清零
outputs = model(X)  # 前向传播
loss = criterion(outputs, Y)  # 计算损失
loss.backward()  # 反向传播
optimizer.step()  # 更新权重

每个训练周期,我们首先清除先前的梯度,然后通过网络进行前向传播计算输出,接着计算损失并进行反向传播来更新模型的权重。

  • 5.测试模型:
with torch.no_grad():test_input = torch.Tensor([[0, 0], [0, 1], [1, 0], [1, 1]])predicted = model(test_input).round()  # 预测结果print("Predicted output for AND gate: \n", predicted)

我们使用模型来预测AND逻辑门的结果,并将连续输出值四舍五入为0或1。

输出结果:

Predicted output for AND gate:tensor([[0.],[0.],[0.],[1.]])

模型成功学习了AND逻辑门的行为。

3.2前馈神经网络实现分类任务(MNIST手写数字识别)

对于更复杂的应用,如图像分类,可以使用更复杂的FFNN架构,包含多个隐藏层来处理更复杂的任务。下面是一个简单的MNIST手写数字识别任务的代码示例:

# 导入必要的库
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader# 加载MNIST数据集
transform = transforms.ToTensor()
train_data = datasets.MNIST(root='./data', train=True, transform=transform, download=True)
train_loader = DataLoader(train_data, batch_size=32, shuffle=True)# 定义前馈神经网络模型
class FFNN(nn.Module):def __init__(self):super(FFNN, self).__init__()self.fc1 = nn.Linear(28*28, 128)  # 输入层到隐藏层self.fc2 = nn.Linear(128, 64)     # 隐藏层到隐藏层self.fc3 = nn.Linear(64, 10)      # 隐藏层到输出层def forward(self, x):x = x.view(-1, 28*28)  # 将28x28的图像展平为1Dx = torch.relu(self.fc1(x))  # ReLU激活函数x = torch.relu(self.fc2(x))  # ReLU激活函数x = self.fc3(x)  # 最后一层没有激活函数return x# 实例化模型、损失函数和优化器
model = FFNN()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)# 训练模型
for epoch in range(5):for images, labels in train_loader:optimizer.zero_grad()output = model(images)loss = criterion(output, labels)loss.backward()optimizer.step()print(f'Epoch [{epoch+1}/5], Loss: {loss.item():.4f}')

4.总结

前馈神经网络(FFNN)和感知器是神经网络中最基本的组成部分,前馈结构简单,适合各种监督学习任务。通过使用Python和深度学习框架(如PyTorch),我们可以轻松实现这些模型并解决实际问题。

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

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

相关文章

耳夹式耳机哪个品牌好?热门品牌机型推荐

在移动互联网时代,耳机已然成为很多人生活里不可或缺的电子产品。不管是在上下班的途中,还是进行运动的时候,耳机都能为人们带来音乐的美妙享受,起到减轻压力的作用。 可是,长时间佩戴入耳式耳机存在一些弊端&#xf…

【无人机设计与控制】使用凸优化的无人机在存在威胁区域时的路径规划

摘要 本文提出了一种基于凸优化的无人机路径规划方法,旨在解决无人机在威胁区域中飞行的最优路径问题。该方法通过构建威胁区域的凸集表示,并结合凸优化算法,确保无人机能够在避开威胁区域的同时,沿着最优路径到达目标点。仿真结…

Ubuntu的源管理详解

Ubuntu的源管理详解 Ubuntu软件源是存储Ubuntu软件包的服务器,通过这些源,用户可以下载、安装或更新软件包。这篇文章将详细介绍Ubuntu如何查看、添加、修改和删除源,以及如何解决源相关的问题。 什么是软件源? Ubuntu软件源是…

无人机之编程基础原理

无人机编程基础原理涉及多个方面,主要包括无人机的基本原理、飞行控制算法、编程语言及算法应用等。以下是对这些方面的详细阐述: 一、无人机基本原理 无人机的基本原理是理解其结构、飞行原理、传感器和控制系统等的基础。无人机通常由机身、动力系统&…

中国山东著名国学大师起名专家颜廷利:人类的终极使命,超越地球的探索之旅

中国山东著名国学大师起名专家颜廷利:人类的终极使命,超越地球的探索之旅 人类的存在,不是为了留恋地球,而是为了离开地球…(升命学说) 安徽阜阳、海口、滁州、宜春、河南周口、新乡、茂名、宁夏.银川最好的专业取名…

【CSS in Depth 2 精译_032】5.4 Grid 网格布局的显式网格与隐式网格(上)

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一章 层叠、优先级与继承(已完结) 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位(已完结) 2.1 相对…

【PGCCC】 复合索引和部分索引,竟然能让查询速度提升 275 倍!

索引对于加速数据库查询和提高 PostgreSQL 应用程序的性能至关重要。但是,并非所有索引都以相同的方式发挥作用。复合索引和部分索引是两种常见类型,每种类型都有不同的用途和对性能的影响。本文我们将深入探讨复合索引和部分索引是什么、它们如何运作以…

BUG——IMX6ULL编译正点原子Linux内核报错

最初编译的是正点原子改过的Linux内核,可能是版本问题,一直报错,无法成功编译。然后换成NXP官方Linux内核6.6版本,初始编译虽然也报各种错,但都是缺少库或相关工具,全部安装后就可以成功编译出镜像了&#…

运营商二要素接口如何用PHP实现调用

一、什么是手机二要素? 运营商二要素又称手机二要素,运营商二要素核验,手机二要素核验,即传入姓名、手机号码,校验此两项是否一致。实时核验,返回校验结果! 二、手机二要素适用哪些场景&#…

【逐行注释】MATLAB的程序,对比EKF(扩展卡尔曼滤波)和PF(粒子滤波)的滤波效果,附下载链接

文章目录 总述部分源代码运行结果扩展性 总述 本代码使用 M A T L A B MATLAB MATLAB实现了扩展卡尔曼滤波( E K F EKF EKF)和粒子滤波( P F PF PF)在状态估计中的对比分析。 主要功能包括: 参数设置:初始…

【apt-file命令详解:Linux下的包管理利器】

文章目录 前言一、apt-file命令简介二、安装apt-file三、apt-file命令的基本用法四、高级技巧五、总结 🌈你好呀!我是 山顶风景独好 🎈欢迎踏入我的博客世界,能与您在此邂逅,真是缘分使然!😊 &a…

基于SSM的“银发在线教育云平台”的设计与实现(源码+数据库+文档)

基于SSM的“银发在线教育云平台”的设计与实现(源码数据库文档) 开发语言:Java 数据库:MySQL 技术:SSM 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 首页页面图 健身养生详情页面 在线课堂界面 …

Intellij IDEA 通过数据库表生成带注解的Java实体类(lombok版)

前言:因为今天在写实体类的时候,发现表中的字段太多,而且又要加注解怕写错漏写,现在市面上也有许多插件,但是有些达不到代码简洁,需要修改。后来还是选择了采用groovy写了一个脚本编写,本来idea…

gitlab使用小结

GitLab 是一个基于 Git 的代码托管平台,提供了丰富的功能来管理代码仓库、CI/CD、项目管理等。以下是一些常用的 GitLab 命令和示例,帮助你更好地使用 GitLab。 1、 克隆仓库 克隆一个远程仓库到本地: git clone gitgitlab.example.com:us…

深圳mes制造系统的主要功能

深圳MES系统的主要功能包括以下几个方面: 生产计划管理:MES系统可以帮助企业制定生产计划,包括订单管理、生产排程、生产任务分配等,实现生产资源的合理配置和生产计划的优化。 生产过程控制:MES系统可以监控生产过程中…

SpringBoot技术栈的网上超市开发实践

2 系统开发技术 这部分内容主要介绍本系统使用的技术,包括使用的工具,编程的语言等内容。 2.1 Java语言 Java语言自公元1995年至今,已经超过25年了,依然在软件开发上面有很大的市场占有率。当年Sun公司发明Java就是为了发展一门跨…

局域网远程命令重启电脑

只要知道远程服务器的管理员密码和IP地址,在局域网中的任意一台机器上打开“命令提示符”窗口,运行以下命令: 1、获取远程服务器的管理员权限 net use IP地址 "管理员密码" /user:administrator 2、使用shutdown命令远程重启服务器…

32中的外部中断

一、理解中断 关于32的中断 中断就是给cpu一个信号,cpu收到这个对应的信号再进行指挥 最常用的就是按键 key1按下是咩意思key2呢这样 中断信号线CPU要和对应的元器件连接 二、中断代码 代码编写 所有的0脚对应中断寄存器0,以此类推 引脚为n …

Unity :单例模式 + MonoBehaviour 是什么体验?

单例模式 与 MonoBehaviour的冲突点 单例模式 MonoBehaviour 保持单例的快速解决方案 就是自己创建一个空对象,然后把脚本挂在上去就行了,之后你就别自己挂载该脚本就行了 一般写法 public class AgentMoNo : MonoBehaviour {private static AgentM…

Python编码系列—Python观察者模式:实现事件驱动架构的利器

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…