加载库
作者使用 help.py 加载数据,同时使用 project_test.py 测试函数。
数据
该数据集包含一个相对较小的词汇表,其中 small_vocab_en 文件包含英文语句,small_vocab_fr 包含对应的法文翻译。
预处理
我们将使用以下预处理方法将文本转化为整数序列:
1. 将词转化为 id 表达;
2. 加入 padding 使得每个序列一样长。
Padding
通过使用 Keras 的 pad_sequences 函数在每个序列最后添加零以使得所有英文序列具有相同长度,所有法文序列具有相同长度。
预处理流程
实现预处理函数:
模型
在本节中,我们将尝试各种神经网络结构。我们将训练 4 个相对简单的结构作为开始:
模型 1 是一个简单的 RNN;
模型 2 是一个带词嵌入的 RNN;
模型 3 是一个双向 RNN;
模型 4 是两个 RNN 组成的编码器—解码器架构。
模型 1:RNN
我们构建一个基础的 RNN 模型,该模型是将英文翻译成法文序列的良好基准。
基础 RNN 模型的验证集准确度是 0.6039。
模型 2:词嵌入
词嵌入是在 n 维空间中近义词距离相近的向量表示,其中 n 表示嵌入向量的大小。我们将使用词嵌入来构建一个 RNN 模型。
嵌入式模型的验证集准确度是 0.8401。
模型 3:双向 RNN
双向 RNN 模型的验证集准确度是 0.5992。
模型 4:编码器—解码器框架
编码器构建一个语句的矩阵表示,而解码器将该矩阵作为输入并输出预测的翻译。
编码器—解码器模型的验证集准确度是 0.6406。
模型 5:自定义深度模型
构建一个将词嵌入和双向 RNN 合并到一个模型中的 model_final。
预测
def final_predictions(x, y, x_tk, y_tk):
tmp_X = pad(preproc_english_sentences)
model = model_final(tmp_X.shape,
preproc_french_sentences.shape[1],
len(english_tokenizer.word_index)+1,
len(french_tokenizer.word_index)+1)
model.fit(tmp_X, preproc_french_sentences, batch_size = 1024, epochs = 17, validation_split = 0.2)
y_id_to_word = {value: key for key, value in y_tk.word_index.items()}
y_id_to_word[0] = ''
sentence = 'he saw a old yellow truck'
sentence = [x_tk.word_index[word] for word in sentence.split()]
sentence = pad_sequences([sentence], maxlen=x.shape[-1], padding='post')
sentences = np.array([sentence[0], x[0]])
predictions = model.predict(sentences, len(sentences))
print('Sample 1:')
print(' '.join([y_id_to_word[np.argmax(x)] for x in predictions[0]]))
print('Il a vu un vieux camion jaune')
print('Sample 2:')
print(' '.join([y_id_to_word[np.argmax(x)] for x in predictions[1]]))
print(' '.join([y_id_to_word[np.max(x)] for x in y[0]]))
final_predictions(preproc_english_sentences, preproc_french_sentences, english_tokenizer, french_to
我们得到了语句完美的翻译同时验证集准确度是 0.9776!
进群:125240963 即可获取数十套PDF哦!
网友评论