【古诗生成AI实战】之五——加载模型进行古诗生成

  回顾上一篇博客,我们已经成功地训练了我们的模型,并将其保存下来。这是一个重要的里程碑,因为训练好的模型是我们进行文本生成的基础。

  现在,接下来的步骤是加载这个训练好的模型,然后使用它来生成古诗。

  本章的内容属于文本生成阶段。在这一阶段,我将详细介绍古诗生成的代码实现。这部分是项目中非常激动人心的一环,因为我们将看到我们的模型如何利用先前学习的知识来创造出新的古诗文本。让我们一起深入探索古诗生成的过程,并理解背后的技术细节。

在这里插入图片描述

[1] 开始生成

  生成的代码仍然和模型训练很相像,只是在文本生成时需要额外写些代码。整体代码如下:

def create_trainer(wrapper):# 分词器, 模型model = wrapper.modelargs = TrainingArguments('./checkpoints',  # 模型保存的输出目录per_device_train_batch_size=1,per_device_eval_batch_size=1,)trainer = Trainer(model,args)return trainerdef softmax( f ):# 坏的实现: 数值问题return np.exp(f) / np.sum(np.exp(f))def main():# ### @通用配置# ##with open('config.yaml', 'r', encoding='utf-8') as f:conf = yaml.load(f.read(), Loader=yaml.FullLoader)conf_pre = conf['pre']conf_sys = conf['sys']# 系统设置初始化System(conf_sys).init_system()# 初始化任务加载器Task = TASKS[conf_pre['task_name']]()data = Task.get_train_examples(conf_pre['dataset_url'])# 初始化数据预处理器Processor = PROCESSORS[conf_pre['task_name']](data, conf_pre['max_seq_len'], conf_pre['vocab_path'])tokenizer = lambda text: Processor.tokenizer(text, add_end=False)vocab = Processor.vocab# 初始化模型包装配置wrapper_config = WrapperConfig(tokenizer=tokenizer,max_seq_len=conf_pre['max_seq_len'],vocab_num=len(Processor.vocab),word2vec_path=conf_pre['word2vec_path'])x = import_module(f'main.model.{conf_pre["model_name"]}')wrapper = NNModelWrapper(wrapper_config, x.Model)trainer = create_trainer(wrapper)wrapper.model.load_state_dict(torch.load(conf_pre['model_save_dir'] + conf_pre['task_name'] + '/' + conf_pre['model_name'] + '/' + 'pytorch_model.bin', map_location=torch.device('cpu')))poem = '天'l = len(poem)for i in range(l, 32):test_data = Task.get_single_examples(poem)test_dataset = wrapper.generate_dataset(test_data, labeled=False)output = trainer.predict(test_dataset=test_dataset)[0][0]# 逐字生成pred = output[i]pred = softmax(pred)pred /= np.sum(pred)sample = np.random.choice(np.arange(len(pred)), p=pred)# sample = np.argmax(pred)if sample > len(vocab):new_word = ' 'else:# vocab通过键查找keynew_word = vocab[sample]poem += new_wordprint(poem)

  在这部分内容中,我们将探讨如何使用预训练的模型来生成文本,例如古诗。整个过程包括以下步骤:

  * 从config.yaml文件中加载配置。
  * 初始化系统设置和任务加载器task
  * 加载数据并初始化数据预处理器processor
  * 创建模型包装配置WrapperConfig
  * 动态加载模型类并创建NNModelWrapper实例。
  * 创建训练器trainer,用于预测。
  * 加载预训练的模型权重。
  * 生成文本:从初始文本(例如“天”)开始,逐字生成新的文本,直到达到指定长度(如32个字符)。

  在文本生成部分,关键步骤包括:
  * 使用模型预测下一个字符的概率分布。
  * 应用softmax函数得到标准化的概率分布。
  * 从概率分布中随机抽取下一个字符(或选择概率最高的字符)。
  * 将新字符添加到现有文本中,并重复上述过程。

[2] 生成模式

  在古诗生成的过程中,我们可以采用几种不同的生成模式:

  1. 补词生成:输入古诗的前几个字,然后让模型补齐剩余部分。
  2. 无词生成:不输入任何前缀,直接让模型生成完整的古诗。
  3. 藏头诗:输入四个字ABCD,手动在第1、9、17、25个位置赋值A、B、C、D,其余部分由模型生成。

[3] 展望

在这里插入图片描述

  在评价生成的古诗质量时,我们需要考虑以下几个关键因素:

  · 语境连贯(Context Coherence):生成的文本应逻辑上与上下文相符,并贯穿始终保持一致性。
  · 主题相关(Topic Relevance):内容应与预定的主题或主旨相关。
  · 新颖性(Novelty):文本应引入新颖、创造性或创新元素。
  · 风格化(Stylization):文本应展示特定的风格或审美质量。
  · 情感化(Sentimentalization):文本应有效且恰当地表达情感。

  高质量的文本生成,尤其是在诗歌这样的创意领域,不仅仅是串联词语那么简单。它必须在语境连贯、主题相关、创新性、风格和情感深度等多个层面上产生共鸣。

  本实战项目只提供了基础的古诗生成功能,在以上这些注意点上并没有过多探究。如果想更进一步研究和提升生成文本的质量,可以参考相关的学术论文进行深入研究。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/172626.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023年网络安全比赛--综合渗透测试②(超详细)

一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 1.通过 PC 中的渗透测试平台 Kali 对服务器场景进行渗透测试,将扫描开放的所有端口当作flag提交(例:21,22,23); 2.通过 PC 中的渗透测试平台 Kali 对服务器场景进行渗透测试,将初…

人工智能-优化算法和深度学习

优化和深度学习 对于深度学习问题,我们通常会先定义损失函数。一旦我们有了损失函数,我们就可以使用优化算法来尝试最小化损失。在优化中,损失函数通常被称为优化问题的目标函数。按照传统惯例,大多数优化算法都关注的是最小化。…

计算机图形学-变换基础

坐标系转换历程模型坐标系 -> 世界坐标系 -> 摄像机坐标系 -> 视口(屏幕)坐标系 变换 仿射变换和线性变换线性:旋转 缩放 镜像 切变放射: 平移 平移 2D变换矩阵 3D变换矩阵 旋转 2D旋转矩阵 //2D 旋转private (float,…

【docker系列】docker命令篇

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

中科亿海微除法器(DIVIDE)

技术背景 技术概述 FPGA实现除法运算是一个比较复杂的过程,因为硬件逻辑与软件程序的区别。如果其中一个操作数为常数,可以通过简单的移位与求和操作代替,但用硬件逻辑完成两变量间除法运算会占用较多的资源,电路结构复杂&#xf…

【虚拟机Ubuntu 18.04配置网络】

虚拟机Ubuntu 18.04配置网络 1.配置网络连接方式,查看自己网关 2.修改主机名 3.修改系统配置1.配置网络连接方式,查看自己网关 选择虚拟机镜像设置网络连接模式,可以选择桥接或者NAT连接(我这里选择是NAT连接) 确定自己网关,可以在虚拟机 -》 编辑 -》虚拟网络编…

Android 10.0 mtp模式下连接pc后显示的文件夹禁止删除copy重命名功能实现

1.前言 在10.0的系统开发中,usb连接pc端的时候有好几种模式,在做otg连接pc端的时候,改成mtp模式的时候,在pc端可以看到产品设备 的显示的文件夹的内容,对于产品设备里面的文件在pc端禁止做删除重命名拷贝等操作功能的实现 2.mtp模式下连接pc后显示的文件夹禁止删除copy重命…

【计算机视觉】【图像处理综合应用】路沿检测

实验内容:针对给定的视频,利用图像处理基本方法实现道路路沿的检测; 提示:可利用Hough变换进行线检测,融合路沿的结构信息实现路沿边界定位(图中红色的点位置)。 处理视频文件 处理视频文件的主…

springboot函数式web

1.通常是路由(请求路径)业务 2.函数式web:路由和业务分离 一个configure类 配置bean 路由等 实现业务逻辑 这样实现了业务和路由的分离

Spring MVC程序开发

所谓的Spring MVC程序开发,其实也是一个Spring Boot项目。 MVC是Model View Controller的缩写,它是软件工程中的一种软件架构模式,它把软件系统分为模型,视图,控制器三个部分。 项目使用什么技术实现的?&a…

【nowcoder】BM3 链表中的节点每k个一组翻转

题目: 题目分析: 题目解析转载: 代码实现: package BMP3;import java.util.List;class ListNode {int val;ListNode next null;public ListNode(int val) {this.val val;} } public class BM3 {/*** 代码中的类名、方法名、参…

一般将来时

一般将来时 概念 表示将要发生的动作或打算、计划准备做某事 时间 tomorrow 明天 the day after tomorrow 后天 next week 下周 next weekend 下周末 next month 下个月 next year 明年 ...句子结构 主语 be(am/is/are)going to do … 计划,…

B树你需要了解一下

介绍B树的度数主要特点应用场景时间复杂度代码示例拓展 介绍 B树(B-tree)是一种自平衡的树,能够保持数据有序,常被用于数据库和文件系统的实现。 B树可以看作是一般化的二叉查找树,它允许拥有多于2个子节点。与自平衡…

2023.11.25 关于 MyBatis 的配置与使用

目录 引言 MyBatis 介绍 掌握两个点 在框架中的定位 创建数据库 配置 MyBatis 引入依赖 配置文件 创建实体类 构建 Mapper 层代码实现 添加 mapper 接口 添加 UserMapper.xml 实现 Service 层 实现 Controller 层 最终测验 阅读下面文章之前建议了解并创建…

树状数组专题

折叠 区间修改,区间查询,这一类题通常都可以使用线段树解决,但对于此题,树状数组同样可以,而且常数较小,代码简单。 思路: 考虑使用树状数组去维护差分数组,即对于 a i a_i ai​,我们…

使用qemu调试arm内核

参考书籍《奔跑吧Linux内核》–笨叔 下载Linux-5.0源码 https://benshushu.coding.net/public/runninglinuxkernel_5.0/runninglinuxkernel_5.0/git/files或者直接git源码 git clone https://e.coding.net/benshushu/runninglinuxkernel_5.0/runninglinuxkernel_5.0.git安装必…

【React】Memo

组件重新渲染时缓存计算的结果。 实例:count1计算斐波那契数列,count2和count1可以触发数值变化。使用memo可以使只有在count1变化时触发斐波那契数列计算函数,而count2变化时不触发斐波那契数列计算函数。 import { useMemo } from "r…

SpringCloud微服务网关Gateway:gateway基本实现、断言工厂、过滤器工厂、浏览器同源策略、跨域问题解决方案

Gateway网关 Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0和Project Reactor 等响应式编程和事件流技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API路由管理方式 为什么…

【面试题】介绍一下类加载过程,什么是双亲委派模型

背景 java 文件在运行之前,必须经过编译和类加载两个过程: 编译过程:把 .java 文件 编译成 .class 文件类加载过程:把 .class 文件加载到 JVM 内存里,加载完成后就会得到一个 class 对象,我们就可以使用 n…

Vue快速实践总结 · 上篇

文章目录 模板语法数据绑定事件处理计算属性监视属性(监听器)条件渲染列表渲染数据监视原理内置指令总结生命周期组件化编程组件使用步骤组件的嵌套this指向单文件组件ref、props 脚手架(Vue CLI)render函数 参考自己的Vue专栏以及Vue官方文档 模板语法 …