恐龙岛--构建字符级语言模型

2024-08-28 21:48

本文主要是介绍恐龙岛--构建字符级语言模型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文是基于吴恩达《深度学习》第五周第一课后练习题所做。

0.背景简介

本练习题中,达叔提出了一个有趣的问题,让我们在现有的已知恐龙名称的基础上创造新的恐龙 ,而且如果所创造的新品恐龙和其外貌不相称的话就会被消灭。主要思路是利用现有的恐龙数据集,构建字符级的语言模型来产生新的名字,算法会学习不同的名字特征,然后产生新的名字。

通过本练习可以实现如下4个目标:

(1)如何使用RNN存储可处理的文本数据;

(2)如何通过在每一时间步采集预测值并将其传递到下一个RNN单元,以实现数据同步;

 (3)如何构建一个字符级的文本生成器来构建RNN;

(4)裁剪梯度值的重要性。

导入所需的第三方库,其中所用辅助程序可点击此处下载。

import numpy as np
from utils import *
import random

1.问题描述

1.1数据集及预处理

从文件中读取恐龙名字数据集,创建一个统一字符列表,计算数据集和字典的大小。

data = open('datasets\dinos.txt').read()
data = data.lower()
chars = list(set(data))
data_size, vocab_size = len(data), len(chars)
print("There are %d total characters and %d unique characters in your data."%(data_size, vocab_size))
There are 19909 total characters and 27 unique characters in your data.

 从打印的输出我们可以看到统一字符一个是27个,这其中包括a-z共26个字符和“\n”,“\n”可以看做是句子结束符号“EOS”。接下来我们创建两个字典,使统一字符和指标index对于,以便我们能够将softmax层输出的概率分布与字符对应起来。

char_to_ix = {ch : i for i,ch in enumerate(sorted(chars))}
ix_to_char = {i : ch for i,ch in enumerate(sorted(chars))}
print(ix_to_char)
{0: '\n', 1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e', 6: 'f', 7: 'g', 8: 'h', 9: 'i', 10: 'j', 11: 'k', 12: 'l', 13: 'm', 14: 'n', 15: 'o', 16: 'p', 17: 'q', 18: 'r', 19: 's', 20: 't', 21: 'u', 22: 'v', 23: 'w', 24: 'x', 25: 'y', 26: 'z'}

1.2模型概览

我们将要建立模型结构如下:

(1)初始化参数;

(2)运行优化循环:

  • 前向传播计算loss
  • 反向传播计算loss的梯度
  • 截断梯度以避免梯度爆炸
  • 使用梯度下降更新参数

(3)返回学习到的参数; 

在RNN的每一个时间步中,模型会根据上一步的字符推测下一步的字符是什么,然后将预测的是y<t> _hat作为下一步的输入。

2.构建2个重要模块

 本小节主要构建截断梯度模块和采样模块。

2.1在优化循环中截取梯度

我们下面将编写一个clip函数实现截取梯度的功能,实现clip的方法很多,在此我们此采用一种简单的按元素处理的方案,对于梯度向量的元素,将其裁剪成[-N, N]的区间范围,假设N=10,当有元素大于10时将这个元素设置成10;同理,当某元素小于-10时将其设置成-10。截取之后的梯度趋势将如下图所示。

 

def clip(gradients, maxValue):dWaa, dWax, dWya, db, dby = gradients['dWaa'], gradients['dWax'], gradients['dWya'], \gradients['db'], gradients['dby']for gradiet in [dWaa, dWax, dWya, db, dby]:np.clip(gradiet, -maxValue, maxValue, out=gradiet)gradiets = {"dWaa": dWaa, "dWax": dWax, "dWya": dWya, "db": db, "dby": dby}return gradiets
np.random.seed(3)
dWax = np.random.randn(5,3)*10
dWaa = np.random.randn(5,5)*10
dWya = np.random.randn(2,5)*10
db = np.random.randn(5,1)*10
dby = np.random.randn(2,1)*10
gradients = {"dWax": dWax, "dWaa": dWaa, "dWya": dWya, "db": db, "dby": dby}
gradients = clip(gradients, 10)
print("gradients[\"dWaa\"][1][2] =", gradients["dWaa"][1][2])
print("gradients[\"dWax\"][3][1] =", gradients["dWax"][3][1])
print("gradients[\"dWya\"][1][2] =", gradients["dWya"][1][2])
print("gradients[\"db\"][4] =", gradients["db"][4])
print("gradients[\"dby\"][1] =", gradients["dby"][1])

这篇关于恐龙岛--构建字符级语言模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1115979

相关文章

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码

Go语言如何判断两张图片的相似度

《Go语言如何判断两张图片的相似度》这篇文章主要为大家详细介绍了Go语言如何中实现判断两张图片的相似度的两种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 在介绍技术细节前,我们先来看看图片对比在哪些场景下可以用得到:图片去重:自动删除重复图片,为存储空间"瘦身"。想象你是一个

Go语言中Recover机制的使用

《Go语言中Recover机制的使用》Go语言的recover机制通过defer函数捕获panic,实现异常恢复与程序稳定性,具有一定的参考价值,感兴趣的可以了解一下... 目录引言Recover 的基本概念基本代码示例简单的 Recover 示例嵌套函数中的 Recover项目场景中的应用Web 服务器中

基于Python构建一个高效词汇表

《基于Python构建一个高效词汇表》在自然语言处理(NLP)领域,构建高效的词汇表是文本预处理的关键步骤,本文将解析一个使用Python实现的n-gram词频统计工具,感兴趣的可以了解下... 目录一、项目背景与目标1.1 技术需求1.2 核心技术栈二、核心代码解析2.1 数据处理函数2.2 数据处理流程

C#如何去掉文件夹或文件名非法字符

《C#如何去掉文件夹或文件名非法字符》:本文主要介绍C#如何去掉文件夹或文件名非法字符的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#去掉文件夹或文件名非法字符net类库提供了非法字符的数组这里还有个小窍门总结C#去掉文件夹或文件名非法字符实现有输入字

Python FastMCP构建MCP服务端与客户端的详细步骤

《PythonFastMCP构建MCP服务端与客户端的详细步骤》MCP(Multi-ClientProtocol)是一种用于构建可扩展服务的通信协议框架,本文将使用FastMCP搭建一个支持St... 目录简介环境准备服务端实现(server.py)客户端实现(client.py)运行效果扩展方向常见问题结

详解如何使用Python构建从数据到文档的自动化工作流

《详解如何使用Python构建从数据到文档的自动化工作流》这篇文章将通过真实工作场景拆解,为大家展示如何用Python构建自动化工作流,让工具代替人力完成这些数字苦力活,感兴趣的小伙伴可以跟随小编一起... 目录一、Excel处理:从数据搬运工到智能分析师二、PDF处理:文档工厂的智能生产线三、邮件自动化:

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

SpringBoot整合Sa-Token实现RBAC权限模型的过程解析

《SpringBoot整合Sa-Token实现RBAC权限模型的过程解析》:本文主要介绍SpringBoot整合Sa-Token实现RBAC权限模型的过程解析,本文给大家介绍的非常详细,对大家的学... 目录前言一、基础概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 环境准备二、表结

Go语言中使用JWT进行身份验证的几种方式

《Go语言中使用JWT进行身份验证的几种方式》本文主要介绍了Go语言中使用JWT进行身份验证的几种方式,包括dgrijalva/jwt-go、golang-jwt/jwt、lestrrat-go/jw... 目录简介1. github.com/dgrijalva/jwt-go安装:使用示例:解释:2. gi