Python使用pytorch动手实现LSTM模块

Python使用PyTorch动手实现LSTM模块

LSTM(长短时记忆网络)是一种常用的循环神经网络,它可以用于处理序列数据。在本文中,我们将介绍如何使用PyTorch实现LSTM模块,并提供两个示例说明。

示例1:使用LSTM模块实现字符级语言模型

以下是一个使用LSTM模块实现字符级语言模型的示例代码:

import torch
import torch.nn as nn
import numpy as np

# Define character-level language model
class CharLSTM(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super(CharLSTM, self).__init__()
        self.hidden_size = hidden_size
        self.lstm = nn.LSTM(input_size, hidden_size)
        self.fc = nn.Linear(hidden_size, output_size)

    def forward(self, x, hidden):
        out, hidden = self.lstm(x, hidden)
        out = self.fc(out)
        return out, hidden

    def init_hidden(self, batch_size):
        return (torch.zeros(1, batch_size, self.hidden_size),
                torch.zeros(1, batch_size, self.hidden_size))

# Load data
with open('data.txt', 'r') as f:
    data = f.read()

# Create character to index mapping
chars = list(set(data))
char_to_idx = {ch: i for i, ch in enumerate(chars)}
idx_to_char = {i: ch for i, ch in enumerate(chars)}

# Convert data to tensor
data_idx = [char_to_idx[ch] for ch in data]
data_tensor = torch.from_numpy(np.array(data_idx)).long()

# Define hyperparameters
input_size = len(chars)
hidden_size = 128
output_size = len(chars)
seq_length = 100
num_epochs = 100
batch_size = 64
learning_rate = 0.01

# Define model, loss function, and optimizer
model = CharLSTM(input_size, hidden_size, output_size)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)

# Train model
for epoch in range(num_epochs):
    hidden = model.init_hidden(batch_size)
    for i in range(0, data_tensor.size(0) - seq_length, seq_length):
        inputs = data_tensor[i:i+seq_length].view(seq_length, batch_size)
        targets = data_tensor[i+1:i+seq_length+1].view(seq_length, batch_size)
        inputs = torch.nn.functional.one_hot(inputs, num_classes=input_size).float()
        targets = targets.view(-1)
        optimizer.zero_grad()
        outputs, hidden = model(inputs, hidden)
        loss = criterion(outputs.view(-1, output_size), targets)
        loss.backward()
        optimizer.step()

    if (epoch+1) % 10 == 0:
        print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, loss.item()))

# Generate text
with torch.no_grad():
    hidden = model.init_hidden(1)
    input = torch.nn.functional.one_hot(torch.randint(input_size, (1, 1)), num_classes=input_size).float()
    text = idx_to_char[input.argmax().item()]
    for i in range(1000):
        output, hidden = model(input.view(1, 1, -1), hidden)
        output = torch.softmax(output.view(-1), dim=0)
        input = torch.nn.functional.one_hot(output.argmax().unsqueeze(0), num_classes=input_size).float()
        text += idx_to_char[input.argmax().item()]
    print(text)

在这个示例中,我们首先加载数据,并将字符映射到索引。然后,我们定义了一个CharLSTM类来实现字符级语言模型。在训练过程中,我们使用交叉熵损失函数和Adam优化器来训练模型。在训练完成后,我们使用训练好的模型生成一些文本。

示例2:使用LSTM模块实现时间序列预测

以下是一个使用LSTM模块实现时间序列预测的示例代码:

import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
import matplotlib.pyplot as plt

# Generate data
np.random.seed(42)
t = np.arange(0, 100, 0.1)
x = np.sin(t) + np.random.randn(len(t)) * 0.1

# Convert data to tensors
x = torch.from_numpy(x).float()

# Define LSTM model
class LSTMPredictor(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super(LSTMPredictor, self).__init__()
        self.hidden_size = hidden_size
        self.lstm = nn.LSTM(input_size, hidden_size)
        self.fc = nn.Linear(hidden_size, output_size)

    def forward(self, x, hidden):
        out, hidden = self.lstm(x, hidden)
        out = self.fc(out)
        return out, hidden

    def init_hidden(self):
        return (torch.zeros(1, 1, self.hidden_size),
                torch.zeros(1, 1, self.hidden_size))

# Define hyperparameters
input_size = 1
hidden_size = 32
output_size = 1
seq_length = 10
num_epochs = 100
learning_rate = 0.01

# Define model, loss function, and optimizer
model = LSTMPredictor(input_size, hidden_size, output_size)
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=learning_rate)

# Train model
for epoch in range(num_epochs):
    hidden = model.init_hidden()
    for i in range(0, x.size(0) - seq_length, seq_length):
        inputs = x[i:i+seq_length].view(seq_length, 1, input_size)
        targets = x[i+1:i+seq_length+1].view(seq_length, 1, output_size)
        optimizer.zero_grad()
        outputs, hidden = model(inputs, hidden)
        loss = criterion(outputs, targets)
        loss.backward()
        optimizer.step()

    if (epoch+1) % 10 == 0:
        print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, loss.item()))

# Test model
with torch.no_grad():
    hidden = model.init_hidden()
    y_pred = []
    for i in range(0, x.size(0) - seq_length, seq_length):
        inputs = x[i:i+seq_length].view(seq_length, 1, input_size)
        outputs, hidden = model(inputs, hidden)
        y_pred.append(outputs[-1].item())

# Plot results
plt.plot(t, x.numpy(), label='True')
plt.plot(t[seq_length::seq_length], y_pred, label='Predicted')
plt.legend()
plt.show()

在这个示例中,我们首先生成了一些随机数据,并将其转换为PyTorch张量。然后,我们定义了一个LSTMPredictor类来实现时间序列预测模型。在训练过程中,我们使用均方误差损失函数和Adam优化器来训练模型。在测试过程中,我们使用训练好的模型对数据进行预测,并将结果可视化。

总结

在本文中,我们介绍了如何使用PyTorch实现LSTM模块,并提供了两个示例说明。这些技术对于在深度学习中处理序列数据非常有用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python使用pytorch动手实现LSTM模块 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • 【pytorch】带batch的tensor类型图像显示

    pytorch训练时我们一般把数据集放到数据加载器里,然后分批拿出来训练。训练前我们一般还要看一下训练数据长啥样,也就是训练数据集可视化。那么如何显示dataloader里面带batch的tensor类型的图像呢? 显示图像 绘图最常用的库就是matplotlib: pip install matplotlib 显示图像会用到matplotlib.pyplo…

    2023年4月7日
    00
  • notMNIST 数据集pyTorch分类

    简介 notMNIST数据集 是于2011公布的,可以认为是MNIST数据集地一个加强版本。数据集包含了从A到J十个字母,由large与small两个子集组成。其中samll数据集是经过手工清理的,包含19k个图片,误分类率越为0.5%,large数据集是未经过手工清理的,包含500k张图片,误分类率约为6.5%。 作者推荐在large数据集上训练网络,在s…

    PyTorch 2023年4月6日
    00
  • PyTorch-GPU加速实例

    在PyTorch中,我们可以使用GPU来加速模型的训练和推理。在本文中,我们将详细讲解如何使用GPU来加速模型的训练和推理。我们将使用两个示例来说明如何完成这些步骤。 示例1:使用GPU加速模型训练 以下是使用GPU加速模型训练的步骤: import torch import torch.nn as nn import torch.optim as opti…

    PyTorch 2023年5月15日
    00
  • Pytorch使用tensorboardX实现loss曲线可视化。超详细!!!

    https://www.jianshu.com/p/46eb3004beca使用到的代码:writer=SummaryWriter()writer.add_scalar(‘scalar/test’,loss,epoch) ###tensorboardX #第一个参数可以简单理解为保存图的名称,第二个参数是可以理解为Y轴数据,第三个参数可以理解为X轴数据。#当…

    PyTorch 2023年4月7日
    00
  • Pytorch使用PIL和Numpy将单张图片转为Pytorch张量方式

    将单张图片转为PyTorch张量是深度学习中常见的操作之一。在PyTorch中,我们可以使用PIL和Numpy库来实现这一操作。本文将提供一个详细的图文教程,介绍如何使用PIL和Numpy将单张图片转为PyTorch张量,并提供两个示例说明。 1. 使用PIL将单张图片转为PyTorch张量 以下是一个示例代码,展示了如何使用PIL将单张图片转为PyTorc…

    PyTorch 2023年5月15日
    00
  • [pytorch] 自定义激活函数中的注意事项

    如何在pytorch中使用自定义的激活函数? 如果自定义的激活函数是可导的,那么可以直接写一个python function来定义并调用,因为pytorch的autograd会自动对其求导。 如果自定义的激活函数不是可导的,比如类似于ReLU的分段可导的函数,需要写一个继承torch.autograd.Function的类,并自行定义forward和back…

    PyTorch 2023年4月6日
    00
  • pytorch两种模型保存方式

      只保存模型参数   # 保存 torch.save(model.state_dict(), ‘\parameter.pkl’) # 加载 model = TheModelClass(…) model.load_state_dict(torch.load(‘\parameter.pkl’))      保存完整模型   # 保存 torch.save(…

    PyTorch 2023年4月8日
    00
  • [pytorch修改]npyio.py 实现在标签中使用两种delimiter分割文件的行

    from __future__ import division, absolute_import, print_function import io import sys import os import re import itertools import warnings import weakref from operator import itemg…

    PyTorch 2023年4月8日
    00
合作推广
合作推广
分享本页
返回顶部