当前位置:AIGC资讯 > AIGC > 正文

AIGC笔记--特征线性调制(FiLM)层的实现

目录

1--特征线性调制层的作用

2--特征线性调制层的实现

3--论文实例

1--特征线性调制层的作用

        特征线性调制(Feature-wise Linear Modulation,FiLM)层是一种神经网络模块,它可以用来实现特征的条件调整。FiLM层的主要功能是对输入特征进行缩放(scaling)和偏移(shifting),并且这个缩放和偏移是可以学习的。

        FiLM层的工作原理如下:给定一个输入特征x,FiLM层首先通过一个全连接层或其他形式的网络结构生成两个参数γ和β,然后对输入特征进行缩放和偏移,即y = γ * x + β。这里,γ和β是与输入特征x同样大小的向量,它们决定了对输入特征的缩放和偏移程度。

        FiLM层的主要作用是实现特征的条件调整,使得模型可以根据特定的条件(例如来自其他模态的信息)来调整特征的表示。这种机制在许多任务中都很有用,例如在图像生成任务中,FiLM层可以用来根据文本描述来调整生成的图像特征;在视频理解任务中,FiLM层可以用来根据音频信息来调整视频特征。

        总的来说,FiLM层是一种强大的特征调整工具,它可以帮助模型更好地利用条件信息,从而提高模型的性能。

2--特征线性调制层的实现

import torch
import torch.nn as nn

class FiLM(nn.Module):
    def __init__(self, input_dim, condition_dim):
        super(FiLM, self).__init__()
        
        # 全连接层,用于生成γ和β参数
        self.fc_gamma = nn.Linear(condition_dim, input_dim)
        self.fc_beta = nn.Linear(condition_dim, input_dim)
        
    def forward(self, x, condition):
        # 根据条件特征获取缩放scale参数和移位参数shift,即计算γ和β参数
        gamma = self.fc_gamma(condition)
        beta = self.fc_beta(condition)
        
        # 对输入特征x进行缩放和偏移,实现条件特征调整输入特征
        y = gamma * x + beta 
        return y

if __name__ == "__main__":
    input_dim = 64 # 输入特征
    condition_dim = 128 # 条件特征

    # 创建一个FiLM层实例
    film_layer = FiLM(input_dim, condition_dim)

    # 初始化输入特征x和条件特征condition
    x = torch.randn(1, input_dim)
    condition = torch.randn(1, condition_dim)

    # 使用FiLM层对输入特征x进行条件调整
    y = film_layer(x, condition)

    print(y.shape) # [1, 64]

3--论文实例

在Audio2Photoreal中,利用音频特征来调整动作特征:

import torch
import torch.nn as nn
from einops import rearrange

class DenseFiLM(nn.Module):
    def __init__(self, embed_channels):
        super().__init__()
        self.embed_channels = embed_channels
        self.block = nn.Sequential(nn.Mish(), nn.Linear(embed_channels, embed_channels * 2)) # nn.Mish()激活函数

    def forward(self, position): # position [B dim]
        pos_encoding = self.block(position) # pos_encoding [B 2*dim]
        pos_encoding = rearrange(pos_encoding, "b c -> b 1 c") # [B 1 2*dim]
        scale_shift = pos_encoding.chunk(2, dim=-1) # two [B 1 dim]
        return scale_shift

def featurewise_affine(x, scale_shift):
    # 获取缩放因子和移位因子
    scale, shift = scale_shift # scale [B 1 dim] shift [B 1 dim]
    return (scale + 1) * x + shift # 调整特征

if __name__ == "__main__":
    B = 2
    Frame_Residual_depth = 20*4
    dim = 64
    input_x = torch.rand(B, Frame_Residual_depth, dim) # 运动特征
    condition_t = torch.rand(B, dim) # 音频条件特征

    film = DenseFiLM(dim)
    # 调用film(condition_t)获取缩放因子和移位因子
    output_x = input_x + featurewise_affine(input_x, film(condition_t)) # 通过

    print(output_x.shape) # [B, Frame_Residual_depth, dim]

更新时间 2024-05-29