RNN:文本生成

本文涉及的产品
NLP 自学习平台,3个模型定制额度 1个月
NLP自然语言处理_基础版,每接口每天50万次
NLP自然语言处理_高级版,每接口累计50万次
简介: RNN:文本生成

采用RNN和unicode分词进行文本生成

一、完整代码

这里我们使用tensorflow实现,代码如下:

# 完整代码在这里
import tensorflow as tf
import keras_nlp
import numpy as np
tokenizer = keras_nlp.tokenizers.UnicodeCodepointTokenizer(vocabulary_size=400)
# tokens - ids
ids = tokenizer(['Why are you so funny?', 'how can i get you'])
# ids - tokens
tokenizer.detokenize(ids)
def split_input_target(sequence):
    input_text = sequence[:-1]
    target_text = sequence[1:]
    return input_text, target_text
# 准备数据
text = open('./shakespeare.txt', 'rb').read().decode(encoding='utf-8')
dataset = tf.data.Dataset.from_tensor_slices(tokenizer(text))
dataset = dataset.batch(64, drop_remainder=True)
dataset = dataset.map(split_input_target).batch(64)
input, ouput = dataset.take(1).get_single_element()
# 定义模型
d_model = 512
rnn_units = 1025
class CustomModel(tf.keras.Model):
    def __init__(self, vocabulary_size, d_model, rnn_units):
        super().__init__(self)
        self.embedding = tf.keras.layers.Embedding(vocabulary_size, d_model)
        self.gru = tf.keras.layers.GRU(rnn_units, return_sequences=True, return_state=True)
        self.dense = tf.keras.layers.Dense(vocabulary_size, activation='softmax')
    def call(self, inputs, states=None, return_state=False, training=False):
        x = inputs
        x = self.embedding(x)
        if states is None:
            states = self.gru.get_initial_state(x)
        x, states = self.gru(x, initial_state=states, training=training)
        x = self.dense(x, training=training)
        if return_state:
            return x, states
        else:
            return x
model = CustomModel(tokenizer.vocabulary_size(), d_model, rnn_units)
# 查看模型结构
model(input)
model.summary()
# 模型配置
model.compile(
    loss = tf.losses.SparseCategoricalCrossentropy(),
    optimizer='adam',
    metrics=['accuracy']
)
# 模型训练
model.fit(dataset, epochs=3)
# 模型推理
class InferenceModel(tf.keras.Model):
    def __init__(self, model, tokenizer):
        super().__init__(self)
        self.model = model
        self.tokenizer = tokenizer
    def generate(self, inputs, length, return_states=False):
        inputs = inputs = tf.constant(inputs)[tf.newaxis]
        
        states = None
        input_ids = self.tokenizer(inputs).to_tensor()
        outputs = []
        for i in range(length):
            predicted_logits, states = model(inputs=input_ids, states=states, return_state=True)
            input_ids = tf.argmax(predicted_logits, axis=-1)
            outputs.append(input_ids[0][-1].numpy())
        outputs = self.tokenizer.detokenize(lst).numpy().decode('utf-8')
        if return_states:
            return outputs, states
        else:
            return outputs
infere = InferenceModel(model, tokenizer)
# 开始推理
start_chars = 'hello'
outputs = infere.generate(start_chars, 1000)
print(start_chars + outputs)

二、过程实现

2.1 导包

先导包tensorflow, keras_nlp, numpy

import tensorflow as tf
import keras_nlp
import numpy as np

2.2 数据准备

数据来自莎士比亚的作品 storage.googleapis.com/download.tensorflow.org/data/shakespeare.txt;我们将其下载下来存储为shakespeare.txt

2.3 字符分词

这里我们使用unicode分词:将所有字符都作为一个词来进行分词

tokenizer = keras_nlp.tokenizers.UnicodeCodepointTokenizer(vocabulary_size=400)
# tokens - ids
ids = tokenizer(['Why are you so funny?', 'how can i get you'])
# ids - tokens
tokenizer.detokenize(ids)

2.4 构建数据集

利用tokenizertext数据构建数据集

def split_input_target(sequence):
    input_text = sequence[:-1]
    target_text = sequence[1:]
    return input_text, target_text
text = open('./shakespeare.txt', 'rb').read().decode(encoding='utf-8')
dataset = tf.data.Dataset.from_tensor_slices(tokenizer(text))
dataset = dataset.batch(64, drop_remainder=True)
dataset = dataset.map(split_input_target).batch(64)
input, ouput = dataset.take(1).get_single_element()

2.5 定义模型

d_model = 512
rnn_units = 1025
class CustomModel(tf.keras.Model):
    def __init__(self, vocabulary_size, d_model, rnn_units):
        super().__init__(self)
        self.embedding = tf.keras.layers.Embedding(vocabulary_size, d_model)
        self.gru = tf.keras.layers.GRU(rnn_units, return_sequences=True, return_state=True)
        self.dense = tf.keras.layers.Dense(vocabulary_size, activation='softmax')
    def call(self, inputs, states=None, return_state=False, training=False):
        x = inputs
        x = self.embedding(x)
        if states is None:
            states = self.gru.get_initial_state(x)
        x, states = self.gru(x, initial_state=states, training=training)
        x = self.dense(x, training=training)
        if return_state:
            return x, states
        else:
            return x
model = CustomModel(tokenizer.vocabulary_size(), d_model, rnn_units)
# 查看模型结构
model(input)
model.summary()

2.6 模型训练

model.compile(
    loss = tf.losses.SparseCategoricalCrossentropy(),
    optimizer='adam',
    metrics=['accuracy']
)
model.fit(dataset, epochs=3)

2.7 模型推理

定义一个InferenceModel进行模型推理配置;

class InferenceModel(tf.keras.Model):
    def __init__(self, model, tokenizer):
        super().__init__(self)
        self.model = model
        self.tokenizer = tokenizer
    def generate(self, inputs, length, return_states=False):
        inputs = inputs = tf.constant(inputs)[tf.newaxis]
        
        states = None
        input_ids = self.tokenizer(inputs).to_tensor()
        outputs = []
        for i in range(length):
            predicted_logits, states = model(inputs=input_ids, states=states, return_state=True)
            input_ids = tf.argmax(predicted_logits, axis=-1)
            outputs.append(input_ids[0][-1].numpy())
        outputs = self.tokenizer.detokenize(lst).numpy().decode('utf-8')
        if return_states:
            return outputs, states
        else:
            return outputs
infere = InferenceModel(model, tokenizer)
start_chars = 'hello'
outputs = infere.generate(start_chars, 1000)
print(start_chars + outputs)

生成结果如下所示,感觉很差:

hellonofur us:
medous, teserwomador.
walled o y.
as
t aderemowate tinievearetyedust. manonels,
w?
workeneastily.
watrenerdores aner'shra
palathermalod, te a y, s adousced an
ptit: mamerethus:
bas as t: uaruriryedinesm's lesoureris lares palit al ancoup, maly thitts?
b veatrt
watyeleditenchitr sts, on fotearen, medan ur
tiblainou-lele priniseryo, ofonet manad plenerulyo
thilyr't th
palezedorine.
ti dous slas, sed, ang atad t,
wanti shew.
e
upede wadraredorenksenche:
wedemen stamesly ateara tiafin t t pes:
t: tus mo at
io my.
ane hbrelely berenerusedus' m tr;
p outellilid ng
ait tevadwantstry.
arafincara, es fody
'es pra aluserelyonine
pales corseryea aburures
angab:
sunelyothe: s al, chtaburoly o oonis s tioute tt,
pro.
tedeslenali: s 't ing h
sh, age de, anet: hathes: s es'tht,
as:
wedly at s serinechamai:
mored t.
t monatht t athoumonches le.
chededondirineared
t
er
p y
letinalys
ani
aconen,
t rs:
t;et, tes-
luste aly,
thonort aly one telus, s mpsantenam ranthinarrame! a
pul; bon
s fofuly

三、整体总结

RNN结合unicode分词能进行文本生成但是效果一言难尽!


目录
相关文章
|
6月前
|
机器学习/深度学习 自然语言处理 TensorFlow
tensorflow循环神经网络(RNN)文本生成莎士比亚剧集
我们将使用 Andrej Karpathy 在《循环神经网络不合理的有效性》一文中提供的莎士比亚作品数据集。给定此数据中的一个字符序列 (“Shakespear”),训练一个模型以预测该序列的下一个字符(“e”)。通过重复调用该模型,可以生成更长的文本序列。
124 0
|
机器学习/深度学习 自然语言处理 TensorFlow
Char RNN原理介绍以及文本生成实践
Char-RNN,字符级循环神经网络,出自于Andrej Karpathy写的The Unreasonable Effectiveness of Recurrent Neural Networks。众所周知,RNN非常擅长处理序列问题。序列数据前后有很强的关联性,而RNN通过每个单元权重与偏置的共享以及循环计算(前面处理过的信息会被利用处理后续信息)来体现。Char-RNN模型是从字符的维度上,让机器生成文本,即通过已经观测到的字符出发,预测下一个字符出现的概率,也就是序列数据的推测。现在网上介绍的用深度学习写歌、写诗、写小说的大多都是基于这个方法。
207 0
Char RNN原理介绍以及文本生成实践
|
机器学习/深度学习 文字识别 算法
DL之CNN:基于CNN-RNN(GRU,2)算法(keras+tensorflow)实现不定长文本识别
DL之CNN:基于CNN-RNN(GRU,2)算法(keras+tensorflow)实现不定长文本识别
|
5月前
|
机器学习/深度学习
【从零开始学习深度学习】33.语言模型的计算方式及循环神经网络RNN简介
【从零开始学习深度学习】33.语言模型的计算方式及循环神经网络RNN简介
【从零开始学习深度学习】33.语言模型的计算方式及循环神经网络RNN简介
|
28天前
|
机器学习/深度学习 数据采集 存储
时间序列预测新突破:深入解析循环神经网络(RNN)在金融数据分析中的应用
【10月更文挑战第7天】时间序列预测是数据科学领域的一个重要课题,特别是在金融行业中。准确的时间序列预测能够帮助投资者做出更明智的决策,比如股票价格预测、汇率变动预测等。近年来,随着深度学习技术的发展,尤其是循环神经网络(Recurrent Neural Networks, RNNs)及其变体如长短期记忆网络(LSTM)和门控循环单元(GRU),在处理时间序列数据方面展现出了巨大的潜力。本文将探讨RNN的基本概念,并通过具体的代码示例展示如何使用这些模型来进行金融数据分析。
178 2
|
5月前
|
机器学习/深度学习 自然语言处理 算法
RNN-循环神经网络
自然语言处理(Nature language Processing, NLP)研究的主要是通过计算机算法来理解自然语言。对于自然语言来说,处理的数据主要就是人类的语言,我们在进行文本数据处理时,需要将文本进行数据值化,然后进行后续的训练工作。
|
5月前
|
机器学习/深度学习 自然语言处理 算法
【从零开始学习深度学习】49.Pytorch_NLP项目实战:文本情感分类---使用循环神经网络RNN
【从零开始学习深度学习】49.Pytorch_NLP项目实战:文本情感分类---使用循环神经网络RNN
|
6月前
|
机器学习/深度学习 自然语言处理 语音技术
深度学习500问——Chapter06: 循环神经网络(RNN)(3)
深度学习500问——Chapter06: 循环神经网络(RNN)(3)
147 3
|
6月前
|
机器学习/深度学习 自然语言处理 PyTorch
使用Python实现循环神经网络(RNN)的博客教程
使用Python实现循环神经网络(RNN)的博客教程
658 1
|
1月前
|
机器学习/深度学习 存储 自然语言处理
深度学习入门:循环神经网络------RNN概述,词嵌入层,循环网络层及案例实践!(万字详解!)
深度学习入门:循环神经网络------RNN概述,词嵌入层,循环网络层及案例实践!(万字详解!)