LSTM文本预测(Pytorch版)

任务:基于 flare 文本数据,建立 LSTM 模型,预测序列文字
1.完成数据预处理,将文字序列数据转化为可用于LSTM输入的数据
2.查看文字数据预处理后的数据结构,并进行数据分离操作
3.针对字符串输入(" flare is a teacher in ai industry. He obtained his phd in Australia."),预测其对应的后续字符
参考视频:吹爆!3小时搞懂!【RNN循环神经网络+时间序列LSTM深度学习模型】学不会UP主下跪!
部分参数与视频不同

pre.py

import numpy as np
import torch
from torch import nn
from torch.utils.data import DataLoader, TensorDataset
from model import LSTM

# 加载数据
data = open('flare').read()
# 移除换行符
data = data.replace('\n','').replace('\r','')
# print(data)
# 字符去重
letters = list(set(data))
num_letters = len(letters)
# print(letters)
# print(len(letters))

# 建立字典
int_to_char = {a:b for a,b in enumerate(letters)}
# print(int_to_char)
char_to_int = {b:a for a,b in enumerate(letters)}
# print(char_to_int)
time_step = 10

# 滑动窗口提取数据
def extract_data(data, slide):
  x = []
  y = []
  for i in range(len(data) - slide):
    x.append([a for a in data[i : i + slide]])
    y.append(data[i+slide])
  return x,y

# 字符到数字的批量转化
def char_to_int_Data(x, y, chat_to_int):
  x_to_int = []
  y_to_int = []
  for i in range(len(x)):
    x_to_int.append([char_to_int[char] for char in x[i]])
    y_to_int.append([char_to_int[char] for char in y[i]])  
  return x_to_int, y_to_int

# 实现输入字符文章的批量处理,输入整个字符,滑动窗口大小,转化字典
def data_preprocessing(data, slide, num_letters, char_to_int):
  char_Data = extract_data(data, slide)  
  int_Data = char_to_int_Data(char_Data[0], char_Data[1], char_to_int)  
  Input = int_Data[0]
  Output = list(np.array(int_Data[1]).flatten())
  Input_RESHAPED = np.array(Input).reshape(len(Input), slide)
  new = np.random.randint(0, 10, size=[Input_RESHAPED.shape[0], Input_RESHAPED.shape[1], num_letters])  
  for i in range(Input_RESHAPED.shape[0]):
    for j in range(Input_RESHAPED.shape[1]):
      new[i, j, :] = torch.nn.functional.one_hot(torch.tensor(Input_RESHAPED[i, j], dtype=torch.long), num_classes = num_letters)  
  return new, Output
x,y = data_preprocessing(data, time_step, num_letters, char_to_int)
# print(y)

from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.1, random_state=10)
# print(x_train.shape, len(y_train))
y_train_category = torch.nn.functional.one_hot(torch.tensor(y_train, dtype=torch.long), num_letters)
# print(y_train_category)

# 将数据转换为 PyTorch 的 Tensor
x_train_tensor = torch.tensor(x_train, dtype=torch.float32)
y_train_tensor = torch.tensor(y_train, dtype=torch.long)
x_test_tensor = torch.tensor(x_test, dtype=torch.float32)
y_test_tensor = torch.tensor(y_test, dtype=torch.long)

model.py

import torch
from torch import nn

class LSTM(nn.Module):
    def __init__(self, input_size, hidden_size, output_size, num_layers, dropout_prob=0.2):
        super(LSTM, self).__init__()
        
        # 定义LSTM层
        self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True, dropout=dropout_prob)
        
        # 定义Dropout层
        self.dropout = nn.Dropout(dropout_prob)  # Dropout层,用于在全连接层前丢弃部分神经元
        
        # 定义全连接层
        self.fc = nn.Linear(hidden_size, output_size)
        
    def forward(self, x):
        # LSTM输出
        out, _ = self.lstm(x)
        
        # LSTM输出的最后一个时间步
        out = out[:, -1, :]
        
        # Dropout层
        out = self.dropout(out)
        
        # 全连接层输出
        out = self.fc(out)
        
        return out

train.py

import numpy as np
import torch
from torch import nn
from torch.utils.data import DataLoader, TensorDataset
from model import LSTM
from pre import *

# 定义模型参数
input_size = num_letters  # 输入大小等于字母集的大小
hidden_size = 256         # 隐藏层大小
output_size = num_letters # 输出大小(预测下一个字符)
num_layers = 2            # LSTM层数

# 实例化模型
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = LSTM(input_size, hidden_size, output_size, num_layers).to(device)

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss(reduction = 'mean')
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)

# 创建 DataLoader
train_dataset = TensorDataset(x_train_tensor, y_train_tensor)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)

# 训练模型
num_epochs = 10
best_accuracy = 0.0  # 用于保存最好的模型
for epoch in range(num_epochs):
    model.train()
    running_loss = 0.0
    for inputs, targets in train_loader:
        inputs, targets = inputs.to(device), targets.to(device)
        
        # 前向传播
        outputs = model(inputs)
        loss = criterion(outputs, targets)
        
        # 反向传播和优化
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        
        running_loss += loss.item()

    print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(train_loader):.4f}')
    
    # 你可以在每个 epoch 后验证模型并保存最佳模型
    model.eval()
    with torch.no_grad():
        x_test_tensor = torch.tensor(x_test, dtype=torch.float32).to(device)
        y_test_tensor = torch.tensor(y_test, dtype=torch.long).to(device)
        
        outputs = model(x_test_tensor)
        _, predicted = torch.max(outputs, dim=1)
        correct = (predicted == y_test_tensor).sum().item()
        accuracy = correct / y_test_tensor.size(0)

        print(f'Epoch [{epoch+1}/{num_epochs}], Test Accuracy: {accuracy * 100:.2f}%')

        # 如果模型的准确率提升了,则保存模型
        if accuracy > best_accuracy:
            best_accuracy = accuracy
            torch.save(model.state_dict(), 'best_lstm_model.pth')
            print("Model saved!")

# 最后保存最终模型
torch.save(model.state_dict(), 'final_lstm_model.pth')

# # 测试模型
# model.eval()
# with torch.no_grad():
#     x_test_tensor = torch.tensor(x_test, dtype=torch.float32).to(device)  # 确保测试数据在设备上
#     y_test_tensor = torch.tensor(y_test, dtype=torch.long).to(device)     # 确保测试标签在设备上
    
#     # 前向传播
#     outputs = model(x_test_tensor)
#     _, predicted = torch.max(outputs, dim=1)  # 获取预测类别的索引
    
#     # 计算准确率
#     correct = (predicted == y_test_tensor).sum().item()
#     accuracy = correct / y_test_tensor.size(0)
#     print(f'Test Accuracy: {accuracy * 100:.2f}%')

test.py

import torch
from model import LSTM
from pre import *  # 确保 'pre' 模块中包含了数据处理的相关代码
from sklearn.metrics import accuracy_score

# 定义设备
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

# 定义模型参数(与训练时的参数一致)
input_size = num_letters  # 输入大小等于字母表的大小
hidden_size = 256         # 隐藏层大小
output_size = num_letters # 输出大小(预测下一个字符)
num_layers = 2           # LSTM层数

# 实例化模型并加载训练好的参数
model = LSTM(input_size, hidden_size, output_size, num_layers).to(device)
model.load_state_dict(torch.load('best_lstm_model.pth'))  # 加载你保存的最佳模型
model.eval()  # 设置为评估模式

# 需要预测的新的字符串
new_string = "flare is a teacher in ai industry. He obtained his phd in Australia."

# 预处理输入数据:将新字符串转换为适合模型输入的张量形式
X_new, y_new = data_preprocessing(new_string, time_step, num_letters, char_to_int)  # 使用相同的预处理函数
X_new_tensor = torch.tensor(X_new, dtype=torch.float32).to(device)
y_new_tensor = torch.tensor(y_new, dtype=torch.long).to(device)  # 实际的标签

# 进行预测
with torch.no_grad():
    # 前向传播,获取模型的输出
    outputs = model(X_new_tensor)
    _, predicted_indices = torch.max(outputs, dim=1)  # 获取每个时间步的预测类别

# 将预测的索引转换回字符
predicted_chars = [int_to_char[idx.item()] for idx in predicted_indices]

# 将真实的标签转换回字符
true_chars = [int_to_char[idx] for idx in y_new]

# 计算准确率
correct_predictions = (predicted_indices == y_new_tensor).sum().item()
total_predictions = len(y_new_tensor)
accuracy = correct_predictions / total_predictions

# 打印预测结果与准确率
print(f"Accuracy on new string: {accuracy * 100:.2f}%")

# 打印详细的预测信息
for i in range(len(new_string) - time_step):
    print(f"Context: {new_string[i:i + time_step]} --> Predicted: {predicted_chars[i]}, Actual: {true_chars[i]}")
### 回答1: LSTM(长短期记忆网络)是一种深度学习模型,常用于自然语言处理任务中,包括情感分类。情感分类是将文本分为不同的情感类别,如正面、负面或中性。在PyTorch中,可以使用LSTM模型来进行情感分类。 首先,需要准备好训练数据和测试数据。训练数据应包含已标记的文本及其对应的情感类别,用于训练模型。测试数据用于评估训练得到的模型的性能。 接下来,需要构建LSTM模型。在PyTorch中,可以使用torch.nn模块中的LSTM类来建立模型LSTM模型由一个或多个LSTM层组成,可以根据需求设置隐藏层大小、输入维度等参数。模型的输出通过一个全连接层进行预测,输出为情感类别的概率分布。 训练过程中,需要定义损失函数和优化器。常用的损失函数是交叉熵损失函数,优化器可以选择Adam或SGD等。然后,将训练数据输入模型进行前向传播,计算损失值,并反向传播进行参数更新。 训练过程中可以设置一些超参数,如学习率、迭代次数和批大小等。通过调整超参数,可以提高模型的性能。 训练完成后,可以使用测试数据来评估模型。将测试数据输入模型进行前向传播,得到预测的情感类别。可以使用准确率、精确度、召回率等指标来评估模型的性能。 总结来说,使用PyTorch中的LSTM模型进行情感分类的步骤包括准备数据集、构建模型、定义损失函数和优化器、进行训练和评估。通过调整超参数和优化模型,可以提高情感分类任务的准确性和性能。 ### 回答2: LSTM(Long Short-Term Memory)是一种特殊的循环神经网络(Recurrent Neural Network,RNN)架构,被广泛应用于自然语言处理领域的任务中,包括情感分类。PyTorch是一种深度学习框架,提供了许多强大的库和工具,方便进行神经网络的构建和训练。 在LSTM情感分类中,首先需要准备训练数据集和测试数据集。训练数据集应包含已标注好的文本数据和相应的情感类别。然后,我们可以使用PyTorch来构建LSTM模型。 在PyTorch中,可以使用`nn.LSTM`类来定义LSTM模型的结构,我们需要指定输入维度、隐藏层维度以及层数等参数。接着,将LSTM模型与其他网络层,如全连接层(`nn.Linear`)和激活函数(`nn.ReLU`或`nn.Sigmoid`)进行组合,构建一个完整的情感分类器模型。 训练过程中,可以使用交叉熵损失函数(`nn.CrossEntropyLoss`)来计算模型的损失,并使用优化器(如随机梯度下降优化器`optim.SGD`或Adam优化器`optim.Adam`)进行模型参数的优化。通过迭代训练数据集多个周期(epochs),我们可以逐渐调整模型的参数以提高模型的分类性能。 在测试阶段,我们可以使用训练好的LSTM模型对未见过的文本数据进行情感分类预测。将输入的文本数据传入模型,并利用已学习到的参数进行前向传播计算,最终输出对应的情感类别。 总之,使用PyTorch构建LSTM情感分类器可以通过合理的网络设计、合适的损失函数和优化器以及适当的训练策略来实现对文本情感的有效分类预测。 ### 回答3: LSTM(长短期记忆)是一种循环神经网络的变体,通常用于处理文本数据中的序列信息。情感分类是一种常见的自然语言处理任务,目标是将文本数据分类为积极、中性或消极情感。 使用PyTorch实现LSTM情感分类模型通常需要以下步骤: 1. 数据预处理:将文本数据转换为数值化的表示形式。可以使用词袋模型、词嵌入(如word2vec、GloVe)等技术将文本转换为向量。此外,还需要将情感标签转换为数值表示。 2. 模型构建:定义LSTM模型的结构。使用PyTorch的torch.nn模块,可以构建一个包含嵌入层、LSTM层和全连接层的模型。嵌入层将单词索引转换为密集向量表示,LSTM层处理序列信息,全连接层用于分类。 3. 训练模型:将预处理后的数据分为训练集和测试集,并定义损失函数和优化器。常用的损失函数包括交叉熵损失函数(CrossEntropyLoss),优化器可以选择Adam、SGD等。使用训练集对模型进行训练,通过反向传播算法更新模型参数。 4. 模型评估:使用测试集评估模型性能。可以计算准确率、精确率、召回率和F1值等评价指标。 LSTM模型在情感分类任务中的优势在于它具有记忆性,可以更好地捕捉文本序列中的长期依赖关系。PyTorch提供了简洁而灵活的API,能够帮助我们快速构建和训练LSTM模型。 需要注意的是,模型的性能可能受到数据质量、模型结构和超参数等多个因素的影响。因此,在实际应用中,还需要进行调优和验证,以获得更好的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值