【深度学习基础模型】前馈神经网络(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() # 四舍五入得到0或1的预测值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),我们可以轻松实现这些模型并解决实际问题。