python - 什么是零膨胀层以及如何在 pytorch 上实现它?
问题描述
我正在构建一个变分自动编码器,用于单细胞 RNA-Seq 数据的降维。我设法用传统的自动编码器绘制了清晰的集群,但我的 VAE 无法正常工作。损失减少但在 5 左右停止。当我可视化潜在空间时,我只是得到一个分散的随机点,没有任何学习模式。
我相信问题是我没有实现 ZI 层。原因是我连它的目的都不明白,数学感觉很不直观。
VASC 是一种深度变分自动编码器,可以捕获非线性变化并自动学习输入数据的层次表示。其目的之一是简化 scRNA-seq 数据集的可视化。VASC 具有三个主要部分,称为:(1)编码器网络,(2)解码器网络和(3)零膨胀层。VASC 的发明者通过这里的论文进行了解释
ZI层背后的解释是什么?
如何在我的解码器组件之后实现它?
class VAE(nn.Module):
def __init__(self):
super(VAE, self).__init__()
self.n_components = 6
self.fc0 = nn.Dropout(p=0.5)
# For probabilistic encoder
self.fc1 = nn.Linear(13714, 128)
self.fc2 = nn.Linear(128, 32)
self.fc3 = nn.Linear(32, 16)
self.fc41 = nn.Linear(16, self.n_components)
self.fc42 = nn.Linear(16, self.n_components)
# For probabilistic decoder
self.fc5 = nn.Linear(self.n_components, 16)
self.fc6 = nn.Linear(16, 32)
self.fc7 = nn.Linear(32, 128)
self.fc8 = nn.Linear(128, 13714)
def encode(self, x):
h0 = self.fc0(x) #dropout
h1 = self.fc1(h0)
h2 = F.relu(self.fc2(h1))
h3 = F.relu(self.fc3(h2))
return self.fc41(h3), F.softplus(self.fc42(h3))
def reparameterize(self, mu, logvar):
std = torch.exp(0.5*logvar)
eps = torch.randn_like(std)
return mu + eps*std
def decode(self, z):
h5 = F.relu(self.fc5(z))
h6 = F.relu(self.fc6(h5))
h7 = F.relu(self.fc7(h6))
h8 = torch.sigmoid(self.fc8(h7)) #output layer
return h8
def forward(self, x):
mu, logvar = self.encode(x.view(-1, 13714))
z = self.reparameterize(mu, logvar)
return self.decode(z), mu, logvar
model = VAE().to(device)
optimizer = optim.RMSprop(model.parameters(), lr=0.001)
def loss_function(recon_x, x, mu, logvar):
BCE = F.binary_cross_entropy(recon_x, x.view(-1, 13714), reduction="mean")
KLD = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp())
return BCE + 0.1*KLD, BCE, KLD
log_interval = 32
for epoch in range(80):
#model.train()
running_loss = 0
for batch_idx, (data, _) in enumerate(train_loader):
data = data.to(device)
optimizer.zero_grad()
recon_batch, mu, logvar = model(data.float())
loss, bce, kld = loss_function(recon_batch, data.float(), mu, logvar)
loss.backward()
running_loss += loss.item()
optimizer.step()
if batch_idx % log_interval == 0:
print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}\tBCE: {:.6f}\tKLD: {:.6f}'.format(
epoch, batch_idx * len(data), len(train_loader.dataset),
100. * batch_idx / len(train_loader),
loss.item(), bce.item(), kld.item()))
print('====> Epoch: {} Loss: {:.4f}'.format(
epoch, running_loss))
正如我所说,潜在空间不会学到任何东西。我认为问题在于缺少 ZI 层。如果没有,请您帮我找出问题所在,谢谢。
解决方案
推荐阅读
- r - ggplot2轴标签点未按指定显示
- excel - Selenium 类型库找不到文件 driver.start "chrome","https://www.google.com"
- sql-server - SqlBulkCopy WriteToServer 期间出错 - 消息(“ALLOW_ENCRYPTED_VALUE_MODIFICATIONS”附近的语法不正确。))
- typescript - 如何通过提供不同的类型来覆盖静态方法
- reactjs - FireEvent.click TypeError:无法读取未定义的属性“单击”
- octave - 为 distmesh 制作 .oct 文件
- xamarin - 为什么 NewtonSoft.Json 在从 DateTime 对象转换时添加 +8
- python - 如何为 Tesseract 预处理此图像?
- python - 分配前引用的 /products/search/ 局部变量“查询”处的 UnboundLocalError
- wordpress - Wordpress 菜单仅向登录用户显示更改的项目