[深度学习]FCN(MLP)输入层,隐藏层,输出层

171 阅读4分钟

在全连接深度神经网络中,只有隐藏层和输出层是全连接层,输入层不是全连接层。让我们清晰地澄清这个重要概念:

明确结论

  1. 输入层:❌ 不是全连接层(只是数据入口)
  2. 隐藏层:✅ 是全连接层(网络核心计算单元)
  3. 输出层:✅ 是全连接层(特殊配置的计算层)

详细解析

1. 输入层(Input Layer) - 非计算层

  • 本质:数据接口,不是真正的神经网络层
  • 无参数:没有权重(W)和偏置(b)
  • 无计算:不执行任何线性变换或激活
  • 作用:仅定义输入数据的形状(如784维的MNIST图像)
  • 代码体现
    # 在Keras/TensorFlow中:
    model.add(Input(shape=(784,)))  # 只是占位符,不是可训练层
    # 或通过第一个Dense层的input_shape指定:
    model.add(Dense(128, activation='relu', input_shape=(784,)))
    

2. 隐藏层(Hidden Layers) - 核心全连接层

  • 结构:标准的全连接层(Dense层)
  • 参数:包含可训练的权重矩阵W和偏置向量b
  • 计算:执行output = activation(W·input + b)
  • 深度来源:多个隐藏层堆叠形成"深度"
  • 代码体现
    model.add(Dense(256, activation='relu'))  # 全连接隐藏层
    model.add(Dense(128, activation='relu'))  # 另一个全连接隐藏层
    

3. 输出层(Output Layer) - 特殊全连接层

  • 结构:本质上仍然是全连接层
  • 参数:有完整的权重W和偏置b
  • 特殊性
    • 神经元数量=输出维度(如10分类任务有10个神经元)
    • 使用任务特定的激活函数(无激活/softmax/sigmoid)
  • 计算:执行output = activation(W·last_hidden_output + b)
  • 代码体现
    model.add(Dense(10, activation='softmax'))  # 全连接输出层
    

结构对比表

网络组件是否全连接层是否有参数是否执行计算在Keras中的实现
输入层❌ 否❌ 无❌ 无Input()input_shape
隐藏层✅ 是✅ 有✅ 有Dense(units, activation)
输出层✅ 是✅ 有✅ 有Dense(output_units, activation)

神经网络结构示意图

graph LR
A[输入数据] -->|784维向量| B[全连接隐藏层1]
B -->|128维| C[全连接隐藏层2]
C -->|64维| D[全连接输出层]
D -->|10维概率| E[预测结果]

classDef input fill:#f9f,stroke:#333;
classDef hidden fill:#9f9,stroke:#333;
classDef output fill:#f99,stroke:#333;

class A input;
class B,C hidden;
class D output;

📌 关键说明

  • 箭头表示数据流动方向
  • 只有隐藏层和输出层有可训练参数(W和b)
  • 输入层只是定义数据形状的接口

参数计算示例(MNIST手写数字识别)

假设网络结构:

  • 输入:784维(28×28像素)
  • 隐藏层1:128个神经元
  • 隐藏层2:64个神经元
  • 输出层:10个神经元(10分类)
参数计算参数数量
输入层无参数0
隐藏层1W: 784×128, b: 128100,352 + 128 = 100,480
隐藏层2W: 128×64, b: 648,192 + 64 = 8,256
输出层W: 64×10, b: 10640 + 10 = 650
总计109,386

💡 注意:输出层的650个参数证明它是真正的全连接层


常见误解澄清

  1. 误解:"输入层是全连接层的第一层"
    正解:输入层不是层,第一个全连接层是隐藏层(或直接是输出层)

  2. 误解:"输出层不是全连接层"
    正解:输出层有完整的W和b参数,执行W·h + b计算

  3. 误解:"输入-输出直连不算全连接网络"
    正解:即使单层网络(输入→输出)也是全连接网络(如逻辑回归)


代码验证

正确结构(输入→隐藏层→输出层):

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

model = Sequential([
    # 输入定义(非层) + 第一个全连接隐藏层
    Dense(128, activation='relu', input_shape=(784,)),
    
    # 第二个全连接隐藏层
    Dense(64, activation='relu'),
    
    # 全连接输出层
    Dense(10, activation='softmax')
])

model.summary()  # 查看参数分布

输出摘要

Layer (type)                 Output Shape              Param #   
=================================================================
dense (Dense)                (None, 128)               100,480    ← 第一个全连接层(隐藏层)
_________________________________________________________________
dense_1 (Dense)              (None, 64)                8,256     ← 第二个全连接层(隐藏层)
_________________________________________________________________
dense_2 (Dense)              (None, 10)                650       ← 全连接输出层
=================================================================
Total params: 109,386

✅ 输出明确显示:所有参数都在Dense层(全连接层),输入层无参数


总结

  • 输入层:数据入口(非计算层)
  • 隐藏层:核心全连接层(多个堆叠)
  • 输出层:最终全连接层(特殊配置)

在设计全连接深度神经网络时,实际构建的是:
输入数据 → [全连接隐藏层] × N → 全连接输出层
其中N≥1(当N=0时退化为单层感知机)