Pytorch搭建基于LSTM的Variational AutoEncoder(变分自编码器)

Pytorch搭建基于LSTM的Variational AutoEncoder(变分自编码器)

// An highlighted block
import torch
import torch.nn as nn
from sklearn.datasets import load_iris
import torch.nn.functional as F
data = load_iris()
y = data.target
x = data.data
class RNN(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.rnn_e = torch.nn.LSTM(input_size=4, hidden_size=64, num_layers=2, batch_first=True, bidirectional=True,
                                   dropout=0.1)
        self.mu = torch.nn.Linear(in_features=64, out_features=3)
        self.log_var = torch.nn.Linear(in_features=64, out_features=3)

        self.rnn_d = torch.nn.LSTM(input_size=3, hidden_size=64, num_layers=2, batch_first=True, bidirectional=True,
                                   dropout=0.1)
        self.out_put = torch.nn.Linear(in_features=64, out_features=4)

    def encoder(self, x):
        output, (h_n, c_n) = self.rnn_e(x)
        output_in_last_timestep = h_n[-1, :, :]
        mu = self.mu(output_in_last_timestep)
        log_var = self.log_var(output_in_last_timestep)
        return mu, log_var

    def reparameterize(self, mu, log_var):
        std = torch.exp(0.5 * log_var)
        eps = torch.rand_like(std)
        return mu + eps * std

    def decoder(self, z):
        output1, (h_n1, c_n1) = self.rnn_d(z.view(-1, 1, 3))
        output_in_last_timestep1 = h_n1[-1, :, :]
        out_put = self.out_put(output_in_last_timestep1)
        return out_put

    def forward(self, x):
        mu, log_var = self.encoder(x)
        z = self.reparameterize(mu, log_var)
        out_put = self.decoder(z)
        return out_put, mu, log_var

net = RNN()
optimizer = torch.optim.Adam(net.parameters(), lr=0.01)
x1 = torch.from_numpy(x).unsqueeze(0).float()
x2 = torch.from_numpy(x).unsqueeze(0).float()
loss_F = torch.nn.MSELoss()
for epoch in range(1000):
    pred, mu, log_var = net(x1.view(-1, 1, 4))
    reconstruction_loss = loss_F(pred, x2)
    print(" reconstruction_loss: ", reconstruction_loss)
    kl_div = - 0.5 * torch.sum(1 + log_var - mu.pow(2) - log_var.exp())
    print(" kl_div: ", kl_div)

    loss = reconstruction_loss + kl_div
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    print('Epoch: ', epoch, '| train loss: %.4f' % loss.data.numpy())
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LSTM AutoEncoder是一种神经网络结构,用于将输入序列进行编码和解码。根据引用\[1\]和\[2\]的描述,LSTM AutoEncoder的结构可以有多种版本。一种常见的结构是将编码器和解码器都构建为LSTM层和全连接层的组合。编码器通常由一个LSTM层和一个全连接层组成,而解码器则由一个全连接层和一个LSTM层组成。这种结构的目的是将输入序列压缩为一个低维表示,然后再通过解码器将其重构回原始序列。 另一种常见的结构是根据引用\[3\]中的描述,使用多个LSTM层和全连接层来构建编码器和解码器。编码器部分将输入序列逐步压缩为一个低维表示,然后解码器部分将该表示逐步重构回原始序列。 总之,LSTM AutoEncoder是一种用于序列数据的自编码器结构,可以将输入序列进行压缩和重构。具体的网络结构可以根据需求和实际情况进行设计和调整。 #### 引用[.reference_title] - *1* *2* [pytorch 实现 LSTM AutoEncoder 与案例](https://blog.csdn.net/weixin_35757704/article/details/118459850)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [用于Keras极端罕见事件分类的LSTM自动编码器](https://blog.csdn.net/weixin_41697507/article/details/90323592)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值