前馈神经网络(Feedforward Neural Network,FNN)是最简单的人工神经网络形式,在这种网络中,信息仅在一方向传播,从输入层,经过隐藏层,最后到输出层,没有任何循环或跳跃,即无反馈机制(不像在循环神经网络RNN中那样)。
组成部分
- 输入层:接受输入数据
- 隐藏层:一个或多个,执行计算并转换输入信号
- 输出层:计算并输出预测或分类结果
- 权重和偏置:在输入和隐藏层、隐藏层之间、隐藏层与输出层之间对数据执行线性变换的参数
激活函数
- 用于引入非线性因素,使得神经网络能够学习、模拟更复杂的系数。常见激活函数包括ReLU、Sigmoid、Tanh等。
损失函数
- 用于计算预测值和真实值之间的差异。常见损失函数包括均方误差(MSE)、交叉熵损失等。
优化器
- 用于调整网络参数以最小化损失函数。常见的优化器包括随机梯度下降(SGD)、Adam等。
训练过程
- 包括前向传播、损失计算、反向传播和参数更新几个步骤。
下面是一个用PyTorch简单实现的前馈神经网络代码示例。输入层有2个节点,含一个隐藏层包含3个节点,输出层有1个节点。
import torch
import torch.nn as nn
import torch.optim as optim
# 定义一个简单的前馈神经网络
class SimpleFFNN(nn.Module):
def __init__(self):
super(SimpleFFNN, self).__init__()
# 定义第一个隐藏层
self.hidden1 = nn.Linear(2, 3)
# 定义输出层
self.output = nn.Linear(3, 1)
# 定义隐藏层的激活函数
self.activation = nn.ReLU()
def forward(self, x):
# 通过第一个隐藏层后激活
x = self.activation(self.hidden1(x))
# 输出层不需要激活函数,直接输出
x = self.output(x)
return x
# 初始化网络
net = SimpleFFNN()
# 定义损失函数为均方误差
criterion = nn.MSELoss()
# 定义优化器为SGD,学习率为0.01
optimizer = optim.SGD(net.parameters(), lr=0.01)
# 生成一些随机数据进行训练
# 假设我们的任务是从二维数据预测一个标量值
# 输入数据
inputs = torch.randn(100, 2)
# 目标数据,简单起见,我们这里随机生成
targets = torch.randn(100, 1)
# 训练网络
for epoch in range(100): # 运行100次训练循环
# 前向传播
outputs = net(inputs)
# 计算损失
loss = criterion(outputs, targets)
# 清除之前的梯度
optimizer.zero_grad()
# 反向传播
loss.backward()
# 更新参数
optimizer.step()
# 打印每个epoch的损失
print(f'Epoch [{epoch+1}/100], Loss: {loss.item()}')
这段代码定义了一个非常简单的前馈神经网络,其有一个含3个神经元的隐藏层,并使用ReLU作为激活函数。模型的训练数据是随机生成的,所以这个网络的实际应用价值不大,但足以作为一个示例来展示如何使用PyTorch开发前馈神经网络。