2021-1-2 吴恩达-C5 序列模型-w1 循环序列模型(课后编程2-Character level language model-Dinosaurus Island 字符级语言模型-恐龙岛)

本文主要是介绍2021-1-2 吴恩达-C5 序列模型-w1 循环序列模型(课后编程2-Character level language model-Dinosaurus Island 字符级语言模型-恐龙岛),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文链接
如果打不开,也可以复制链接到https://nbviewer.jupyter.org中打开。

循环序列模型 Character level language model-Dinosaurus Island 字符级语言模型-恐龙岛

  • 1 问题描述
    • 1.1 数据集和预处理
    • 1.2 模型概述
  • 2 构建模型中的模块
    • 2.1 梯度修剪
    • 2.2 采样
  • 3 构建语言模型
    • 3.1 梯度下降
    • 3.2 训练模型
  • 4 像莎士比亚那样写作
  • 5 全代码

欢迎来到恐龙岛!6500万年前,恐龙就存在了,在这次任务中它们又回来了。
你负责一项特殊任务。生物学研究人员正在创造新的恐龙品种,并将它们带到地球上,而你的工作就是给这些恐龙命名。如果一只恐龙不喜欢它的名字,它可能会发疯,所以明智地选择!
在这里插入图片描述

幸运的是,你学到了一些DL的知识,你将用它来避免起错名字。你的助手收集了一份他们能找到的所有恐龙名字的列表,并将它们汇编到这个数据集中。(点击前面的链接可以随意查看。)要创建新的恐龙名称,你将构建一个字符级语言模型来生成新名称。你的算法将学习不同的名称模式,并随机生成新名称。希望这个算法能让你和你的团队远离恐龙的愤怒!

完成本练习,你将学到

  • 如何存储文本数据以便使用RNN进行处理。
  • 如何通过在每个时间步对预测进行采样并将其传递给下一个RNN单元来合成数据
  • 如何构建字符级文本生成RNN
  • 为什么梯度修剪很重要?

我们将首先加载在rnn_utils中为你提供的一些函数。具体来说,您可以访问诸如rnn_forward和rnn_backward 之类的函数,这些函数等同于你在上一个任务中实现的函数。

import numpy as np
from utils import *
import random
from random import shuffle

1 问题描述

1.1 数据集和预处理

运行以下代码以读取恐龙名称的数据集,创建唯一字符(如a-z)的列表,并计算数据集和词汇表大小。

data = open('dinos.txt', 'r').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.

字符是a-z(26个字符)加上“\n”(或换行符),在本作业中,它起着类似于我们在课程中讨论的(或“句尾”)标记的作用,只是在这里它表示恐龙名称的结尾,而不是句子的结尾。

在下面的代码中,我们创建一个python字典(即哈希表),将每个字符映射到0-26之间的索引。
我们还创建了第二个python字典,将每个索引映射回相应的字符。
这将帮助你找出哪个索引对应于softmax层的概率分布输出中的哪个字符。
在下面,char_to_ix和ix_to_char是python字典。

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 模型概述

你的模型将具有以下结构:

  • 初始化参数
  • 运行优化循环
    • 前向传播计算损失
    • 反向传播计算关于损失的梯度
    • 修剪梯度以免梯度爆炸
    • 用梯度下降更新规则更新参数
  • 返回学习好的参数

在这里插入图片描述
在每一个时间步,RNN都试图预测给定一个字符的下一个字符是什么。
数据集 X = ( x ⟨ 1 ⟩ , x ⟨ 2 ⟩ , . . . , x ⟨ T x ⟩ ) X = (x^{\langle 1 \rangle}, x^{\langle 2 \rangle}, ..., x^{\langle T_x \rangle}) X=(x1,x2,...,xTx)是一个列表类型的字符训练集,同时 Y = ( y ⟨ 1 ⟩ , y ⟨ 2 ⟩ , . . . , y ⟨ T x ⟩ ) Y = (y^{\langle 1 \rangle}, y^{\langle 2 \rangle}, ..., y^{\langle T_x \rangle}) Y=(y1,y2,...,yTx)在每个时间步 t t t亦是如此,因此, y ⟨ t ⟩ = x ⟨ t + 1 ⟩ y^{\langle t \rangle} = x^{\langle t+1 \rangle} yt=xt+1

2 构建模型中的模块

在本部分中,你将构建整个模型的两个重要模块

  • 梯度修剪:避免梯度爆炸
  • 取采样:一种用来产生字符的技术

然后应用这两个函数来构建模型。

2.1 梯度修剪

本节中你将实现一个clip函数,它将在优化循环中被调用。回想一下,你的整个循环结构通常由前向传播、成本计算、反向传博和参数更新组成。在更新参数之前,你将在需要时执行梯度剪裁,以确保梯度不会“爆炸”,这意味着使用过大的值。

在下面的练习中,你将实现一个函数clip,它输入梯度字典,并在需要时输出梯度的剪裁版本。有不同的方法来剪裁梯度;我们将使用一个简单的按元素剪裁的过程,其中梯度向量的每个元素都被剪裁到某个范围[-N,N]之间。一般来说,你将提供一个maxValue(比如10)。在本例中,

  • 如果梯度向量的任何分量大于10,则将其设置为10;
  • 如果梯度向量的任何分量小于-10,则将其设置为-10。
  • 如果它在-10和10之间,它不变。

在这里插入图片描述

练习:实现下面的函数返回你的裁剪后的梯度字典gradients。你的函数接受最大阈值并返回梯度的剪裁版本。你可以查看这个提示,了解如何在numpy中进行剪辑的示例

实现代码

### GRADED FUNCTION: clipdef clip(gradients, maxValue):'''Clips the gradients' values between minimum and maximum.使用maxValue来修剪梯度Arguments:gradients -- a dictionary containing the gradients "dWaa", "dWax", "dWya", "db", "dby"字典类型,包含了以下参数:"dWaa", "dWax", "dWya", "db", "dby"maxValue -- everything above this number is set to this number, and everything less than -maxValue is set to -maxValue阈值,把梯度值限制在[-maxValue, maxValue]内Returns: gradients -- a dictionary with the clipped gradients. 修剪后的梯度'''# 获取参数dWaa, dWax, dWya, db, dby = gradients['dWaa'], gradients['dWax'], gradients['dWya'], gradients['db'], gradients['dby']### START CODE HERE #### clip to mitigate exploding gradients, loop over [dWax, dWaa, dWya, db, dby]. (≈2 lines)# 梯度修剪for gradient in [dWax, dWaa, dWya, db, dby]:np.clip(gradient, -maxValue, maxValue, out=gradient)### END CODE HERE ###gradients = {"dWaa": dWaa, "dWax": dWax, "dWya": dWya, "db": db, "dby": dby}return gradients

测试一下

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 = {

这篇关于2021-1-2 吴恩达-C5 序列模型-w1 循环序列模型(课后编程2-Character level language model-Dinosaurus Island 字符级语言模型-恐龙岛)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

Java中的for循环高级用法

《Java中的for循环高级用法》本文系统解析Java中传统、增强型for循环、StreamAPI及并行流的实现原理与性能差异,并通过大量代码示例展示实际开发中的最佳实践,感兴趣的朋友一起看看吧... 目录前言一、基础篇:传统for循环1.1 标准语法结构1.2 典型应用场景二、进阶篇:增强型for循环2.

Go语言代码格式化的技巧分享

《Go语言代码格式化的技巧分享》在Go语言的开发过程中,代码格式化是一个看似细微却至关重要的环节,良好的代码格式化不仅能提升代码的可读性,还能促进团队协作,减少因代码风格差异引发的问题,Go在代码格式... 目录一、Go 语言代码格式化的重要性二、Go 语言代码格式化工具:gofmt 与 go fmt(一)

Python循环结构全面解析

《Python循环结构全面解析》循环中的代码会执行特定的次数,或者是执行到特定条件成立时结束循环,或者是针对某一集合中的所有项目都执行一次,这篇文章给大家介绍Python循环结构解析,感兴趣的朋友跟随... 目录for-in循环while循环循环控制语句break语句continue语句else子句嵌套的循

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现

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

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

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

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

Go语言中Recover机制的使用

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

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

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