机器学习之阿里云天池大赛—新闻分类(二)双向长短记忆网络

简介: 本文为作者在阿里云天池大赛新闻分类比赛中的记录。

普通的长短时记忆神经网络只能对正向数据进行处理,而双向长短时记忆神经网络可以处理内容的上下文,通过新闻分类大赛结果可以看到双向长短时记忆神经网络具有一定的提升。
在pytorch中实现双向长短时记忆神经网络和简单,只需在参数中设置bidirectional=True即可,同时对循环神经网络中的ht和ct的定义num_directions=2,Linear 层in_features参数也变成hidden_size*2,如果不清楚可以参考pytorch官方文档,其他内容保持不变。

导入包

import torch
import torch.nn as nn
import torchtext
from torchtext.data.utils import get_tokenizer
from torchtext.vocab import Vocab
from collections import Counter
from torchtext.datasets import AG_NEWS
import pandas as pd
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

读取数据

# 训练数据
dataset = pd.read_csv("data/train_set.csv", sep="\t")
# 训练集
train_dataset = dataset.sample(frac=0.9)


# 测试集
#test_dataset = dataset[~dataset.index.isin(train_dataset.index)]

训练数据初始化

tokenizer = get_tokenizer("basic_english")
counter = Counter()
for (lebel, line) in train_dataset.iloc:
    counter.update(tokenizer(line))

# 词表
vocab = Vocab(counter, min_freq=1)

# 单词总数
vocab_num = len(vocab)
# 将英文句子转成ID列表
text_pipeline = lambda x: [vocab[token] for token in tokenizer(x)]

# 将标签转成ID
label_pipeline = lambda x: int(x)
# 将训练集句子转成ID向量
def get_label_line_tensors(data):
    lines = []
    labels = []
    for (label, line) in data:
        lines.append(torch.tensor(text_pipeline(line)).to(device))
        labels.append(torch.tensor([label_pipeline(label)]).to(device))
    return labels, lines

定义模型

# 定义模型
class RNN_LSTM(nn.Module):
    def __init__(self, input_size, hidden_size, output_size,  n_layers, vocab_size, dropout_p=0.1):
        super(RNN_LSTM, self).__init__()
        self.input_size = input_size
        self.hidden_size = hidden_size
        self.n_layers = n_layers
        self.vocab_size = vocab_size
        self.dropout_p = dropout_p
        
        # 定义神经网络层
        self.embeding = nn.Embedding(vocab_size, input_size)
        self.rnn = nn.LSTM(input_size, hidden_size, n_layers, dropout=self.dropout_p, bidirectional=True)
        self.out = nn.Linear(hidden_size*2, output_size)
        self.softmax = nn.LogSoftmax(dim=0)
        
    # 前馈
    def forward(self, input_words, hidden, cell):
        seq_len = input_words.size()[0]
        embeding = self.embeding(input_words).view(seq_len, 1, -1)
        out, (hn, cn) = self.rnn(embeding, (hidden, cell))
        out = self.softmax(self.out(out))
        return out, (hn, cn)
        
    # 初始化隐含层
    def init_hidden(self):
        hidden = torch.zeros(self.n_layers*2, 1, self.hidden_size)
        return hidden.to(device)
    
    # 初始化 cell state
    def init_cell_state(self):
        cell = torch.zeros(self.n_layers*2, 1, self.hidden_size)
        return cell.to(device)

定义训练方法

# 数据训练
def train(line, label, loss):
    optimizer.zero_grad()
    hidden = model.init_hidden()
    cell = model.init_cell_state()
    o, (h, c)  = model(line, hidden, cell)
    #oh = torch.sum(o, dim=0)
    oh = o[-1:].squeeze(0)
    l = loss(oh, label)
    
    l.backward()
    optimizer.step()
    return l

执行训练

labels, lines = get_label_line_tensors(train_dataset.iloc)
import random
import time
lossNum = []
begin = time.time()
print(begin)
optimizer = torch.optim.Adam(model.parameters(), lr=5e-4)
for i in range(300001):
    idx = random.randint(0, 179999)
    l = train(lines[idx], labels[idx], loss)
    lossNum.append(l)
    if i % 10000==0 or i==(159999):
        print(l)
print(time.time()-begin)

模型保存

torch.save(model, "model60.pkl")

定义一个简单的预测函数

#结果预测 为了快速度得到结果,使用简单粗暴的方法获取预测结果
def get_l(g):
    id = -1
    g1 = torch.max(g)
    for i in range(14):
        if g1==g[i]:
            id = i
            break
    return id

执行测试数据预测并保存

# 训练数据
submit_dataset = pd.read_csv("data/test_a.csv", sep="\t")
t_lines_ = []
for line in submit_dataset.iloc:
    t_lines_.append(torch.tensor(text_pipeline(line["text"])).to(device))

#预测结果
writes = []
for w in t_lines_:
    check_h = model.init_hidden()
    check_c = model.init_cell_state()
    check_o, (_, _) = model(w, check_h, check_c)
    writes.append(get_l(check_o[-1, -1]))
#写入数据到csv
tt = pd.DataFrame({"label": []})
tt["label"] = writes[0]
tt.to_csv("submit2.csv", sep="\t", index=False)

分类结果

目录
相关文章
|
2月前
|
网络协议 Java 数据库连接
2023第二届陇剑杯网络安全大赛 预选赛复盘学到的一些经验
2023第二届陇剑杯网络安全大赛 预选赛复盘学到的一些经验
48 6
|
2月前
|
机器学习/深度学习 测试技术
阿里云入选Gartner数据科学和机器学习平台挑战者象限
Gartner® 正式发布了《数据科学与机器学习平台魔力象限》报告(Magic Quadrant™ for Data Science and Machine Learning Platforms),阿里云成为唯一一家入选该报告的中国厂商,被评为“挑战者”(Challengers)。
|
5月前
|
机器学习/深度学习 人工智能 专有云
人工智能平台PAI使用问题之怎么将DLC的数据写入到另一个阿里云主账号的OSS中
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
【MM2024】阿里云 PAI 团队图像编辑算法论文入选 MM2024
阿里云人工智能平台 PAI 团队发表的图像编辑算法论文在 MM2024 上正式亮相发表。ACM MM(ACM国际多媒体会议)是国际多媒体领域的顶级会议,旨在为研究人员、工程师和行业专家提供一个交流平台,以展示在多媒体领域的最新研究成果、技术进展和应用案例。其主题涵盖了图像处理、视频分析、音频处理、社交媒体和多媒体系统等广泛领域。此次入选标志着阿里云人工智能平台 PAI 在图像编辑算法方面的研究获得了学术界的充分认可。
【MM2024】阿里云 PAI 团队图像编辑算法论文入选 MM2024
|
25天前
|
机器学习/深度学习 人工智能 自然语言处理
【EMNLP2024】阿里云人工智能平台 PAI 多篇论文入选 EMNLP2024
阿里云人工智能平台 PAI 的多篇论文在 EMNLP2024 上入选。论文成果是阿里云与华南理工大学金连文教授团队、复旦大学王鹏教授团队共同研发。EMNLP 是人工智能自然语言处理领域的顶级国际会议,聚焦于自然语言处理技术在各个应用场景的学术研究,尤其重视自然语言处理的实证研究。该会议曾推动了预训练语言模型、文本挖掘、对话系统、机器翻译等自然语言处理领域的核心创新,在学术和工业界都有巨大的影响力。此次入选标志着阿里云人工智能平台 PAI 在自然语言处理和多模态算法能力方面研究获得了学术界认可。
|
2月前
|
机器学习/深度学习 存储 自然语言处理
从理论到实践:如何使用长短期记忆网络(LSTM)改善自然语言处理任务
【10月更文挑战第7天】随着深度学习技术的发展,循环神经网络(RNNs)及其变体,特别是长短期记忆网络(LSTMs),已经成为处理序列数据的强大工具。在自然语言处理(NLP)领域,LSTM因其能够捕捉文本中的长期依赖关系而变得尤为重要。本文将介绍LSTM的基本原理,并通过具体的代码示例来展示如何在实际的NLP任务中应用LSTM。
91 4
|
2月前
|
算法 安全 Shell
2024i春秋第四届长城杯网络安全大赛暨京津冀网络安全技能竞赛初赛wp-flowershop+easyre
2024i春秋第四届长城杯网络安全大赛暨京津冀网络安全技能竞赛初赛wp-flowershop+easyre
101 1
|
2月前
|
JSON 测试技术 API
阿里云PAI-Stable Diffusion开源代码浅析之(二)我的png info怎么有乱码
阿里云PAI-Stable Diffusion开源代码浅析之(二)我的png info怎么有乱码
|
4月前
|
机器学习/深度学习 存储 人工智能
【ACL2024】阿里云人工智能平台PAI多篇论文入选ACL2024
近期,阿里云人工智能平台PAI的多篇论文在ACL2024上入选。论文成果是阿里云与阿里集团安全部、华南理工大学金连文教授团队、华东师范大学何晓丰教授团队共同研发。ACL(国际计算语言学年会)是人工智能自然语言处理领域的顶级国际会议,聚焦于自然语言处理技术在各个应用场景的学术研究。该会议曾推动了预训练语言模型、文本挖掘、对话系统、机器翻译等自然语言处理领域的核心创新,在学术和工业界都有巨大的影响力。此次入选标志着阿里云人工智能平台PAI在自然语言处理和多模态算法、算法框架能力方面研究获得了学术界认可。
|
4月前
|
机器学习/深度学习
【机器学习】面试题:LSTM长短期记忆网络的理解?LSTM是怎么解决梯度消失的问题的?还有哪些其它的解决梯度消失或梯度爆炸的方法?
长短时记忆网络(LSTM)的基本概念、解决梯度消失问题的机制,以及介绍了包括梯度裁剪、改变激活函数、残差结构和Batch Normalization在内的其他方法来解决梯度消失或梯度爆炸问题。
163 2
下一篇
无影云桌面