DeepMind的BigGan模型的pytorch重新实现,并具有来自DeepMind的预训练的重量。
该存储库包含对DeepMind的Biggan的pytorch重新实现,该纸张由Andrew Brock,Jeff Donahue和Karen Simonyan发行了纸张大规模GAN训练,用于高保真自然图像合成。
Biggan的Pytorch实施是由DeepMind预处理的128x128、256x256和512x512模型提供的。我们还提供用于从Tensorflow Hub模型下载和转换这些模型的脚本。
此次重新实现是从TensorFlow版本的原始计算图完成的,并且与TensorFlow版本相似(1E-5的输出差的差异)类似。
目前,此实现仅包含发电机,因为歧视器的权重未发布(尽管鉴别器的结构与发电机非常相似,因此可以很容易地添加。请告诉我,如果您想对此进行PR,我很乐意为您提供帮助。)
该仓库在Python 3.6和Pytorch 1.0.1上进行了测试。
可以从PIP中安装Pytorch预估计的Biggan:
pip install pytorch-pretrained-biggan如果您只是想和gan一起玩,这应该足够了。
如果要使用转换脚本和Imagenet实用程序,则需要其他要求,特别是Tensorflow和NLTK。要安装所有要求,请使用full_requirements.txt文件:
git clone https://github.com/huggingface/pytorch-pretrained-BigGAN.git
cd pytorch-pretrained-BigGAN
pip install -r full_requirements.txt该存储库可直接且简单地访问128、256和512像素分辨率的Biggan预处理的“深”版本,如相关出版物中所述。以下是有关模型的一些细节:
BigGAN-deep-128 :5040万参数模型生成128x128像素图像,模型转储权重201 MB,BigGAN-deep-256 :一个559M参数模型生成256x256像素图像,模型转储权重224 MB,BigGAN-deep-512 :56.2m参数模型生成512x512像素图像,模型转储权重225 MB。有关体系结构的详细信息,请参阅本文的附录B。
所有模型均包含51个截断值在0到1之间的截断值的预先计算批准统计量(有关详细信息,请参见本文中的附录C.1)。
这是使用BigGAN和预训练模型的快速启动示例。
有关这些类和方法的详细信息,请参见下面的文档部分。
import torch
from pytorch_pretrained_biggan import ( BigGAN , one_hot_from_names , truncated_noise_sample ,
save_as_images , display_in_terminal )
# OPTIONAL: if you want to have more information on what's happening, activate the logger as follows
import logging
logging . basicConfig ( level = logging . INFO )
# Load pre-trained model tokenizer (vocabulary)
model = BigGAN . from_pretrained ( 'biggan-deep-256' )
# Prepare a input
truncation = 0.4
class_vector = one_hot_from_names ([ 'soap bubble' , 'coffee' , 'mushroom' ], batch_size = 3 )
noise_vector = truncated_noise_sample ( truncation = truncation , batch_size = 3 )
# All in tensors
noise_vector = torch . from_numpy ( noise_vector )
class_vector = torch . from_numpy ( class_vector )
# If you have a GPU, put everything on cuda
noise_vector = noise_vector . to ( 'cuda' )
class_vector = class_vector . to ( 'cuda' )
model . to ( 'cuda' )
# Generate an image
with torch . no_grad ():
output = model ( noise_vector , class_vector , truncation )
# If you have a GPU put back on CPU
output = output . to ( 'cpu' )
# If you have a sixtel compatible terminal you can display the images in the terminal
# (see https://github.com/saitoha/libsixel for details)
display_in_terminal ( output )
# Save results as png images
save_as_images ( output )


为了加载DeepMind的预训练模型之一,用from_pretrained()实例化了一个BigGAN模型:
model = BigGAN . from_pretrained ( PRE_TRAINED_MODEL_NAME_OR_PATH , cache_dir = None )在哪里
PRE_TRAINED_MODEL_NAME_OR_PATH是:
列表中选择的Google AI或OpenAI的预培训模型的快捷方式:
biggan-deep-128 :12层,768隐藏,12个头,110m参数biggan-deep-256 :24层,1024隐藏,16头,340m参数biggan-deep-512 :12层,768隐藏,12个头,110m参数通知模型存档的路径或URL,该模型包含:
config.json :模型的配置文件,pytorch_model.bin BigGAN预先训练的实例的pytorch转储(用通常的torch.save()保存)。如果PRE_TRAINED_MODEL_NAME_OR_PATH是一个快捷方式名称,则将从AWS S3下载预训练的权重(请参阅此处的链接)并存储在缓存文件夹中以避免将来下载(可以在~/.pytorch_pretrained_biggan/ )中找到CACHE文件夹。
cache_dir可以是通往特定目录的可选路径,以下载和缓存预训练的模型权重。
BigGANConfig是一个可以存储和加载Biggan配置的课程。它在config.py中定义。
以下是有关属性的一些细节:
output_dim :预训练模型的GAN(128、256或512)的输出分辨率,z_dim :噪声向量的大小(预训练模型为128)。class_embed_dim :嵌入向量的类的大小(预训练模型为128)。channel_width :每个通道的大小(预训练模型为128)。num_classes :训练数据集中的类数,例如Imagenet(预训练模型为1000)。layers :层定义列表。一层的每个定义是[层中的上样本的三重定义吗? (bool),输入通道的数量(INT),输出通道的数量(INT)]attention_layer_position :自发注意层在层层次结构中的位置(预训练模型为8)。eps :用于光谱和批处理标准化层的EPSILON值(预训练模型为1E-4)。n_stats :与0至1之间的各种截断值相关的批准层次层的预计统计量的数量(预训练模型为51)。BigGAN是model.py中定义的Biggan的Pytorch型号( torch.nn.Module )。该模型包括类嵌入(线性层)和带有一系列卷积和条件批准规范的生成器。由于未发布预训练的权重,因此目前尚未实施鉴别器。
输入和输出与TensorFlow模型输入和输出相同。
我们在这里详细介绍它们。
BigGAN作为输入:
z :the.floattensor的形状[batch_size,config.z_dim],从截断的正态分布中采样噪声,并且class_label :一个可选的torch.longtensor [batch_size,sequence_length],具有[0,1]中选择的令牌类型索引。类型0对应于sentence A和类型1对应于sentence B令牌(有关更多详细信息,请参见Bert Paper)。truncation :0(不包含)和1之间的浮子。用于创建噪声向量的截断正常的截断。此截断值用于在批次范围层的一组预计统计量(均值和方差)之间选择。 BigGAN输出形状数组[batch_size,3,分辨率,分辨率],其中分辨率为128、256或512,取决于模型的不同:
我们提供了一些使用该模型的实用方法。它们在utils.py中定义。
以下是有关这些方法的一些细节:
truncated_noise_sample(batch_size=1, dim_z=128, truncation=1., seed=None) :
创建截断的噪声向量。
convert_to_images(obj) :
在图像列表中,从Biggan转换输出张量。
save_as_images(obj, file_name='output') :
在保存的图像列表中,从Biggan转换并保存输出张量。
file_name_{image_number}.png display_in_terminal(obj) :
转换并显示端子中Biggan的输出张量。此功能使用libsixel ,只能在与libsixel兼容的终端中起作用。有关更多详细信息,请参考https://github.com/saitoha/libsixel。
file_name_{image_number}.png one_hot_from_int(int_or_list, batch_size=1) :
从类索引或类索引列表中创建一个单热矢量。
len(int_or_list) == batch_size one_hot_from_names(class_name, batch_size=1) :
创建一个单热矢量,从Imagenet类的名称(“网球”,“ Daisy”,...)创建。我们使用NLTK的WordNet搜索来尝试找到ImageNet的相关同步并采用第一个。如果我们找不到直接发现的,我们会查看班级名称的下调和高音。
在./scripts中提供了从TensorFlow Hub下载和转换TensorFlow模型的脚本。
这些脚本可直接用作:
./scripts/download_tf_hub_models.sh
./scripts/convert_tf_hub_models.sh