深层生成模型库
pixyz的Python项目详细描述
pixyz:用于开发深层生成模型的库
什么是pixyz?
pixyz是一个高级深层生成建模库,基于pytorch。它的开发重点是使各种深层生成模型易于实现。
最近,许多关于深层生成模型的论文被发表。然而,对于专家和实践者来说,它的再现成为一项艰巨的任务,因为最近的这些模型变得更加复杂,并且没有统一的工具来连接它们的数学公式和实现。我们图书馆的愿景是让专家和实践者都能通过实现这种复杂的深层生成模型,就像编写这些论文中提供的公式一样
我们的库支持以下深度生成模型。
- 显式模型(基于似然)
- 变分自动编码器(变分推理)
- 基于流的模型
- 自回归生成模型(注:尚未实现)
- 隐式模型
- 生成性对抗网络
此外,pixyz使您能够在同一个框架中实现这些不同的模型,并将它们结合在一起。NG>
pixyz的概述如下。下面将讨论每个api。
注意:由于此库正在开发中,因此可能存在一些错误。
安装
pixyz可以通过使用pip
$ pip install pixyz
如果从源代码安装,请执行以下命令。
$ git clone https://github.com/masa-su/pixyz.git
$ pip install -e pixyz
快速启动
在这里,我们考虑实现一个变分自动编码器(vae),它是最著名的深生成模型之一。vae由一个推理模型组成 生成模型 ,每一个都由dnn定义,这个损失函数(负elbo)如下。
imgsrc="https://warehouse-camo.cmh1.psfhosted.org/B18B593BCBEB2342B2342dA6D54D4885FEEEEEEEE88E278B/6874747470733A322222222F6C617465782E636F6465636F67732E636F6F6D26F676767662E6C66767662E6C66767662E6C667662E6C66767662E6C66767662E6C66767662E6C66767666C667666C66767676767662E6C66767666C66767676767662E6C66767666C66767666C66767676767677B5C74686574617D28787型c7a297d5c72696768745d2b445f7b4c7d5c6c566745b715f7b5c7068697d287a7c78297c7c705f7b7072696f727d287a295c72696768745d" />(1)
在pixyz中,深度生成模型通过以下三个步骤实现:
- 定义分发(分发api)
- 设置模型的损失函数(损失api)
- 培训模型(模型api) < > > <H3>1。定义分发(分发API)
首先,我们需要定义两个分布(
,
)和dnns。在pixyz中,可以像在pytorch中一样通过构建dnn模块来实现这一点。主要的区别在于,您应该继承pixyz.distributions.*
类(distribution api),而不是torch.nn.module
例如, (伯努利) 和 (正常)执行如下。
>>>frompixyz.distributionsimportBernoulli,Normal>>># inference model (encoder) q(z|x)>>>classInference(Normal):...def__init__(self):...super(Inference,self).__init__(cond_var=["x"],var=["z"],name="q")# var: variables of this distribution, cond_var: coditional variables....self.fc1=nn.Linear(784,512)...self.fc21=nn.Linear(512,64)...self.fc22=nn.Linear(512,64)......defforward(self,x):# the name of this argument should be same as cond_var....h=F.relu(self.fc1(x))...return{"loc":self.fc21(h),..."scale":F.softplus(self.fc22(h))}# return parameters of the normal distribution...>>># generative model (decoder) p(x|z) >>>classGenerator(Bernoulli):...def__init__(self):...super(Generator,self).__init__(cond_var=["z"],var=["x"],name="p")...self.fc1=nn.Linear(64,512)...self.fc2=nn.Linear(512,128)......defforward(self,z):# the name of this argument should be same as cond_var....h=F.relu(self.fc1(z))...return{"probs":F.sigmoid(self.fc2(h))}# return a parameter of the Bernoulli distribution
一旦定义,您就可以创建这些类的实例。
>>>p=Generator()>>>q=Inference()< VAE > 在生成模型之前,通常定义为标准正态分布,而不使用dnns。 这样的实例可以从
pixyz.distributions.*
创建为>>>prior=Normal(loc=torch.tensor(0.),scale=torch.tensor(1.),...var=["z"],features_shape=[64],name="p_prior")
如果你想t要了解每个实例定义了什么样的分布以及定义了什么模块(网络体系结构),只需print
them即可。
>>>print(p)Distribution:p(x|z)Networkarchitecture:Generator(name=p,distribution_name=Bernoulli,var=['x'],cond_var=['z'],input_var=['z'],features_shape=torch.Size([])(fc1):Linear(in_features=64,out_features=512,bias=True)(fc2):Linear(in_features=512,out_features=512,bias=True)(fc3):Linear(in_features=512,out_features=784,bias=True))
如果您使用的是ipython环境,则可以使用打印乳胶
以乳胶编译格式显示它们。
>>>samples_z=prior.sample(batch_n=1)>>>print(samples_z){'z':tensor([[0.6084,1.4716,0.6413,1.3184,-0.8930,0.0603,1.2254,0.5910,...,0.8389]])}>>>samples=p.sample(samples_z)>>>print(samples){'z':tensor([[1.5377,0.4713,0.0354,0.5013,1.2584,0.8908,0.6323,1.0844,...,-0.7603]]),'x':tensor([[0.,1.,0.,1.,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,...,0.]])}
在本例中,样本以字典形式表示,其中键对应于随机变量名,值是它们的实现值。
再者,共同分配的实例 可以通过分发实例的乘积创建
>>>p_joint=p*prior
此实例可以检查为
>>>print(p_joint)Distribution:p(x,z)=p(x|z)p_{prior}(z)Networkarchitecture:Normal(name=p_{prior},distribution_name=Normal,var=['z'],cond_var=[],input_var=[],features_shape=torch.Size([64])(loc):torch.Size([1,64])(scale):torch.Size([1,64]))Generator(name=p,distribution_name=Bernoulli,var=['x'],cond_var=['z'],input_var=['z'],features_shape=torch.Size([])(fc1):Linear(in_features=64,out_features=512,bias=True)(fc2):Linear(in_features=512,out_features=512,bias=True)(fc3):Linear(in_features=512,out_features=784,bias=True))
和 ,分别为。
更多信息
pixyz的这些框架允许实现更复杂的深层生成模型。 请参见示例代码和pixyzoo存储库。
有关更详细的用法,请查看pixyz文档。
如果在使用pixyz时遇到一些问题,请告诉我们。
致谢
此库基于新能源和工业技术开发组织(NEdo)委托的一个项目的结果。