目录
????????特征线性调制(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]