共计 1576 个字符,预计需要花费 4 分钟才能阅读完成。
全连接前馈网络结构解析
全连接前馈网络(Fully Connected Feedforward Network)是最基础的神经网络结构之一。这种网络中,每一层的神经元与下一层的所有神经元都相互连接,信息单向从输入层流向输出层,没有反馈连接。

具体网络结构说明
我们来看一个具体的例子:
-
输入层 :10 个源节点,意味着网络可以处理 10 维的输入数据。
-
第一个隐层 :4 个神经元。每个神经元都会接收来自输入层所有 10 个节点的加权输入,经过激活函数处理后输出。
-
第二个隐层 :3 个神经元。同样地,每个神经元接收来自前一层 4 个神经元的全部输入。
-
输出层 :1 个神经元,用于输出最终结果。
结构图示
输入层 (10) → 隐层 1(4) → 隐层 2(3) → 输出层 (1)
这个网络中的每个连接都有对应的权重参数,训练过程就是调整这些权重以最小化损失函数。
卷积神经网络基础
卷积运算
卷积运算是 CNN 的核心操作,它通过卷积核(filter)在输入数据上滑动计算局部特征:
-
卷积核 :一个小的权重矩阵(如 3×3),在输入图像上滑动并计算点积。
-
步长(Stride):控制卷积核移动的步长。步长越大,输出特征图尺寸越小。
-
填充(Padding):在输入周围添加零值像素,可以控制输出尺寸。
特征图尺寸计算公式:
输出尺寸 = (输入尺寸 - 卷积核尺寸 + 2×填充)/ 步长 + 1
池化运算
池化用于降低特征图的空间尺寸,提高计算效率并增强特征不变性:
-
最大池化 :取窗口内的最大值,突出最显著特征。
-
平均池化 :计算窗口内的平均值,平滑特征。
代码实现
全连接网络实现(PyTorch)
import torch
import torch.nn as nn
class FCNetwork(nn.Module):
def __init__(self):
super(FCNetwork, self).__init__()
self.fc1 = nn.Linear(10, 4) # 输入层到第一隐层
self.fc2 = nn.Linear(4, 3) # 第一隐层到第二隐层
self.fc3 = nn.Linear(3, 1) # 第二隐层到输出层
self.relu = nn.ReLU()
def forward(self, x):
x = self.relu(self.fc1(x))
x = self.relu(self.fc2(x))
x = self.fc3(x)
return x
CNN 实现示例(TensorFlow)
import tensorflow as tf
model = tf.keras.Sequential([tf.keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(28,28,1)),
tf.keras.layers.MaxPooling2D((2,2)),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(10, activation='softmax')
])
避坑指南
-
维度不匹配 :确保各层输入输出维度正确对应,特别是全连接层之前需要 Flatten 操作。
-
激活函数选择 :隐层通常使用 ReLU,输出层根据任务选择(如分类用 softmax,回归用线性)。
-
参数初始化 :避免全零初始化,使用 Xavier 或 He 初始化方法。
-
学习率设置 :过大导致震荡,过小收敛慢,建议使用学习率调度器。
-
过拟合 :使用 Dropout 或正则化技术,监控验证集表现。
思考题
-
如何调整网络结构(如增加层数或神经元数量)来提升模型性能?可能带来什么影响?
-
在卷积神经网络中,使用更大的卷积核(如 5×5)与堆叠多个小卷积核(如两个 3×3)各有什么优缺点?
-
池化层是否总是必要的?在什么情况下可以考虑去掉池化层?
通过这篇文章,你应该已经掌握了全连接前馈网络和卷积神经网络的基本结构和实现方法。实践是学习神经网络的最佳方式,建议你动手实现这些网络并在不同数据集上测试它们的表现。
