目录
前馈神经网络工作原理
1. 基本结构
前馈神经网络(Feed - Forward Neural Network,FFNN)是一种最基本的神经网络类型,信息从输入层单向传播到隐藏层,再到输出层,没有反馈连接。其主要由以下几个部分构成:
- 输入层(Input Layer):接收外界输入的数据。输入层神经元的数量通常等于输入数据的特征数量。例如,在图像分类任务中,如果输入的是一张
的灰度图像,那么输入层就有
个神经元。
- 隐藏层(Hidden Layer):可以有一个或多个隐藏层。隐藏层的神经元通过对输入数据进行非线性变换,提取数据中的特征和模式。每个隐藏层神经元接收上一层神经元的输出作为输入,经过加权求和和激活函数处理后,将结果传递给下一层。
- 输出层(Output Layer):输出神经网络的最终结果。输出层神经元的数量取决于具体的任务。例如,在二分类问题中,输出层通常有 1 个神经元;在多分类问题中,输出层神经元的数量等于类别数量。
2. 神经元的工作方式
每个神经元是一个基本的计算单元,其工作过程如下:
- 加权求和:假设一个神经元接收来自上一层
个神经元的输出
,对应的权重为
,还有一个偏置项
。那么该神经元的加权输入
为:
其中,
。
- 激活函数处理:加权输入
经过激活函数
处理后,得到该神经元的输出
:
激活函数的作用是引入非线性因素,使得神经网络能够学习复杂的非线性关系。常见的激活函数有 Sigmoid 函数、ReLU 函数等。
3. 前向传播过程
前馈神经网络的前向传播过程就是信息从输入层依次经过隐藏层,最终到达输出层的过程。具体步骤如下:
- 输入层:将输入数据
输入到输入层,输入层神经元直接将数据传递给下一层。
- 隐藏层:对于第
层隐藏层
为隐藏层的数量),该层每个神经元进行加权求和和激活函数处理。假设第
层有
个神经元,上一层(第
层)的输出为
,权重矩阵为
,偏置向量为
,则该层的加权输入
和输出
分别为:
其中是激活函数,通常对向量的每个元素分别应用激活函数。
- 输出层:输出层的计算方式与隐藏层类似,最终得到输出
,这个输出就是神经网络的预测结果。
4. 损失函数与训练
为了评估神经网络的预测结果与真实标签之间的差异,需要定义一个损失函数(Loss Function)。常见的损失函数有均方误差(MSE,用于回归问题)、交叉熵损失(Cross - Entropy Loss,用于分类问题)等。
神经网络的训练过程就是通过调整权重和偏置,使得损失函数的值最小化。常用的训练方法是反向传播算法(Backpropagation),它通过计算损失函数对每个权重和偏置的梯度,然后使用梯度下降等优化算法更新权重和偏置。
场景示例
1. 手写数字识别
- 问题描述:给定一张手写数字的图像,识别出图像中的数字是 0 - 9 中的哪一个。
- 网络结构:
- 输入层:由于输入的是
的灰度图像,输入层有 784 个神经元。
- 隐藏层:可以设置一个或多个隐藏层,例如设置一个包含 128 个神经元的隐藏层,激活函数使用 ReLU 函数。
- 输出层:因为是 10 分类问题,输出层有 10 个神经元,使用 Softmax 函数将输出转换为概率分布。
- 输入层:由于输入的是
- 训练与预测:使用大量的手写数字图像及其对应的标签进行训练,通过反向传播算法不断调整权重和偏置。训练完成后,对于新的手写数字图像,通过前向传播得到输出层的概率分布,选择概率最大的类别作为预测结果。
2. 房价预测
- 问题描述:根据房屋的各种特征(如面积、卧室数量、地理位置等)预测房屋的价格。
- 网络结构:
- 输入层:输入层神经元的数量等于房屋特征的数量。
- 隐藏层:可以设置一个或多个隐藏层,例如设置两个包含 64 个神经元的隐藏层,激活函数使用 ReLU 函数。
- 输出层:由于是回归问题,输出层有 1 个神经元,不使用激活函数(或使用线性激活函数)。
- 训练与预测:使用大量的房屋特征数据及其对应的房价进行训练,损失函数使用均方误差。训练完成后,对于新的房屋特征数据,通过前向传播得到输出层的预测房价。
以下是一个使用 Python 和 Keras 实现简单前馈神经网络进行手写数字识别的代码示例:
import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten
# 加载手写数字数据集
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
# 数据预处理
train_images = train_images / 255.0
test_images = test_images / 255.0
# 构建前馈神经网络模型
model = Sequential([
Flatten(input_shape=(28, 28)), # 将 28x28 的图像展平为一维向量
Dense(128, activation='relu'), # 隐藏层,128 个神经元,使用 ReLU 激活函数
Dense(10, activation='softmax') # 输出层,10 个神经元,使用 Softmax 激活函数
])
# 编译模型
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 训练模型
model.fit(train_images, train_labels, epochs=5)
# 评估模型
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(f"测试集准确率: {test_acc}")
在这个代码示例中,我们构建了一个简单的前馈神经网络,包括一个输入层、一个隐藏层和一个输出层,通过前向传播进行预测,使用反向传播算法进行训练。