首页 > 其他分享 >《昇思 25 天学习打卡营第 23 天 | 基于MindSpore的GPT-2文本摘要 》

《昇思 25 天学习打卡营第 23 天 | 基于MindSpore的GPT-2文本摘要 》

时间:2024-07-26 10:24:23浏览次数:12  
标签:25 tokenizer 23 模型 摘要 dataset train 打卡 文本

《昇思 25 天学习打卡营第 23 天 | 基于MindSpore的GPT-2文本摘要 》

活动地址:https://xihe.mindspore.cn/events/mindspore-training-camp
签名:Sam9029


概述

文本摘要任务旨在从给定的文本中生成简短的摘要,同时保留关键信息。本案例使用MindSpore框架实现基于GPT-2模型的文本摘要。

实验环境配置

确保安装了MindSpore及相关库:

!pip install mindspore==2.2.14
!pip install tokenizers==0.15.0
!pip install mindnlp

数据集加载与处理

使用NLPCC2017摘要数据集,包含新闻正文及其摘要。

from mindnlp.utils import http_get
url = 'https://download.mindspore.cn/toolkits/mindnlp/dataset/text_generation/nlpcc2017/train_with_summ.txt'
path = http_get(url, './')

数据集分割

将数据集分为训练集和测试集:

from mindspore.dataset import TextFileDataset
dataset = TextFileDataset(str(path), shuffle=False)
train_dataset, test_dataset = dataset.split([0.9, 0.1], randomize=False)

数据预处理

使用BertTokenizer进行中文文本的分词和标记化处理。

from mindnlp.transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')

定义数据处理流程,包括合并文本、填充至最大序列长度等。

def process_dataset(dataset, tokenizer, batch_size=6, max_seq_len=1024, shuffle=False):
    # ...
    return dataset
train_dataset = process_dataset(train_dataset, tokenizer, batch_size=4)

模型构建

构建GPT-2摘要模型,并对模型输出进行Shift Right操作以适应摘要任务。

from mindnlp.transformers import GPT2LMHeadModel

class GPT2ForSummarization(GPT2LMHeadModel):
    def construct(self, input_ids, attention_mask, labels):
        # ...
        return loss

动态学习率

定义动态学习率,使用线性预热和衰减策略。

from mindspore.nn.learning_rate_schedule import LearningRateSchedule

class LinearWithWarmUp(LearningRateSchedule):
    # ...

模型训练

设置训练参数,初始化模型、优化器和学习率调度器。

num_epochs = 1
warmup_steps = 2000
learning_rate = 1.5e-4

config = GPT2Config(vocab_size=len(tokenizer))
model = GPT2ForSummarization(config)

使用MindSpore的Trainer进行模型训练。

from mindnlp._legacy.engine import Trainer

trainer = Trainer(network=model, train_dataset=train_dataset, epochs=num_epochs, optimizer=optimizer)
trainer.run(tgt_columns="labels")

模型推理

加载训练好的模型,进行文本摘要生成。

model = GPT2LMHeadModel.from_pretrained('./checkpoint/gpt2_summarization_epoch_0.ckpt', config=config)
model.set_train(False)

定义推理数据处理流程,将输入文本转换为模型可接受的格式。

def process_test_dataset(dataset, tokenizer, batch_size=1, max_seq_len=1024, max_summary_len=100):
    # ...
    return dataset
test_dataset = process_test_dataset(test_dataset, tokenizer, batch_size=1)

使用模型生成摘要。

for (input_ids, raw_summary) in test_dataset.create_tuple_iterator():
    output_ids = model.generate(input_ids, max_new_tokens=50, num_beams=5, no_repeat_ngram_size=2)
    output_text = tokenizer.decode(output_ids[0].tolist())
    print(output_text)

GPT-2模型在文本摘要任务上展现出了强大的能力,但模型的训练和调优需要大量的计算资源和时间。在实际应用中,需要根据具体需求和资源情况选择合适的模型规模和训练策略。
此外,文本摘要的质量很大程度上依赖于预处理和后处理步骤。在本案例中,使用BertTokenizer进行中文文本的处理,这需要对分词器进行适当的配置以适应不同的文本结构。
最后,动态学习率的设置对模型的训练效果有显著影响。预热和衰减策略有助于模型在训练初期快速收敛,在训练后期避免过拟合。

标签:25,tokenizer,23,模型,摘要,dataset,train,打卡,文本
From: https://blog.csdn.net/m0_61486963/article/details/140709011

相关文章

  • 洛谷题单指南-前缀和差分与离散化-P2367 语文成绩
    原题链接:https://www.luogu.com.cn/problem/P2367题意解读:对于数组s[],给指定q个区间[x,y]里每个数增加z,计算操作之后最小的数。解题思路:1、暴力做法对于每一个区间[x,y],枚举给每一个数增加z,然后遍历查找最小值,总体时间复杂度为O(N^2),不可行。2、一维差分对于给指定区间[x,......
  • 题解:P10043 [CCPC 2023 北京市赛] 广播
    博客使用更佳:Myblog题目传送门这道题是一个标准的dp了,只不过它要倒序来做。还是分三步。初值:初值想必都知道吧,若要求最小值,就把初值设成无穷大,\(dp_{0,i}\)和\(dp_{i,0}\)都要设成\(i\),\(dp_{0,0}\)一定要赋值成\(0\),这是本人亲自犯过的错误QwQ。状态:\(dp_{i,j}......
  • 实训day14(7.25)
    一、Git概述Git是一种分布式版本控制系统,用于跟踪和管理代码的变更。它是由LinusTorvalds创建的,最初被设计用于Linux内核的开发。Git允许开发人员跟踪和管理代码的版本,并且可以在不同的开发人员之间进行协作。Github用的就是Git系统来管理它们的网站,Github是一个社......
  • 7月25日JavaSE学习笔记
    线程的生命周期中,等待是主动的,阻塞是被动的锁对象创建锁对象,锁对象同一时间只允许一个线程进入//创建锁对象Locklock=newReentrantLock(true);//创建可重入锁可重入锁:在嵌套代码块中,锁对象一样就可以直接进入执行公平锁:保证线程获取锁的顺序与线程请求锁的顺序......
  • ACM日常训练日记——7.25
    Atcoder训练Harlequin思维题博弈论,思考每一次怎么转化最优,存在两个答案说明f可以赢,打表发现当所有数字都是偶数时,答案为second,否则为first#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;intmain(){ lln; cin>>n; llans=0; vector<ll>v(......
  • 7.23今日份作业
    1.求 1-----1000以内的完数示例:281 +4 +7+14+2 =28完数:完美的数除去本身以外的因子和等于本身6 1+2+3=6#include<stdio.h>#include<string.h>intmain(intargc,constchar*argv[]){   inti,j;   intsum;   for(i=1;i<=1000;......
  • 「模拟赛」暑期集训CSP提高模拟6(7.23)
    \(140pts,Rank23\)题目列表A.花间叔祖B.合并rC.回收波特D.斗篷花间叔祖\(98pts\)题意:给定一个数组,选择一个大于等于2的模数,然后把数组中的数变成\(mod\)该模数后的数。只能操作一次,问操作后最少有几种不同的数。赛事分析:开始5分钟想到了算\(a_i\)中所有......
  • Delphi CnPack CnRs232 以16进制 串口发送消息 WriteCommData
    使用Delphi组件CnPack里面的CnRs232,以十六进制对串口发送消息 WriteCommData找了好久,尝试了N个方法,不想安装MSComm,SPComm在新版Delphi有点怪怪的,还是用cnRs232直接上代码:procedure TForm1.Button1Click(Sender: TObject);var  DataArray:array of byte; Wl......
  • 郑州轻工业大学ZZULIOJ1111~1123合集
    郑州轻工业大学zzulioj1111~1123合集本人小趴菜一颗,写博客是为了监督自己的学习以及分享学习资源给需要的人,欢迎大家评论区指出问题。同时由于本人比较懒,注释就不再写了,当然一些自己经常犯迷糊的地方还是会标注的,大家有什么问题也可以指出来,大家一起学习进步。郑州轻......
  • NOIP2024/7/25模拟赛
    T4题意:答案对\(2^{16}\)取模。分析:根节点\(1\)选到\(1\)的概率为\(\frac{1}{n}\),然后随便把剩下的\(n-1\)分配给它的所有子树,记\(1\)的其中一个儿子为\(y\),那么\(y\)选到它所被分配到的数中最小值的概率为\(\frac{1}{siz_{y}}\),然后\(y\)再继续分配给它的子......