赞
踩
目录
特征线性调制(Feature-wise Linear Modulation,FiLM)层是一种神经网络模块,它可以用来实现特征的条件调整。FiLM层的主要功能是对输入特征进行缩放(scaling)和偏移(shifting),并且这个缩放和偏移是可以学习的。
FiLM层的工作原理如下:给定一个输入特征x,FiLM层首先通过一个全连接层或其他形式的网络结构生成两个参数γ和β,然后对输入特征进行缩放和偏移,即y = γ * x + β。这里,γ和β是与输入特征x同样大小的向量,它们决定了对输入特征的缩放和偏移程度。
FiLM层的主要作用是实现特征的条件调整,使得模型可以根据特定的条件(例如来自其他模态的信息)来调整特征的表示。这种机制在许多任务中都很有用,例如在图像生成任务中,FiLM层可以用来根据文本描述来调整生成的图像特征;在视频理解任务中,FiLM层可以用来根据音频信息来调整视频特征。
总的来说,FiLM层是一种强大的特征调整工具,它可以帮助模型更好地利用条件信息,从而提高模型的性能。
- 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]
在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]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。