作者|Nechu BM 编译|VK 来源|Towards Data Science
基础知识:了解本文之前最好拥有关于循环神经网络(RNN)和编解码器的知识。
本文是关于如何使用Python和Keras开发一个编解码器模型的实用教程,更精确地说是一个序列到序列(Seq2Seq)。在上一个教程中,我们开发了一个多对多翻译模型,如下图所示:
这种结构有一个重要的限制,即序列长度。正如我们在图像中看到的,输入序列和输出序列的长度必须相同。如果我们需要不同的长度呢?
例如,我们想实现一个接受不同序列长度的模型,它接收一个单词序列并输出一个数字,或者是图像字幕模型,其中输入是一个图像,输出是一个单词序列。
如果我们要开发的模型是输入和输出长度不同,我们需要开发一个编解码器模型。通过本教程,我们将了解如何开发模型,并将其应用于翻译练习。模型的表示如下所示。
我们将模型分成两部分,首先,我们有一个编码器,输入西班牙语句子并产生一个隐向量。编码器是用一个嵌入层将单词转换成一个向量然后用一个循环神经网络(RNN)来计算隐藏状态,这里我们将使用长短期记忆(LSTM)层。
然后编码器的输出将被用作解码器的输入。对于解码器,我们将再次使用LSTM层,以及预测英语单词的全连接层。
实现
示例数据来自manythings.org。它是由语言的句子对组成的。在我们的案例中,我们将使用西班牙语-英语对。
建立模型首先需要对数据进行预处理,得到西班牙语和英语句子的最大长度。
1-预处理
先决条件:了解Keras中的类“tokenizer”和“pad_sequences”。如果你想详细回顾一下,我们在上一个教程中讨论过这个主题。
首先,我们将导入库,然后读取下载的数据。
import string
import numpy as np
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
from keras.models import Model
from keras.layers import LSTM, Input, TimeDistributed, Dense, Activation, RepeatVector, Embedding
from keras.optimizers import Adam
from keras.losses import sparse_categorical_crossentropy
# 翻译文件的路径
path_to_data = 'data/spa.txt'
# 读文件
translation_file = open(path_to_data,"r", encoding='utf-8')
raw_data = translation_file.read()
translation_file.close()
# 解析数据
raw_data = raw_data.split('\n')
pairs = [sentence.split('\t') for sentence in raw_data]
pairs = pairs[1000:20000]
一旦我们阅读了数据,我们将保留第一个例子,以便更快地进行训练。如果我们想开发更高性能的模型,我们需要使用完整的数据集。然后我们必须通过删除大写字母和标点符号来清理数