Datawhale九月组队学习--情感分析--Task01

Posted 深度不学习-_-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Datawhale九月组队学习--情感分析--Task01相关的知识,希望对你有一定的参考价值。

提示1:学习地址点这里
提示1:《Word embeddings: how to transform text into numbers》翻译速览点这里


前言

  Task01主要是采用RNN框架 (注意:本文对RNN原理不做详细的解读)、 IMDB数据集来构建了一个文本情感分析任务的Baseline模型。


一、模型构建流程

1.1 数据预处理

  TorchText 数据预处理包含以下步骤:

步骤1:使用Field来处理数据;
步骤2:使用Datasets加载要用的IMDB数据集,设置训练集和测试集;
步骤3:必须构建一个 词汇表,这样做是因为我们的模型不能对字符串进行操作,只能对数字进行操作;
步骤4:创建迭代器,需要创建验证集,测试集,以及训练集的迭代器, 每一次的迭代都会返回一个batch的数据。

  注意1:对于步骤二中,可以通过设置split_ratio参数来设置训练集和验证集的比例,即 split_ratio 为 0.8 意味着 80% 的示例构成训练集,20% 构成验证集,默认情况下,数据将按照70%和30%的比例划分为训练集和验证集。
  注意2:随机种子SEED传递给 random_state 参数,用来确保我们每次获得相同的训练集和验证集。

1.2 模型的构建和训练

  一、模型构建流程如下:
  注意梯度清零问题

1、选择模型,这里使用的是RNN;使用torch.nn进行模型加载;
2、定义参数;
3、计算要训练的参数数目(可选);
4、模型训练
  4.1、设置优化器,这里选择的是SGD;
  4.2、定义损失函数,这里使用的是BCEWithLogitsLoss;
  4.3、用【 .to】, 可以将张量放到gpu上计算;(可选)
  4.4、计算准确率;
  4.5、train()函数迭代所有的样本,每次都是一个batch,【训练函数】;
  4.6、模型评估;
  4.7、计算每个epoch的消耗时间;(可选)
  4.8、模型训练【注意模型保存】与模型验证;

  二、模型构建函数提示:

# 构建模型
class RNN(nn.Module):
    def __init__(self, input_dim, embedding_dim, hidden_dim, output_dim):
    	...   
    def forward(self, text):
    	...
------------------------------------------------------
 # 参数计算
def count_parameters(model):
 	...
------------------------------------------------------
 # 优化器、损失函数、gpu计算
import torch.optim as optim
optimizer = optim.SGD(model.parameters(), lr=1e-3)
criterion = nn.BCEWithLogitsLoss()
model = model.to(device)
criterion = criterion.to(device)
------------------------------------------------------
# 准确率
def binary_accuracy(preds, y):
	...
------------------------------------------------------
# 训练函数
def train(model, iterator, optimizer, criterion):
	...
------------------------------------------------------
# 模型评估
def evaluate(model, iterator, criterion):
	...
------------------------------------------------------
# 训练消耗时间
import time
def epoch_time(start_time, end_time):
	...
------------------------------------------------------
# 模型训练与验证
N_EPOCHS = 5
best_valid_loss = float('inf')
for epoch in range(N_EPOCHS):
    start_time = time.time()
    train_loss, train_acc = train(model, train_iterator, optimizer, criterion)
    valid_loss, valid_acc = evaluate(model, valid_iterator, criterion)
    end_time = time.time()
    epoch_mins, epoch_secs = epoch_time(start_time, end_time)
    if valid_loss < best_valid_loss:
        best_valid_loss = valid_loss
        torch.save(model.state_dict(), 'tut1-model.pt')
    print(f'Epoch: {epoch+1:02} | Epoch Time: {epoch_mins}m {epoch_secs}s')
    print(f'\\tTrain Loss: {train_loss:.3f} | Train Acc: {train_acc*100:.2f}%')
    print(f'\\t Val. Loss: {valid_loss:.3f} |  Val. Acc: {valid_acc*100:.2f}%')
    
# 验证  
model.load_state_dict(torch.load('tut1-model.pt'))
test_loss, test_acc = evaluate(model, test_iterator, criterion)
print(f'Test Loss: {test_loss:.3f} | Test Acc: {test_acc*100:.2f}%')

二、实验小结

  实验发现,准确率非常低,且5个epoch的训练过程中,训练loss与验证loss基本不变,结合模型自身特点,猜测为欠拟合问题,后续的学习将会对模型进行调优。关于深度学习之Loss不下降原因有很多因素,这里指路一篇文章供大家阅读。
深度学习之Loss不下降原因分析点这里


总结

  以上就是Task01的全部内容了,如果遇到原文链接无法加载的情况,可联系博主索要。

以上是关于Datawhale九月组队学习--情感分析--Task01的主要内容,如果未能解决你的问题,请参考以下文章

九月组队学习来了!

九月组队学习计划!

Datawhale7月组队学习task1数据加载及探索性数据分析

二预训练模型预测(Datawhale组队学习)

一导论——可解释性机器学习(DataWhale组队学习)

六月组队学习!