【AI模型学习】双流网络——更强大的网络设计

文章目录

    • [一 背景](#一 背景)
      • [1.1 背景](#1.1 背景)
      • [1.2 研究目标](#1.2 研究目标)
    • [二 模型](#二 模型)
      • [2.1 双流架构](#2.1 双流架构)
      • [2.2 光流](#2.2 光流)
    • [三 实验](#三 实验)
    • [四 思考](#四 思考)
      • [4.1 多流架构](#4.1 多流架构)
      • [4.2 fusion策略](#4.2 fusion策略)
      • [4.3 fusion的early与late](#4.3 fusion的early与late)

先简单聊了双流网络最初在视频中的起源,之后把重点放在 "多流结构"和"fusion" 上。


一 背景

1.1 背景

Two-Stream Convolutional Networks for Action Recognition in Videos

作者:Karen Simonyan & Andrew Zisserman(牛津 VGG)

在图像分类(ImageNet)中,CNN 已经大获成功,但视频是图像的"时序扩展",有两个新问题:

挑战 说明
时空建模难 视频不仅有空间信息(每一帧的画面),还有时间信息(帧之间的运动)
计算复杂 直接对 3D 视频卷积计算代价极高(3D CNN 很重)
表征不足 如果只用单帧静态图做分类,会忽略动作的动态过程

1.2 研究目标

论文的目标是:
在不使用 3D 卷积或循环网络的前提下,设计一个高效的 CNN 框架,能够同时提取视频的:

  • 空间外观特征(谁在做)
  • 时间运动特征(动作怎么做)

核心思想:双流架构

作者提出将视频信息分为两类独立学习:

模块 输入 目标
Spatial Stream RGB 静态图像 识别外观(场景、对象)
Temporal Stream 光流序列 捕捉动作的运动信息
  • 两个网络分别独立训练
  • 最后在 softmax 输出层融合(late fusion)

二 模型

2.1 双流架构

一、Spatial Stream 输入

输入内容:

  • 视频中单帧图像(RGB)
  • 每个动作样本会从视频中抽取若干帧(random sampling)
text 复制代码
Shape: (N, 3, 224, 224)
- N:batch size

二、Temporal Stream 输入

输入内容:

  • 多帧之间的光流图(Optical Flow)
  • 光流图反映的是像素在 x、y 方向上的位移量
  • 对每帧计算 optical flow,作者用 堆叠光流帧 来表达时间信息

作者默认使用 10 帧的光流,x 与 y 两个方向:

text 复制代码
10 帧 × 2 个方向(x, y)= 20 个通道

所以:

text 复制代码
Shape: (N, 20, 224, 224)

2.2 光流

光流(Optical Flow)是什么?

定义

光流是指:物体在运动时,图像上像素点的移动速度和方向,通常表现为连续两帧图像中每个像素点的位移。

  • 假设一个人从左走到右;
  • 我们拍了两张连续的视频帧(比如第 t 帧和第 t+1 帧);
  • 那么在这两帧之间,人身上的每个像素点都"移动"了一个位置;
  • 光流就是把这种位移 提取出来,形成一张"光流图";
    • x方向的速度图(水平移动)

    • y方向的速度图(垂直移动)

      (x方向位移图, y方向位移图)
      ⇒ 通道数 = 2

每个像素的 (x, y) 分量告诉你它的运动方向与幅度。

光流的计算方法

  • 论文中使用了 TV-L1 算法,这是经典的光流计算方法(速度和鲁棒性折中);
  • 实际实现通常使用 OpenCV 的 cv2.calcOpticalFlowFarneback() 或 DeepFlow、RAFT 等现代方法。

在 Two-Stream 网络中的光流处理流程

具体来看 Temporal Stream 的数据预处理流程:

输入阶段:从视频 → 光流堆叠张量

  1. 取连续 T 帧视频图像

    假设 T = 10

  2. 对每一对相邻帧计算光流

    会得到 T-1 张光流图,每张包含:

    • x方向:shape = (H, W)
    • y方向:shape = (H, W)
  3. 将 x 和 y 的结果堆叠起来

    得到 2 × (T-1) 通道的张量:

    text 复制代码
    Shape: (2 × (T-1), H, W) ≈ (20, 224, 224)

    视频帧序列: F1 F2 F3 ... F10
    ↓ ↓ ↓ ↓
    光流图计算: Flow1 Flow2 ... Flow9
    ↓ ↓ ↓
    通道堆叠: [dx1, dy1, dx2, dy2, ..., dx9, dy9] → (20, H, W)

文章还讨论了两种获取光流的方法:

左边的是"刻舟求剑"法,右边的是"追踪"法。

不过在论文的模型中,最后"刻舟求剑"反而更好,作者也无法解释。


三 实验

实验类型 方法 / 配置 数据集 Top-1 精度 (%) 备注说明
主实验 Spatial Stream (RGB 单帧) UCF-101 73.0 使用 ImageNet 预训练 CNN
Temporal Stream (光流序列) UCF-101 81.0 输入为 10 帧光流 (20 通道)
Two-Stream Fusion UCF-101 88.0 空间 + 时间流 softmax 输出平均融合
Spatial Stream HMDB-51 40.5 -
Temporal Stream HMDB-51 54.6 -
Two-Stream Fusion HMDB-51 59.4 -
主对比 Improved Dense Trajectories (IDT) UCF-101 85.9 手工特征方法
Improved Dense Trajectories (IDT) HMDB-51 57.2 -
消融实验 Temporal 流输入帧数 = 5 UCF-101 ~78.0 光流帧少,时序建模不足
Temporal 流输入帧数 = 10 UCF-101 81.0 默认使用配置
Temporal 流输入帧数 = 20 UCF-101 ~82.3 提升有限,开销更大
SVM Late Fusion UCF-101 ≈88.0 与 softmax 融合相当,复杂度高
Softmax Averaging Fusion UCF-101 88.0 简洁有效,推荐使用
  • 时间流 > 空间流:光流序列对于动作识别贡献更大;
  • 融合优于单流:融合后显著提升识别性能;
  • 堆叠帧数的 tradeoff:10 帧是精度与效率的较好平衡;
  • 融合策略:softmax 平均足够好,不必上复杂 SVM;
  • 对比 IDT:Two-Stream 模型在精度上成功超越传统特征。

四 思考

4.1 多流架构

"多流架构不是模型结构,而是一种视野和思维方式。"

它鼓励从任务本质中挖掘"不同视角",然后用网络结构显式表达它们。

"多流架构(Multi-Stream Architecture)"的通用思想 不仅适用于视频动作识别,在很多任务中都可以迁移这种结构设计思想

核心理念:不同模态/视角/尺度的信息,各自建模,再融合

视频理解(动作识别 / 视频问答)

  • Two-Stream → RGB + Optical Flow
  • SlowFast → 快帧流 + 慢帧流(建模短期 vs 长期动态)

NLP 多源信息融合

  • 多语言嵌入流(BERT + 翻译结果)
  • Query/Document 双流(Dense Retrieval)

生物信息学

  • 序列流(FASTA)+ 结构流(PDB)+ 图拓扑流(Graph)
  • 蛋白质中可以分别建模残基特征 vs 二级结构 vs 相互作用图谱

图像识别 / 细粒度分类

  • 原图流 + 注意力放大图流(如 Bilinear CNN)
  • 多尺度输入(如 FPN)

为什么有效?

机制 好处
解耦学习 每种信息流都可以专注于某种特征维度
表征增强 比单一路径更强,互补增强鲁棒性
易于融合 可以在特征级或决策级灵活组合
并行训练 多流结构天然适配分布式/并行计算

4.2 fusion策略

聊聊 Fusion 模型设计 ------多流网络的灵魂部分

特征级融合(Feature-Level Fusion)

将不同流提取的特征表示向量在隐空间中合并,生成一个更具表达力的 joint representation。

  1. 直接拼接(Concatenation)

    python 复制代码
    fused = torch.cat([f_seq, f_phys, f_struct], dim=-1)
    • 优点:操作简单,保留全部特征
    • 缺点:维度急剧升高,可能冗余或造成过拟合
  2. 加权求和(Fixed or Learnable Weights)

    python 复制代码
    fused = α*f_seq + β*f_phys + γ*f_struct
    • α, β, γ 可为超参数或可训练变量
    • 更轻量,也利于后续网络收敛
  3. 注意力融合(Attention Fusion)

    python 复制代码
    # 跨模态 attention 融合多个分支输出
    w_i = softmax(W_q · tanh(W_k f_i))   # 生成每个分支的 attention 权重
    fused = Σ w_i * f_i
    • 动态融合不同"模态"的重要性
    • 可以引入 transformer-style 多头注意力

二 加权融合(Weighted Fusion)

每条信息流不仅提取自己的特征,还由模型学习一个权重 来衡量其"重要性",用于加权组合。

  1. Gating Network

    python 复制代码
    gate = sigmoid(W · [f_seq, f_phys, f_struct])
    fused = gate ⊙ f_seq + (1 - gate) ⊙ f_phys
    • 类似于 GRU 的门控机制
    • 可以设计为 scalar 或 vector 权重(每个通道或维度)
  2. Modal Attention

    • 给不同"模态"分配注意力权重
    • 通常以 transformer 为骨干:
    python 复制代码
    query = f_seq  # 当前主导模态
    keys = [f_phys, f_struct]
    values = [f_phys, f_struct]
    attn = softmax(query · keyᵀ)
    fused = query + attn · values

决策级融合(Decision-Level Fusion)

每个子网络(分支)独立产生一个预测输出,然后在"输出阶段"融合多个决策。

  1. 平均法(Averaging)

    python 复制代码
    pred = (pred_seq + pred_phys + pred_struct) / 3
    • 简单稳定,适合 soft target 情况(如 sigmoid 输出)
  2. 投票法(Voting)

    • 用于 hard prediction(如 argmax 输出)
    • 多数投票法:
    python 复制代码
    vote = mode([argmax(p1), argmax(p2), argmax(p3)])
  3. Meta-classifier(堆叠融合)

    • 用一个新的 MLP 学习如何根据多个分支输出组合最终预测:
    python 复制代码
    meta_input = [pred1, pred2, pred3]
    meta_out = MLP(meta_input)

如何选择?

对比维度 特征级融合(Feature Fusion) 加权融合(Weighted Fusion) 决策级融合(Decision Fusion)
原理 拼接所有模态特征 学习每个模态的重要性再融合 每个模态独立输出结果,后期组合
输入要求 特征 shape 可以对齐 各流要能共享语义空间 各流可以完全异构
模型结构 单一模型结构接入多个特征 有 Attention / Gating 模块 每条流都是独立模型
表达能力 最高(信息选择+建模) 中(主要靠"投票"或 stack 学习)
实现复杂度 中高(需加权机制) 高(多模型集成 + output 决策)
性能表现 较好 较优 稳定,提升有限
适用场景 多个低维或结构相似的特征 多模态融合,特征异质性中等偏高 模态完全不同,或者训练时难以对齐

1. 特征级融合:最常用,适合"半模态差异"

复制代码
使用条件:
- 每条流提取的是中间向量(embedding、特征向量)
- 模态不完全不同(如:序列和理化、结构向量)
应用:
- 肽链序列嵌入 + PseAAC + PSSM → 拼接送入 MLP/CNN
- 图结构向量 + CNN 特征拼接 → 送入 Transformer

2. 加权融合:信息噪声多、流重要性差异大时用!

复制代码
使用条件:
- 某些模态"好坏不一",例如预测 contact map 有噪声
- 想"让模型自己决定"谁重要

应用:
- 序列流 vs 图结构流中自动识别信任度
- 多种生物特征拼接后加权(蛋白结构有时预测不准)

3. 决策级融合:结构完全不同 or 模型已训练好

复制代码
使用条件:
- 流之间完全异构,不能 early 或 mid fusion
- 模型已经训练好,后面想"ensemble 提升"

应用:
- CNN 模型 vs GNN 模型,投票融合
- 多个独立网络:序列预测 + 结构预测 + 文本(文献)预测,最终结果由"多数模型决定"

4.3 fusion的early与late

然后是early fusion 和 late fusion的对比和介绍:

定义与基本区别

类型 定义
Early Fusion 多个模态/特征在输入阶段或浅层特征即融合,模型整体作为一个网络处理
Late Fusion 各个模态/特征独立编码(不同网络或分支),在深层语义或输出阶段融合

对比:

对比点 Early Fusion Late Fusion
融合位置 输入前 or 第1~2层 特征层、中间层或决策层
表达能力 低~中 高(每模态单独学习)
实现难度 简单,维度统一即可 较复杂,需要设计多分支、统一维度
模态干扰风险 高(不同模态混合过早) 低(先独立再融合)
信息保留 容易丢失语义,需 careful tuning 每个模态语义表达充分
计算开销 通常更低 多个网络并行,计算量大
适用场景 模态差异小,如多组蛋白理化特征 模态差异大,如序列+结构+图

什么时候选 Early Fusion?

适合的场景:

  • 特征类型"同质":如全是理化性质数值(1D向量)
  • 特征维度相近 / 对齐:如 AC, AAC, CTD(拼成一条向量即可)
  • 要求轻量部署 / 计算资源受限(模型更小)
  • 对融合机制无特殊要求(拼接即可)

不适合:

  • 异构模态(如:结构图 + 序列)
  • 大模型(Transformer、GNN 等)应用中

什么时候选 Late Fusion?

适合的场景:

  • 模态差异大(比如生物信息里面的 序列 + PSSM + 图结构)
  • 每个模态都希望学习语义特征(独立网络)
  • 需要灵活控制信息流通(可加 attention)
  • 希望进行模态消融分析(每个分支可单独关闭)

进一步增强:

  • 可以使用 cross-attention 让模态间互动(如 ESM-IF)

相关推荐
乌旭28 分钟前
量子计算与GPU的异构加速:基于CUDA Quantum的混合编程实践
人工智能·pytorch·分布式·深度学习·ai·gpu算力·量子计算
deephub2 小时前
CLIMB自举框架:基于语义聚类的迭代数据混合优化及其在LLM预训练中的应用
人工智能·深度学习·大语言模型·聚类
豆沙沙包?2 小时前
5.学习笔记-SpringMVC(P61-P70)
数据库·笔记·学习
思通数科AI全行业智能NLP系统3 小时前
AI视频技术赋能幼儿园安全——教师离岗报警系统的智慧守护
大数据·人工智能·安全·目标检测·目标跟踪·自然语言处理·ocr
struggle20254 小时前
deepseek-cli开源的强大命令行界面,用于与 DeepSeek 的 AI 模型进行交互
人工智能·开源·自动化·交互·deepseek
每次的天空4 小时前
Android学习总结之Room篇
android·学习·oracle
ocr_sinosecu15 小时前
OCR定制识别:解锁文字识别的无限可能
人工智能·机器学习·ocr
fish_study_csdn5 小时前
pytest 技术总结
开发语言·python·pytest
奋斗者1号5 小时前
分类数据处理全解析:从独热编码到高维特征优化
人工智能·机器学习·分类
咖啡调调。5 小时前
使用Django框架表单
后端·python·django