pytorch训练lstm_使用pytorch,预训练词向量,lstm,torchtext完成情感分类

12fac5d0584ba893f2a315388216f280.png
  • 分类是NLP处理中的一项基本任务,可以是两类,多类甚至多标签分类。可以基于tensorflow,keras或者pytorch来完成。本文采用训练好的词向量+LSTM模型来完成分类。本文是英文分类的样例,中文分类类似,可以先按文章路径下载词向量文件,然后准备训练数据,依次准备,进行训练。
  • 如果需要数据和完整源代码请在文章后留言。
  1. 预训练的词向量有很多,英文的包括glove的各种版本,实际上100维或者200维的足够满足日常使用。glove.6B.100d。中文的也很多,可以到这个路径下载:Embedding/Chinese-Word-Vectors
  2. 情感分类通常包括:生成数据集,训练或使用现成的词向量进行数据表示,准备训练模型,准备验证函数等,下面依次描述。
  3. 生成数据集。可以使用torchtext进行数据集生成。

torchtext的使用可以参考这个链接:Torchtext使用教程

数据文件包括:train.txt,eval.txt,test.txt,格式如下:

文本内容,标签(0/1),用 t 分隔,比如:

it 's worth taking the kids to 1

without shakespeare 's eloquent language , the update is dreary and sluggish 0

dense , exhilarating documentary 1

下面定义数据集生成函数:

16d092e853a2eb4bcc10010c554e03b4.png
  1. 训练或使用现有的词向量进行数据表示,完成模型的embeddings

6c2e9ea3bfecdf95c516a173649faefb.png
  • 其中load_bin_vec函数的主要功能是完成从词向量文件,生成向量词典:

89e60038de0efbadf2e8ab5efe6455c3.png
  1. 实现训练模型

d2f785dfc58e71ba619e2aa96a952643.png
  • 完成一轮训练的函数train_epoch_progress()

f3d0c08b5eb06da68b5723e394a5c0ab.png
  • LSTM模型定义:模型比较简单,首先是embedding层,然后是LSTM层,然后是hidden2label,输出各类标签的概率,然后通过F.log_softmax()函数取最大概率的一类。
  • 另外,最新的torch版本不再使用Variable,可以使用init_hidden_plus()

2809c2db2b505ebc972edd596c1c5e84.png
  • 准备验证函数

514f2738d719dcf916ad0f84029de923.png

其中,get_accuracy()函数完成实际类别和预测类别的对比,计算准确率。

2a1355327b43ff4ef68c505a23bac609.png

训练过程,两轮之后可以达到65.5%,6轮之后达到77.6%准确率。

8e801cceb6197db601d32f09e076b46b.png

6fde132173abd559405c346abfb5422d.png

还可以查看模型的相关信息:

a275915a0fa40462d3e8aff9bef2dda1.png

C:todotorchsentimentruns1607164778/best_model.pth

embeddings.weight torch.Size([16190, 100])

lstm.weight_ih_l0 torch.Size([600, 100])

lstm.weight_hh_l0 torch.Size([600, 150])

lstm.bias_ih_l0 torch.Size([600])

lstm.bias_hh_l0 torch.Size([600])

hidden2label.weight torch.Size([2, 150])

hidden2label.bias torch.Size([2])

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在训练LSTM时出现结果全为NaN的问题通常是由于训练过程中出现了梯度爆炸或梯度消失的情况。 首先,梯度爆炸可能是由于网络层数较深,导致反向传播时梯度值呈指数级增长。解决这个问题的方法包括:使用梯度裁剪,即设置一个阈值,当梯度超过该阈值时进行裁剪;缩小学习率,降低梯度的更新幅度;权重正则化等方法。 其次,梯度消失可能是由于网络层数较深,反向传播时梯度值太小,使得权重更新几乎没有发生。解决这个问题的方法包括:初始化权重时使用较小的随机数,使得梯度不容易消失;使用ReLU、LSTM等激活函数,可以缓解梯度消失问题;使用Batch Normalization进行归一化等。 此外,还可以对输入数据进行处理,包括归一化、标准化等,减少数据的变化范围,有助于提高网络的稳定性。 同时,监控损失函数的变化情况,如果损失函数在训练过程中出现不稳定或发散的情况,也可能导致结果为NaN。在这种情况下,可以考虑调整损失函数的权重或改变网络结构,以提高训练的稳定性。 总之,解决LSTM训练过程中结果全为NaN的问题需要综合考虑网络结构、权重初始化、梯度裁剪、学习率等因素,并根据具体情况采取相应的调整策略,以确保训练的稳定性和结果的有效性。 ### 回答2: 当在PyTorch训练LSTM模型时,结果全为NaN(Not a Number),通常是由于以下几个原因导致的。 1. 数据处理问题:在训练LSTM模型之前,需要对数据进行处理。检查是否有缺失数据或异常值。如果输入数据包含NaN值,LSTM模型将会返回NaN作为结果。确保数据集中不含NaN值,并对数据进行适当的归一化或标准化。 2. 学习率过高:使用的学习率可能过高,导致训练过程中发生梯度爆炸或梯度消失的情况。尝试减小学习率,可以通过调整优化器的参数来实现,如减小学习率衰减系数或使用较小的固定学习率。 3. 梯度裁剪不足:LSTM模型中存在梯度爆炸的问题,可以尝试增加梯度裁剪的阈值。通过限制梯度值的大小,可以防止梯度爆炸的问题。 4. 网络结构问题:LSTM模型的网络结构可能存在问题。检查网络结构的参数设置,例如隐藏层的大小,网络深度等。过大或过小的网络结构可能导致训练不稳定或结果出现NaN。 5. 默认参数问题:检查训练过程中使用的其他参数设置。例如,优化器的选择,损失函数的选择,迭代次数等。尝试更换不同的优化器和损失函数,适当调整迭代次数。 总结来说,当LSTM模型训练过程中出现结果全为NaN时,需要仔细检查数据处理、学习率、梯度裁剪、网络结构和默认参数等方面的问题,并进行相应的调整和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值