当前位置: 首页 > news >正文

昇思25天学习打卡营第18天 | 基于MindSpore的GPT2文本摘要

昇思25天学习打卡营第18天 | 基于MindSpore的GPT2文本摘要

文章目录

  • 昇思25天学习打卡营第18天 | 基于MindSpore的GPT2文本摘要
    • 数据集
      • 创建数据集
      • 数据预处理
      • Tokenizer
    • 模型构建
      • 构建GPT2ForSummarization模型
      • 动态学习率
    • 模型训练
    • 模型推理
    • 总结
    • 打卡

数据集

实验使用nlpcc2017摘要数据,内容为新闻正文及其摘要,总计50000个样本。

创建数据集

from mindnlp.utils import http_get# download dataset
url = 'https://download.mindspore.cn/toolkits/mindnlp/dataset/text_generation/nlpcc2017/train_with_summ.txt'
path = http_get(url, './')from mindspore.dataset import TextFileDataset# load dataset
dataset = TextFileDataset(str(path), shuffle=False)
dataset.get_dataset_size()

数据预处理

原始数据:

article: [CLS] article_context [SEP]
summary: [CLS] summary_context [SEP]

处理后的数据:

[CLS] article_context [SEP] summary_context [SEP]
import json
import numpy as np# preprocess dataset
def process_dataset(dataset, tokenizer, batch_size=6, max_seq_len=1024, shuffle=False):def read_map(text):data = json.loads(text.tobytes())return np.array(data['article']), np.array(data['summarization'])def merge_and_pad(article, summary):# tokenization# pad to max_seq_length, only truncate the articletokenized = tokenizer(text=article, text_pair=summary,padding='max_length', truncation='only_first', max_length=max_seq_len)return tokenized['input_ids'], tokenized['input_ids']dataset = dataset.map(read_map, 'text', ['article', 'summary'])# change column names to input_ids and labels for the following trainingdataset = dataset.map(merge_and_pad, ['article', 'summary'], ['input_ids', 'labels'])dataset = dataset.batch(batch_size)if shuffle:dataset = dataset.shuffle(batch_size)return dataset

Tokenizer

由于GPT2无中文tokenizer,使用BertTokenizer替代。

from mindnlp.transformers import BertTokenizer# We use BertTokenizer for tokenizing chinese context.
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
len(tokenizer)train_dataset = process_dataset(train_dataset, tokenizer, batch_size=4)

模型构建

构建GPT2ForSummarization模型

from mindspore import ops
from mindnlp.transformers import GPT2LMHeadModelclass GPT2ForSummarization(GPT2LMHeadModel):def construct(self,input_ids = None,attention_mask = None,labels = None,):outputs = super().construct(input_ids=input_ids, attention_mask=attention_mask)shift_logits = outputs.logits[..., :-1, :]shift_labels = labels[..., 1:]# Flatten the tokensloss = ops.cross_entropy(shift_logits.view(-1, shift_logits.shape[-1]), shift_labels.view(-1), ignore_index=tokenizer.pad_token_id)return loss

动态学习率

from mindspore import ops
from mindspore.nn.learning_rate_schedule import LearningRateScheduleclass LinearWithWarmUp(LearningRateSchedule):"""Warmup-decay learning rate."""def __init__(self, learning_rate, num_warmup_steps, num_training_steps):super().__init__()self.learning_rate = learning_rateself.num_warmup_steps = num_warmup_stepsself.num_training_steps = num_training_stepsdef construct(self, global_step):if global_step < self.num_warmup_steps:return global_step / float(max(1, self.num_warmup_steps)) * self.learning_ratereturn ops.maximum(0.0, (self.num_training_steps - global_step) / (max(1, self.num_training_steps - self.num_warmup_steps))) * self.learning_rate

模型训练

num_epochs = 1
warmup_steps = 2000
learning_rate = 1.5e-4num_training_steps = num_epochs * train_dataset.get_dataset_size()from mindspore import nn
from mindnlp.transformers import GPT2Config, GPT2LMHeadModelconfig = GPT2Config(vocab_size=len(tokenizer))
model = GPT2ForSummarization(config)lr_scheduler = LinearWithWarmUp(learning_rate=learning_rate, num_warmup_steps=warmup_steps, num_training_steps=num_training_steps)
optimizer = nn.AdamWeightDecay(model.trainable_params(), learning_rate=lr_scheduler)from mindnlp._legacy.engine import Trainer
from mindnlp._legacy.engine.callbacks import CheckpointCallbackckpoint_cb = CheckpointCallback(save_path='checkpoint', ckpt_name='gpt2_summarization',epochs=1, keep_checkpoint_max=2)trainer = Trainer(network=model, train_dataset=train_dataset,epochs=1, optimizer=optimizer, callbacks=ckpoint_cb)
trainer.set_amp(level='O1')  # 开启混合精度trainer.run(tgt_columns="labels")

模型推理

def process_test_dataset(dataset, tokenizer, batch_size=1, max_seq_len=1024, max_summary_len=100):def read_map(text):data = json.loads(text.tobytes())return np.array(data['article']), np.array(data['summarization'])def pad(article):tokenized = tokenizer(text=article, truncation=True, max_length=max_seq_len-max_summary_len)return tokenized['input_ids']dataset = dataset.map(read_map, 'text', ['article', 'summary'])dataset = dataset.map(pad, 'article', ['input_ids'])dataset = dataset.batch(batch_size)return datasettest_dataset = process_test_dataset(test_dataset, tokenizer, batch_size=1)
model = GPT2LMHeadModel.from_pretrained('./checkpoint/gpt2_summarization_epoch_0.ckpt', config=config)model.set_train(False)
model.config.eos_token_id = model.config.sep_token_id
i = 0
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)i += 1if i == 1:break

总结

这一节介绍了在MindSpore中使用GPT2LMHeadModel实现文本摘要的实验。实验使用nlpcc2017摘要数据,并使用BertTokenizer进行中文分词,此外还使用了动态学习率来调整模型收敛速度。

打卡

在这里插入图片描述

相关文章:

昇思25天学习打卡营第18天 | 基于MindSpore的GPT2文本摘要

昇思25天学习打卡营第18天 | 基于MindSpore的GPT2文本摘要 文章目录 昇思25天学习打卡营第18天 | 基于MindSpore的GPT2文本摘要数据集创建数据集数据预处理Tokenizer 模型构建构建GPT2ForSummarization模型动态学习率 模型训练模型推理总结打卡 数据集 实验使用nlpcc2017摘要数…...

科研绘图系列:R语言circos图(circos plot)

介绍 Circos图是一种数据可视化工具,它以圆形布局展示数据,通常用于显示数据之间的关系和模式。这种图表特别适合于展示分层数据或网络关系。Circos图的一些关键特点包括: 圆形布局:数据被组织在一个或多个同心圆中,每个圆可以代表不同的数据维度或层次。扇区:每个圆被划…...

追踪Conda包的踪迹:深入探索依赖关系与管理

追踪Conda包的踪迹&#xff1a;深入探索依赖关系与管理 Conda作为Python和其他科学计算语言的包管理器&#xff0c;不仅提供了安装、更新和卸载包的功能&#xff0c;还有一个强大的包跟踪功能&#xff0c;帮助用户理解包之间的依赖关系和管理环境。本文将详细解释如何在Conda中…...

苹果电脑pdf合并软件 苹果电脑合并pdf 苹果电脑pdf怎么合并

在数字化办公日益普及的今天&#xff0c;pdf文件因其跨平台兼容性强、格式稳定等特点&#xff0c;已经成为工作、学习和生活中不可或缺的文件格式。然而&#xff0c;我们常常面临一个问题&#xff1a;如何将多个pdf文件合并为一个&#xff1f;这不仅有助于文件的整理和管理&…...

axios(ajax请求库)

json-server(搭建http服务) json-server用来快速搭建模拟的REST API的工具包 使用json-server 下载&#xff1a;npm install -g json-server创建数据库json文件&#xff1a;db.json开启服务&#xff1a;json-srver --watch db.json axios的基本使用 <!doctype html>…...

Ideal窗口中左右侧栏消失了

不知道大家在工作过程中有没有遇到过此类问题&#xff0c;不论是Maven项目还是Gradle项目&#xff0c;突然发现Ideal窗口右侧图标丢失了&#xff0c;同事今天突然说大象图标不见了&#xff0c;不知道怎样刷新gradle。 不要慌张&#xff0c;下面提供一些解决思路&#xff1a; 1…...

麦芒30全新绽放,中国电信勾勒出AI手机的新方向

高通总裁兼CEO克里斯蒂亚诺阿蒙曾在媒体采访时表示&#xff1a;2024年将成为全球AI手机元年&#xff0c;生成式AI正在“非常快”的进入手机。 把大模型装进手机&#xff0c;由此成了智能终端演进的新方向。三星、华为、OPPO、小米等品牌动作频频&#xff0c;纷纷抢滩AI手机市场…...

​数据结构之初始二叉树(3)

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;数据结构&#xff08;Java版&#xff09; 二叉树的基本操作 通过上篇文章的学习&#xff0c;我们简单的了解了二叉树的相关操作。接下来就是有…...

egret 白鹭的编译太慢了 自己写了一个

用的swc 他会检测git的改变 const simpleGit require(simple-git); const fs require(fs); const path require(path); // 初始化 simple-git const swc require(swc/core); const baseDir D:\\project; const gameDir game\\module\\abcdefg; const gitDir D:\\projec…...

<数据集>pcb板缺陷检测数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;693张 标注数量(xml文件个数)&#xff1a;693 标注数量(txt文件个数)&#xff1a;693 标注类别数&#xff1a;6 标注类别名称&#xff1a;[missing_hole, mouse_bite, open_circuit, short, spurious_copper, spur…...

实验四:图像的锐化处理

目录 一、实验目的 二、实验原理 1. 拉普拉斯算子 2. Sobel算子 3. 模板大小对滤波的影响 三、实验内容 四、源程序和结果 (1) 主程序(matlab) (2) 函数GrayscaleFilter (3) 函数MatrixAbs 五、结果分析 1. 拉普拉斯滤波 2. Sobel滤波 3. 不同大小模板的滤波…...

【Linux】权限的管理和Linux上的一些工具

文章目录 权限管理chgrpchownumaskfile指令sudo指令 目录权限粘滞位Linux中的工具1.软件包管理器yum2.rzsz Linux开发工具vim 总结 权限管理 chgrp 功能&#xff1a;修改文件或目录的所属组 格式&#xff1a;chgrp [参数] 用户组名 文件名 常用选项&#xff1a;-R 递归修改文…...

ES6 字符串的新增方法(二十)

1. String.prototype.startsWith(searchString, position) 特性&#xff1a;判断字符串是否以指定的子字符串开始。 用法&#xff1a;检查字符串的开始部分。 const str "Hello World"; console.log(str.startsWith("Hello")); // 输出&#xff1a;true…...

如何将MP3或WAV文件解码成PCM文件

文章目录 概要整体架构流程技术细节 概要 本文介绍使用 FFmpeg&#xff0c;将MP3或WAV文件解码成PCM文件的方法。 整体架构流程 首先&#xff0c;使用的 FFmpeg 库要支持 MP3/WAV 解码功能&#xff0c;即编译的时候要加上&#xff08;编译 FFmpeg 库可以参考&#xff1a;Win…...

OpenAI 推出 GPT-4o mini,一种更小、更便宜的人工智能模型

OpenAI 最近推出了新型人工智能模型 GPT-4o mini&#xff0c;以其较小体积和低成本受到关注。这款模型在文本和视觉推理任务上性能优越&#xff0c;且比现有小型模型更快、更经济。GPT-4o mini 已向开发者和消费者发布&#xff0c;企业用户将在下周获得访问权限。 喜好儿网 在…...

Nacos 服务发现(订阅)源码分析(服务端)

前言&#xff1a; 前文我们分析了 Nacos 服务发现&#xff08;订阅&#xff09;的流程&#xff0c;从 Nacos Client 端的源码分析了服务发现的过程&#xff0c;服务发现最终还是要调用 Nacos Server 端来获取服务信息&#xff0c;缓存到客户端本地&#xff0c;并且会定时向 Na…...

DICOM CT\MR片子免费在线查看工具;python pydicom包加载查看;mayavi 3d查看

DICOM CT\MR片子免费在线查看工具 参考&#xff1a; https://zhuanlan.zhihu.com/p/668804209 dicom格式&#xff1a; DICOM&#xff08;Digital Imaging and Communications in Medicine&#xff09;是医学数字成像和通信的标准。它定义了医学图像&#xff08;如CT、MRI、X…...

VSCode远程连接Ubuntu/Linux

文章目录 前言SSH&#xff08;Secure Shell&#xff09;简介主要功能工作原理常见的 SSH 客户端和服务器 Ubuntu安装sshvscode远程插件安装远程插件开始远程连接 打开文件夹新建终端 总结 前言 在现代开发环境中&#xff0c;远程工作和跨平台开发变得越来越普遍。Visual Studi…...

【Nginx80端口被占用】80端口被System占用如何解决【已解决】

【Nginx80端口被占用】80端口被System占用如何解决【已解决】 01 问题背景 Nginx 版本 1.19及以上80端口被System占用&#xff0c;无法kill tcp6 0 0 :::111 :::* LISTEN 1/systemd tcp6 0 0 :::80 :::* LISTEN 1/systemd 执行以下代码无效&…...

云计算的发展历程与边缘计算

云计算的发展历程 初期发展&#xff08;1960s-1990s&#xff09; 概念萌芽&#xff1a;云计算的概念可以追溯到1960年代&#xff0c;当时约翰麦卡锡&#xff08;John McCarthy&#xff09;提出了“计算将来可能成为一种公共设施”的想法。这个概念类似于现代的云计算&#xf…...

如何用3分钟搞定视频字幕提取?揭秘这款本地化硬字幕提取神器

如何用3分钟搞定视频字幕提取&#xff1f;揭秘这款本地化硬字幕提取神器 【免费下载链接】video-subtitle-extractor 视频硬字幕提取&#xff0c;生成srt文件。无需申请第三方API&#xff0c;本地实现文本识别。基于深度学习的视频字幕提取框架&#xff0c;包含字幕区域检测、字…...

任务历史面板:浏览 Claude Code 的完整任务对话、复制提示词、一键切换继续工作

在技术领域&#xff0c;我们常常被那些闪耀的、可见的成果所吸引。今天&#xff0c;这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力&#xff0c;让我们得以一窥未来的轮廓。然而&#xff0c;作为在企业一线构建、部署和维护复杂系统的实践者&#xff0c;我们深知…...

AI Agent配置文件供应链安全:AgentLint静态分析工具实战指南

1. 项目概述与核心价值最近在折腾AI编程助手&#xff0c;比如Claude Code和Cursor&#xff0c;发现它们的配置文件&#xff08;.claude/、CLAUDE.md、.cursorrules&#xff09;功能强大得有点吓人。这些文件不仅能定义代码风格&#xff0c;还能配置“技能”&#xff08;Skills&…...

LMQL:用编程语言精准控制大语言模型输出,告别提示词玄学

1. 项目概述&#xff1a;当自然语言成为编程语言如果你和我一样&#xff0c;既对大型语言模型&#xff08;LLM&#xff09;的能力感到兴奋&#xff0c;又对如何精准、可控地调用它们感到头疼&#xff0c;那么你肯定遇到过这样的场景&#xff1a;你向ChatGPT或Claude提出一个复杂…...

工业HMI系统核心技术解析与TI解决方案实践

1. 工业HMI系统概述人机界面&#xff08;HMI&#xff09;系统是现代工业自动化不可或缺的核心组件&#xff0c;它如同工厂的"神经中枢"&#xff0c;将复杂的机器语言转化为直观的可视化信息。想象一下&#xff0c;当操作员站在一台大型工业设备前&#xff0c;不再需要…...

FPGA仿真库配置避坑指南:Xilinx 7系、Altera Cyclone V、Lattice ECP5在ModelSim 10.6d下的完整流程

FPGA仿真库配置避坑指南&#xff1a;Xilinx 7系、Altera Cyclone V、Lattice ECP5在ModelSim 10.6d下的完整流程 第一次在ModelSim 10.6d环境下配置FPGA仿真库时&#xff0c;我花了整整三天时间排查各种路径错误和权限问题。直到现在&#xff0c;我还清楚地记得那个深夜——当仿…...

数字信号处理中的统计与概率基础解析

1. 数字信号处理中的统计与概率基础 在数字信号处理&#xff08;DSP&#xff09;领域&#xff0c;统计和概率理论构成了分析和处理信号的核心数学工具。信号在采集、传输和处理过程中不可避免地会受到各种干扰和噪声的影响&#xff0c;这些干扰可能来自测量系统本身&#xff0c…...

免费AI聊天机器人部署指南:整合多模型与全栈技术实践

1. 项目概述与核心价值最近在折腾一些AI应用&#xff0c;发现很多朋友都想自己部署一个免费的、功能强大的聊天机器人&#xff0c;但要么被高昂的API费用劝退&#xff0c;要么被复杂的部署流程搞得头大。如果你也有同样的困扰&#xff0c;那么今天聊的这个项目——CNSeniorious…...

LangChain+FAISS 向量数据库搭建轻量化 RAG 应用

&#x1f4dd; 本章学习目标&#xff1a;本章聚焦企业轻量化落地&#xff0c;帮助读者快速掌握基于 LangChainFAISS 的私有化 RAG 开发流程。通过本章学习&#xff0c;你将从零搭建一套无需 GPU、无外网依赖、纯本地运行、代码极简、可直接上线的轻量化 RAG 应用。 一、引言&a…...

为什么你的DeepSeek Terraform配置总在CI/CD中崩溃?5个被官方文档隐藏的state锁机制真相

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;为什么你的DeepSeek Terraform配置总在CI/CD中崩溃&#xff1f;5个被官方文档隐藏的state锁机制真相 DeepSeek 与 Terraform 的深度集成虽提升了 AI 基础设施编排能力&#xff0c;但其 state 锁行为在 …...