MagViT2 - Pytorch
在Pytorch中实现《语言模型胜过扩散模型 - 分词器是视觉生成的关键》中的MagViT2。目前该模型在视频生成/理解方面保持着最先进的水平。
论文中提出的无查找量化器可以在单独的仓库中找到。它可能应该被用于探索所有其他模态,从音频开始。
致谢
-
感谢StabilityAI和🤗 Huggingface的慷慨赞助,以及我的其他赞助商,让我能够独立地开源人工智能。
-
感谢Louis Serrano分享了一些早期的初步运行结果,验证了整体架构在有限标量量化下的收敛性。
-
你?如果你是一位才华横溢的研究工程师/科学家,欢迎为前沿开源科学做出贡献!
安装
$ pip install magvit2-pytorch
使用方法
from magvit2_pytorch import (
VideoTokenizer,
VideoTokenizerTrainer
)
tokenizer = VideoTokenizer(
image_size = 128,
init_dim = 64,
max_dim = 512,
codebook_size = 1024,
layers = (
'residual',
'compress_space',
('consecutive_residual', 2),
'compress_space',
('consecutive_residual', 2),
'linear_attend_space',
'compress_space',
('consecutive_residual', 2),
'attend_space',
'compress_time',
('consecutive_residual', 2),
'compress_time',
('consecutive_residual', 2),
'attend_time',
)
)
trainer = VideoTokenizerTrainer(
tokenizer,
dataset_folder = '/path/to/a/lot/of/media', # 视频或图像文件夹,取决于下面的设置
dataset_type = 'videos', # 'videos' 或 'images',先前的论文表明在图像上预训练对视频合成是有效的
batch_size = 4,
grad_accum_every = 8,
learning_rate = 2e-5,
num_train_steps = 1_000_000
)
trainer.train()
# 经过大量训练后...
# 可以使用分词器的指数移动平均(EMA)版本
ema_tokenizer = trainer.ema_tokenizer
# 模拟视频
video = torch.randn(1, 3, 17, 128, 128)
# 将视频标记为离散代码
codes = ema_tokenizer.tokenize(video) # (1, 9, 16, 16) <- 在这个例子中,时间维度下采样4倍,空间维度下采样8倍。展平token ID以进行(非)自回归训练
# 完整性检查
decoded_video = ema_tokenizer.decode_from_code_indices(codes)
assert torch.allclose(
decoded_video,
ema_tokenizer(video, return_recon = True)
)
要在Weights & Biases上跟踪你的实验,在VideoTokenizerTrainer
上设置use_wandb_tracking = True
,然后使用.trackers
上下文管理器
trainer = VideoTokenizerTrainer(
use_wandb_tracking = True,
...
)
使用trainer.trackers(project_name = 'magvit2', run_name = 'baseline'):
trainer.train()
待办事项
-
Magvit2 分词器
- 添加对抗性损失
- 在判别器中实现模糊池化以进行抗锯齿处理
- LFQ 应能传递损失明细(承诺和熵),并转发到分词器的返回值
- 使用残差可调制3D卷积为编码器解码器添加条件
-
decode_from_codebook_indices
应能接受展平的ID,重塑为正确的特征图尺寸并解码回视频 - 添加训练器并管理判别器训练
- 添加自适应rmsnorm和可条件化的transformer层
- 完全泛化到不同时间尺度的多个判别器(借鉴soundstream的多分辨率判别器)
- 完成多尺度判别器损失
- 自动管理多尺度判别器优化器
- 创建多分辨率时间判别器的辅助函数(随机选择连续帧)
- 添加注意力机制
- 对空间使用轴向旋转嵌入
- 在解码器的某个倒数第二层添加可选的自回归损失 - 查阅文献看是否有人在一个架构中统一了transformer解码器和分词器
-
改进RQ视频Transformer,因为残差LFQ现在更有意义
-
MaskGit
引用
[省略引用部分的翻译]