使用Keras TensorFlow预测莎士比亚文本

247 阅读3分钟

嘿,伙计们!在本教程中,我们将研究如何在Python中使用Keras TensorFlow API来创建一个循环神经网络模型来预测莎士比亚的文本。

为了产生新鲜的文本,我们将使用一个定制的RNN模型来训练 GitHub的莎士比亚文本数据集


步骤1:导入库

我们利用了一些最流行的深度学习库。Sweetviz是一个新的软件包,可以自动进行探索性数据分析,对分析我们的训练数据集特别有利。

pip install sweetviz
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow import keras
import sweetviz as sw
import seaborn as sns
sns.set()

第二步:加载数据集

shakespeare_url='https://raw.githubusercontent.com/karpathy/char-rnn/master/data/tinyshakespeare/input.txt'
filepath=keras.utils.get_file('shakespeare.txt',shakespeare_url)
with open(filepath) as f:
    shakespeare_text=f.read()

Downloading data from https://raw.githubusercontent.com/karpathy/char-rnn/master/data/tinyshakespeare/input.txt
1122304/1115394 [==============================] - 0s 0us/step
1130496/1115394 [==============================] - 0s 0us/step

现在我们已经将数据集下载到我们的Python笔记本中,在利用它进行训练之前,我们需要对它进行预处理。

第3步:预处理数据集

代号化是将冗长的文本字符串划分为较小的部分或代号的过程。较大的文本块可以被标记为句子,然后再标记为单词。

预处理还包括从生成的标记中去除标点符号。

tokenizer=keras.preprocessing.text.Tokenizer(char_level=True)
tokenizer.fit_on_texts(shakespeare_text)

max_id=len(tokenizer.word_index)
dataset_size=tokenizer.document_count
[encoded]=np.array(tokenizer.texts_to_sequences([shakespeare_text]))-1

第四步:准备数据集

我们将使用tf.data.Dataset ,这对于像巨大的文本数据块这样的大型元素集来说通常很有用。

Dataset.repeat() window() 就像一个滑动窗口,每次都会将窗口滑动一个指定的数字,进行重复迭代。

train_size=dataset_size*90//100
dataset=tf.data.Dataset.from_tensor_slices(encoded[:train_size])

n_steps=100
window_length=n_steps+1
dataset=dataset.repeat().window(window_length,shift=1,drop_remainder=True)

dataset=dataset.flat_map(lambda window: window.batch(window_length))

batch_size=32
dataset=dataset.shuffle(10000).batch(batch_size)
dataset=dataset.map(lambda windows: (windows[:,:-1],windows[:,1:]))
dataset=dataset.map(lambda X_batch,Y_batch: (tf.one_hot(X_batch,depth=max_id),Y_batch))
dataset=dataset.prefetch(1)

第五步:建立模型

模型的建立是非常简单的。我们将创建一个顺序模型,并向模型添加具有某些特征的层。

model=keras.models.Sequential()
model.add(keras.layers.GRU(128,return_sequences=True,input_shape=[None,max_id]))
model.add(keras.layers.GRU(128,return_sequences=True))
model.add(keras.layers.TimeDistributed(keras.layers.Dense(max_id,activation='softmax')))

接下来,我们将对模型进行编译,并在数据集上拟合模型。我们将使用Adam 优化器,但你也可以根据你的喜好使用其他可用的优化器。

model.compile(loss='sparse_categorical_crossentropy',optimizer='adam')
history=model.fit(dataset,steps_per_epoch=train_size // batch_size,epochs=1)

31370/31370 [==============================] - 1598s 51ms/step - loss: 0.9528

第6步:测试模型

我们在下面提到的代码片断中定义了一些函数。这些函数将根据我们定义的模型对输入数据进行预处理和准备,并预测下一个字符,直到指定的字符数。

def preprocess(texts):
    X=np.array(tokenizer.texts_to_sequences(texts))-1
    return tf.one_hot(X,max_id)

def next_char(text,temperature=1):
    X_new=preprocess([text])
    y_proba=model.predict(X_new)[0,-1:,:]
    rescaled_logits=tf.math.log(y_proba)/temperature
    char_id=tf.random.categorical(rescaled_logits,num_samples=1)+1
    return tokenizer.sequences_to_texts(char_id.numpy())[0]

def complete_text(text,n_chars=50,temperature=1):
    for _ in range(n_chars):
        text+=next_char(text,temperature)
    return text

让我们用下面提到的代码来预测某个字母或某个单词的文字。

print("Some predicted texts for letter 'D' are as follows:\n ")
for i in range(3):
  print(complete_text('d'))
  print()

Some predicted texts for letter 'D' are as follows:
 
d, swalld tell you in mine,
the remeiviss if i shou

dima's for me, sir, to comes what this roguty.

dening to girl, ne'er i was deckong?
which never be

print("Some predicted texts for word 'SHINE' are as follows:\n ")
for i in range(3):
  print(complete_text('shine'))
  print()

输出:

Some predicted texts for word 'SHINE' are as follows:
 
shine on here is your viririno penaite the cursue,
i'll

shine yet it the become done to-k
make you his ocrowing

shine dises'-leck a word or my head
not oning,
so long 


结论

祝贺你!你刚刚学会了如何使用RNN建立一个莎士比亚文本预测器。希望你喜欢它!😇

谢谢您抽出时间!希望你能学到新的东西!!😄