使用pytorch构建LSTM_AE模型的两种方式

本文详细介绍了如何使用PyTorch构建LSTM_Autoencoder(LSTM_AE)模型,包括两种方式:一是利用nn.LSTM组件搭建general LSTM Unit,二是自定义LSTM Unit,引入注意力机制并调整计算过程。文章通过图解和代码示例阐述了Encoder、Decoder的定义以及整个LSTM_AE模型的构建过程。
摘要由CSDN通过智能技术生成

目录

1.LSTM-Encoder-Decoder模型结构及简要解析

2.general LSTM Unit——使用pytorch nn.LSTM组件构建LSTM_AE

1.定义Encoder:

2.定义Decoder:

3.定义LSTM_AE:

3.自定义LSTM Unit——自定义LSTM_AE

1.定义Encoder/Decoedr:

2.自定义LSTM_AE:


1.LSTM-Encoder-Decoder模型结构及简要解析

Seq2seq小记- 知乎

图1  LSTM_AE模型示意图(借图)

LSTM_Encoder-Decoder结构包含一个Encoder和一个Decoder,输入以时间序列方式给出(图中左侧绿色节点),LSTM E你coder Unit对输入计算得到输出(图中左侧蓝色方块,需要注意示意图中是按照时序方向展开的结构,实际上其所有LSTM Unit都是同一个),得到编码结果(图中黄色节点);将编码结果当作Decoder的初始输入,计算得到Decoder第一个输出,将前一个Decoder单元的输出结果当作下一个单元的输入,依次进行计算得到结果...


进行下面的内容前需要一些注释:

general LSTM Unit是指【最原始版本的LSTM方式】在单元内进行计算的【LSTM单元】

自定义LSTM Unit是指【自定义LSTM Unit中需要的计算】得到的【LSTM单元】


2.general LSTM Unit——使用pytorch nn.LSTM组件构建LSTM_AE

首先给出general LSTM Unit中完成的计算:

图2  基本LSTM单元中进行的计算 

其思想简单易懂:定义【输入门,遗忘门,输出们】,根据【输入-输入门,上一个时间步的记忆状态c_t-1 - 遗忘门】得到当前时间步的记忆状态c_t;根据数据对【输出门-当前时间步的记忆状态c_t】得到当前时间步的输出h_t

如果基本LSTM单元就能满足需要,可以使用nn.Module中提供的组件LSTM搭建模型:

1.定义Encoder:

class lstm_encoder(nn.Module):
    def __init__(self,input_size,hidden_size,num_layers=1):
        '''
        param:
            input_size:the feature dim of input X
            hidden_size:the feature dim of hidden state h
            num_layers:the num of stacked lstm layers
        '''
        super(lstm_encoder,self).__init__()
        self.input_size=input_size
        self.hidden_size=hidden_size
        self.num_layers=num_layers
        self.lstm=nn.LSTM(input_size=input_size,hidden_size=hidden_size,num_layers=num_layers)

    def forward(self,x):
        '''
        param:
            x:input of lstm unit,(seq_len,batch,feature_dim)
        output:
            seq_out:give all the hidden state in the sequence
            last:the last h & c
        '''
        self.seq_out,self.last=self.lstm(x.view(x.shape[0],x.shape[1],self.
  • 6
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是一个基于PyTorch框架的RNN-LSTM模型的代码示例,用于实现MNIST手写数字分类: ```python import torch import torch.nn as nn import torch.optim as optim from torch.autograd import Variable from torchvision.datasets import MNIST from torchvision.transforms import ToTensor from torch.utils.data import DataLoader # 准备数据集 train_dataset = MNIST(root='./data', train=True, transform=ToTensor(), download=True) test_dataset = MNIST(root='./data', train=False, transform=ToTensor()) train_loader = DataLoader(train_dataset, batch_size=128, shuffle=True) test_loader = DataLoader(test_dataset, batch_size=128, shuffle=False) # 构建模型 class RNN(nn.Module): def __init__(self, input_size, hidden_size, num_layers, num_classes): super(RNN, self).__init__() self.hidden_size = hidden_size self.num_layers = num_layers self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True) self.fc = nn.Linear(hidden_size, num_classes) def forward(self, x): h0 = Variable(torch.zeros(self.num_layers, x.size(0), self.hidden_size)).cuda() c0 = Variable(torch.zeros(self.num_layers, x.size(0), self.hidden_size)).cuda() out, _ = self.lstm(x, (h0, c0)) out = self.fc(out[:, -1, :]) return out model = RNN(28, 128, 2, 10).cuda() # 定义损失函数和优化器 criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) # 训练模型 num_epochs = 10 for epoch in range(num_epochs): for i, (images, labels) in enumerate(train_loader): images = Variable(images.view(-1, 28, 28)).cuda() labels = Variable(labels).cuda() optimizer.zero_grad() outputs = model(images) loss = criterion(outputs, labels) loss.backward() optimizer.step() if (i+1) % 100 == 0: print('Epoch [%d/%d], Iter [%d/%d] Loss: %.4f' % (epoch+1, num_epochs, i+1, len(train_dataset)//128, loss.data[0])) # 评估模型 correct = 0 total = 0 for images, labels in test_loader: images = Variable(images.view(-1, 28, 28)).cuda() outputs = model(images) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted.cpu() == labels).sum() print('Accuracy of the model on the 10000 test images: %d %%' % (100 * correct / total)) ``` 该模型包含一个LSTM层和一个全连接层,其中LSTM层的输入形状为(28,28),表示每个手写数字图像的像素为28x28。在模型训练时,使用交叉熵作为损失函数,Adam作为优化器。在训练过程中,使用128个样本的批量训练,共进行10个epoch的训练。最后输出测试集上的准确率。需要注意的是,该代码示例使用了GPU进行训练,如果没有GPU可以将`.cuda()`去掉。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值