当前位置:   article > 正文

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--特征线性调制层的实现

  1. import torch
  2. import torch.nn as nn
  3. class FiLM(nn.Module):
  4. def __init__(self, input_dim, condition_dim):
  5. super(FiLM, self).__init__()
  6. # 全连接层,用于生成γ和β参数
  7. self.fc_gamma = nn.Linear(condition_dim, input_dim)
  8. self.fc_beta = nn.Linear(condition_dim, input_dim)
  9. def forward(self, x, condition):
  10. # 根据条件特征获取缩放scale参数和移位参数shift,即计算γ和β参数
  11. gamma = self.fc_gamma(condition)
  12. beta = self.fc_beta(condition)
  13. # 对输入特征x进行缩放和偏移,实现条件特征调整输入特征
  14. y = gamma * x + beta
  15. return y
  16. if __name__ == "__main__":
  17. input_dim = 64 # 输入特征
  18. condition_dim = 128 # 条件特征
  19. # 创建一个FiLM层实例
  20. film_layer = FiLM(input_dim, condition_dim)
  21. # 初始化输入特征x和条件特征condition
  22. x = torch.randn(1, input_dim)
  23. condition = torch.randn(1, condition_dim)
  24. # 使用FiLM层对输入特征x进行条件调整
  25. y = film_layer(x, condition)
  26. print(y.shape) # [1, 64]

3--论文实例

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

  1. import torch
  2. import torch.nn as nn
  3. from einops import rearrange
  4. class DenseFiLM(nn.Module):
  5. def __init__(self, embed_channels):
  6. super().__init__()
  7. self.embed_channels = embed_channels
  8. self.block = nn.Sequential(nn.Mish(), nn.Linear(embed_channels, embed_channels * 2)) # nn.Mish()激活函数
  9. def forward(self, position): # position [B dim]
  10. pos_encoding = self.block(position) # pos_encoding [B 2*dim]
  11. pos_encoding = rearrange(pos_encoding, "b c -> b 1 c") # [B 1 2*dim]
  12. scale_shift = pos_encoding.chunk(2, dim=-1) # two [B 1 dim]
  13. return scale_shift
  14. def featurewise_affine(x, scale_shift):
  15. # 获取缩放因子和移位因子
  16. scale, shift = scale_shift # scale [B 1 dim] shift [B 1 dim]
  17. return (scale + 1) * x + shift # 调整特征
  18. if __name__ == "__main__":
  19. B = 2
  20. Frame_Residual_depth = 20*4
  21. dim = 64
  22. input_x = torch.rand(B, Frame_Residual_depth, dim) # 运动特征
  23. condition_t = torch.rand(B, dim) # 音频条件特征
  24. film = DenseFiLM(dim)
  25. # 调用film(condition_t)获取缩放因子和移位因子
  26. output_x = input_x + featurewise_affine(input_x, film(condition_t)) # 通过
  27. print(output_x.shape) # [B, Frame_Residual_depth, dim]

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/544125
推荐阅读
相关标签
  

闽ICP备14008679号