文 / 李锡涵,Google Developers Expert
本文节选自《简单粗暴 TensorFlow 2.0》
上一篇文章 中,我们介绍了在图像领域中广泛使用的卷积神经网络及其在 TensorFlow 2.0 中的实现。本文继续介绍另一种广泛流行的神经网络结构,即循环神经网络,内容如下:
-
以文本自动生成任务为例,介绍循环神经网络在 TensorFlow 2.0 中的实现方式;
-
为深度学习的入门者简介循环神经网络的原理。
使用 Keras 建立基于循环神经网络的文本生成模型
循环神经网络(Recurrent Neural Network, RNN)是一种适宜于处理序列数据的神经网络,被广泛用于语言模型、文本生成、机器翻译等。
基础知识和原理
这里,我们使用 RNN 来进行 尼采风格文本 的自动生成。(此处的任务及实现参考了此链接)
这个任务的本质其实预测一段英文文本的接续字母的概率分布。比如,我们有以下句子:
I am a studen
这个句子(序列)一共有 13 个字符(包含空格)。当我们阅读到这个由 13 个字符组成的序列后,根据我们的经验,我们可以预测出下一个字符很大概率是 “t”。
我们希望建立这样一个模型,逐个输入一段长为 seq_length
的序列,输出这些序列接续的下一个字符的概率分布。我们从下一个字符的概率分布中采样作为预测值,然后滚雪球式地生成下两个字符,下三个字符等等,即可完成文本的生成任务。
首先,还是实现一个简单的 DataLoader
类来读取文本,并以字符为单位进行编码。设字符种类数为 num_chars
,则每种字符赋予一个 0 到 num_chars - 1
之间的唯一整数编号 i 。
1class DataLoader():
2 def __init__(self):
3 path = tf.keras.utils.get_file('nietzsche.txt',
4 origin='https://s3.amazonaws.com/text-datasets/nietzsche.txt')
5 with open(path, encoding='utf-8') as f:
6 self.raw_text = f.read().lower()
7 self.chars = sorted(list(set(self.raw_text)))
8 self.char_indices = dict((c, i) for i, c in enumerate(self.chars))
9 self.indices_char = dict((i, c) for i, c in enumerate(self.chars))
10 self.text = [self.char_indices[c] for c in self.raw_text]
11
12 def get_batch(self, seq_length, batch_size):
13 seq = []
14 next_char = []
15 for i in range(batch_size):
16 index = np.random.randint(0, len(self.text) - seq_length)
17 seq.append(self.text[index:index+seq_length])
18 next_char.append(self.text[index+seq_length])
19