基于LSTM进行简单二分类

一、数据预处理

        1、总结:做分类模型需要将数据提取保存成 【x,y】形式,
                        将所有数据保存成一个list格式【【x1,y1】,【x2,y2】】

        2、截图:去除停用词用空格分开
                

二、构建词库及切分数据集

        1、构建三个字典

                x = {token1:id1}    --------- 用于将文本token进行数值转换,传给模型
                y_id = {y1:id1} --------- 用于将标签转换数值 传给模型
                id_y = {id1:y1} --------- 用于将模型传出的结果转换中午标签

        2、切分数据集 

                将总数据切分成训练集和测试集 (8:2或其它)

        3、构建DataLoader

三、参数初始化

        1、总结:
                自定义的:
                (1):批次大小     
                                作用:决定了每次训练时模型处理的数据量,
                                较小:(对数据特征抓取不准)
                                        优点:内存消耗少,减少过度拟合
                                        缺点:训练速度较慢,可能梯度估计不准,不稳定、收敛速度慢
                                较大:(抓取特征准,容易过拟合)
                                        优点:训练速度较快,充分利用硬件加速器的并行计算能力。
                                                   确保收敛性,更好地平均梯度,减少梯度更新的噪声
                                                   有助于收敛到较好的局部最小值
                                        缺点:内存需求高
                                                   泛化性能下降
                                建议:尝试不同的批次大小,观察验证集上的性能

                (2):Embedding维度
                                作用:将token转换固定大小向量空间维度
                                较小:捕捉语义信息相对少,
                                较大:增加模型复杂性,并容易过拟合
                                建议:可以通过交叉验证来选择最优的维度

                (3):rnn隐藏大小
                                作用:LSTM单元中隐藏状态维度
                                较小:导致模型容量不足,文本信息少
                                较大:容易过拟合
                                建议:可以通过交叉验证来选择最优的维度

                (4):训练轮数
                                作用:定义训练次数
                              
                (5):学习率
                             作用:决定了模型在每次参数更新时的步长大小
                             较大:加速训练过程,可能导致训练不稳定
                             较小:可能导致训练过程过慢
                             建议:可以使用学习率调度器,来自动调整学习率
                固定的:
                (1):词库数量    
                (2):类别数量


四、模型构建
        第一部分:__init__
                1、词向量
                        self.embedding = nn.Embedding(词库大小, 词向量维度, padding_idx=0)
                        padding_idx填充
                2、模型
                        self.rnn = nn.GRU(input_size = embedding维度,hidden_size=RNN维度
                                                          batch_first = True(指定输入和输出张量的形状),)
                3、输出层
                        self.out = nn.Linear(rnn隐层维度大小, 类别数量
        第二部分:forward(self, x)
                1、将文本转换为向量        x = self.embedding(x)
                2、经过模型得到输出        r_out, h_n = self.rnn(x)
                3、经过输出层得到结果    out = self.out(h_n[0])
                                                           return out
        整体代码:
                
        

五、训练模型
        1、设置优化器和损失函数
        2、循环训练轮次
        3、设置模型为训练模式
        4、遍历训练数据
        5、优化器梯度清零
        6、前向传播
        7、计算损失
        8、后向传播
        9、更新梯度值
        10、每一轮训练训练完一次数据 进行测试集测试
        11、判断准确率是否比上次好 进行保存模型
        12、整体代码
                

六、调用训练好的模型
        1、将输入的文本和训练数据一样的处理  (分词、去停用、转数值)
        2、加载保存好的模型
        3、将处理好的文本 输入模型
        4、将输出的数据进行归一化映射(0,1)
        5、和4同步找到最大值的索引映射为标签
        6、得到了 概率值和输出标签
        

 

  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
LSTM (Long Short-Term Memory) 是一种特殊的循环神经网络(RNN)架构,用于处理具有长期依赖关系的序列数据。传统的RNN在处理长序列时往往会遇到梯度消失或梯度爆炸的问题,导致无法有效地捕捉长期依赖。LSTM通过引入门控机制(Gating Mechanism)和记忆单元(Memory Cell)来克服这些问题。 以下是LSTM的基本结构和主要组件: 记忆单元(Memory Cell):记忆单元是LSTM的核心,用于存储长期信息。它像一个传送带一样,在整个链上运行,只有一些小的线性交互。信息很容易地在其上保持不变。 输入门(Input Gate):输入门决定了哪些新的信息会被加入到记忆单元中。它由当前时刻的输入和上一时刻的隐藏状态共同决定。 遗忘门(Forget Gate):遗忘门决定了哪些信息会从记忆单元中被丢弃或遗忘。它也由当前时刻的输入和上一时刻的隐藏状态共同决定。 输出门(Output Gate):输出门决定了哪些信息会从记忆单元中输出到当前时刻的隐藏状态中。同样地,它也由当前时刻的输入和上一时刻的隐藏状态共同决定。 LSTM的计算过程可以大致描述为: 通过遗忘门决定从记忆单元中丢弃哪些信息。 通过输入门决定哪些新的信息会被加入到记忆单元中。 更新记忆单元的状态。 通过输出门决定哪些信息会从记忆单元中输出到当前时刻的隐藏状态中。 由于LSTM能够有效地处理长期依赖关系,它在许多序列建模任务中都取得了很好的效果,如语音识别、文本生成、机器翻译、时序预测等。
好的,下面是一个简单的基于 PyTorch 的 LSTM 二分类预测模型的代码示例: ```python import torch import torch.nn as nn class LSTMClassifier(nn.Module): def __init__(self, vocab_size, embedding_dim, hidden_dim, output_dim, num_layers, bidirectional, dropout): super().__init__() self.embedding = nn.Embedding(vocab_size, embedding_dim) self.lstm = nn.LSTM(embedding_dim, hidden_dim, num_layers=num_layers, bidirectional=bidirectional, dropout=dropout) self.fc = nn.Linear(hidden_dim * 2 if bidirectional else hidden_dim, output_dim) self.dropout = nn.Dropout(dropout) def forward(self, text, text_lengths): embedded = self.dropout(self.embedding(text)) packed_embedded = nn.utils.rnn.pack_padded_sequence(embedded, text_lengths.to('cpu')) packed_output, (hidden, cell) = self.lstm(packed_embedded) output, output_lengths = nn.utils.rnn.pad_packed_sequence(packed_output) hidden = self.dropout(torch.cat((hidden[-2,:,:], hidden[-1,:,:]), dim=1) if self.lstm.bidirectional else hidden[-1,:,:]) return self.fc(hidden) ``` 这是一个包含一个嵌入层、一个 LSTM 层和一个全连接层的模型。其中 `vocab_size` 是词汇表大小,`embedding_dim` 是词向量维度,`hidden_dim` 是 LSTM 隐藏层的维度,`output_dim` 是输出维度(即二分类的结果),`num_layers` 是 LSTM 层数,`bidirectional` 表示是否使用双向 LSTM,`dropout` 是 dropout 概率。 在 forward 方法中,我们首先将输入文本进行嵌入,然后使用 LSTM进行处理。由于输入文本长度不同,我们需要使用 `pack_padded_sequence` 和 `pad_packed_sequence` 函数对输入进行处理。最后,我们将 LSTM 层的输出通过全连接层得到最终的预测结果。 接下来,我们需要定义损失函数和优化器,并对模型进行训练和测试: ```python import torch.optim as optim # 定义模型和损失函数 model = LSTMClassifier(vocab_size, embedding_dim, hidden_dim, output_dim, num_layers, bidirectional, dropout).to(device) criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters()) # 训练模型 for epoch in range(num_epochs): for batch in train_iterator: optimizer.zero_grad() text, text_lengths = batch.text predictions = model(text, text_lengths).squeeze(1) loss = criterion(predictions, batch.label) loss.backward() optimizer.step() # 测试模型 def test_model(model, iterator): correct = 0 total = 0 model.eval() with torch.no_grad(): for batch in iterator: text, text_lengths = batch.text predictions = model(text, text_lengths).squeeze(1) pred_labels = predictions.argmax(1) correct += (pred_labels == batch.label).sum().item() total += batch.batch_size return correct / total test_acc = test_model(model, test_iterator) print(f'Test Accuracy: {test_acc:.3f}') ``` 在训练过程中,我们首先将优化器的梯度清零,然后将输入文本和长度传递给模型,得到预测结果并计算损失。最后,我们使用反向传播更新模型参数。 在测试过程中,我们将模型设置为 eval 模式,然后对测试数据进行预测,并计算准确率。 这就是一个简单的基于 PyTorch 的 LSTM 二分类预测模型的实现。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值