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

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

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

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

在这里插入图片描述

[1] 开始生成

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

def create_trainer(wrapper):
    # 分词器, 模型
    model = wrapper.model

    args = TrainingArguments(
        './checkpoints',  # 模型保存的输出目录
        per_device_train_batch_size=1,
        per_device_eval_batch_size=1,
    )

    trainer = Trainer(
        model,
        args
    )
    return trainer

def 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通过键查找key
            new_word = vocab[sample]
        poem += new_word

    print(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):文本应有效且恰当地表达情感。

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

打印菱形-第11届蓝桥杯选拔赛Python真题精选

[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第9讲。 打印菱形&#xff…

Android 虚拟机与类加载机制

1、Dalvik 虚拟机 Android 应用程序运行在 Dalvik/Art 虚拟机上,并且每一个应用程序都有一个单独的 Dalvik/Art 虚拟机实例。 1.1 JVM 与 Dalvik Dalvik 虚拟机也算是一个 Java 虚拟机,它是按照 JVM 虚拟机规范实现的,二者的特性差不多&am…

爬楼梯(力扣LeetCode)动态规划

爬楼梯 题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n 2 输出:2 解释:有两种方法可以爬到楼顶。 1 阶 1 阶2 阶 示…

树状数组专题

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

找不到vcomp120.dll该如何修复?vcomp120.dll丢失的5个可行解决方法

本文将对vcomp120.dll文件的丢失原因进行详细分析,并提供五个有效的修复方法。同时,本文还将深入介绍vcomp120.dll文件的作用及其在程序运行中的重要性。 一、vcomp120.dll文件丢失原因 操作系统损坏:由于病毒感染、系统错误等原因&#xf…

linux复习笔记04(小滴课堂)

软件安装rpm方式介绍: 先去挂载光盘: 要确保这是已连接状态。 我们查看到已经挂载成功了。 进到这个目录下。 我们可以看到这有很多rpm软件包。 man rpm: 可以看到很多参数,但是我们不需要全部掌握。 举例: 这就是告诉我们需要安…

docker (简介、dcoker详细安装步骤)- day01

一、 为什么出现 Docker是基于Go语言实现的云开源项目。 Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应…

WiFi的CSMA/CA竞争窗口流程简述

1、若站点最初有数据要发送(不是发送不成功再进行重传的那种),且检测到信道空闲,在等待DIFS后,就发送整个数据帧。 2、否则,站点执行退避算法。一旦检测到信道忙,就冻结退避计时器。只要信道空…

深度学习之循环神经网络

视频链接:6 循环神经网络_哔哩哔哩_bilibili 给神经网络增加记忆能力 对全连接层而言,输入输出的维数固定,因此无法处理序列信息 对卷积层而言,因为卷积核的参数是共享的,所以卷积操作与序列的长度无关。但是因为卷积…

北塞浦路斯土耳其共和国关于成立欧洲数字股票交易所企业交流会

在地中海的温暖波涛中,北塞浦路斯土耳其共和国这个古老而充满活力的国家正成为全球关注的焦点。2023年11月22日至11月24日,为期三天的北塞浦路斯土耳其共和国关于成立欧洲数字股票交易所企业交流会隆重谢幕,北塞副总统,经济部长&a…

【学习记录】从0开始的Linux学习之旅——驱动模块编译与加载

一、概述 Linux操作系统通常是基于Linux内核,并结合GNU项目中的工具和应用程序而成。Linux操作系统支持多用户、多任务和多线程,具有强大的网络功能和良好的兼容性。本文主要讲述如何编译及加载linux驱动模块。 二、概念及原理 应用程序通过系统调用与内…

STK Components 二次开发-创建地面站

1.地面站只需要知道地面站的经纬高。 // Define the location of the facility using cartographic coordinates.var location new Cartographic(Trig.DegreesToRadians(-75.596766667), Trig.DegreesToRadians(40.0388333333), 0.0); 2.创建地面站 创建方式和卫星一样生成对…

【开源】基于Vue+SpringBoot的食品生产管理系统

项目编号: S 044 ,文末获取源码。 \color{red}{项目编号:S044,文末获取源码。} 项目编号:S044,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 加工厂管理模块2.2 客户管理模块2.3…

UE5人物残影学习(材质实现)

学习视频 UE4简单的材质球残影人教学,你学会了吗!_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1rY411q7Yb/?spm_id_from333.788.top_right_bar_window_history.content.click 结果预览 1.创建残值,混合模式勾选半透明 “混合模…

Qt4利用MVC开发曲线数据编辑器

目录 1 需求 2 开发流程 1 搭建框架 2 构造函数 3 打开工程 4 实现应用程序参数加载 5 QCustomPlot和TableView的联动 6 数据的可视化修改 7 列表点击事件事先键盘控制 8 表格实现复制,粘贴,删除等一系列功能 9 曲线实现自适应范围和统一范围…

MyBatis插入操作返回主键报错问题记录

一开始用直接传参数的方法写的插入操作 StudentMapper.java接口 Integer insertStudent(Param("sname") String name,Param("sage") int age); 然后在网上搜了返回主键的方法 StudentMapper.xml: <insert id"insertStudent" useGenerat…

CAN通信协议

CAN 文章目录 CAN前言一、什么是CAN二、CAN的用途三、CAN协议简解1.can的通信过程1.1空闲状态1.2.起始状态1.3 仲裁机制1.4 位时序 前言 前面学了232、485、IIC、SPI等通信协议&#xff0c;还有一个强大的协议CAN&#xff0c;值得记录一下 一、什么是CAN CAN是Controller Ar…

爬取极简壁纸

js反编译的代码需要解密之类的&#xff0c;直接给我干蒙圈了&#xff0c;借助selenium可以直接获取到调式工具中的源码&#xff0c;可以获取渲染后的链接&#xff0c;然后将链接交给下载函数&#xff08;使用异步提高效率&#xff09;即可。 后续学习完js反编译的话&#xff0…

Unity-链接MySql8.0

链接MySql8.0 1.准备dll 一、找到l18N相关的dll 这里给出一个参考地址 D:\Unity\2020.3.48f1c1\Editor\Data\MonoBleedingEdge\lib\mono\unityjit在里面找到如下图的四个dll 二、下载数据库链接dll https://downloads.mysql.com/archives/c-net/在这里搜索历史版本(Archiv…

AIGC ChatGPT4总结Linux Shell命令集合

在Linux中,Shell命令的数量非常庞大,因为Linux提供了各种各样的命令来处理系统任务。这些命令包括GNU核心工具集、系统命令、shell内置命令以及通过安装获得的第三方应用程序命令。以下是一些常见的Linux命令分类及其示例,但请注意,这不是一个全面的列表,因为列出所有命令…