分享

使用TensorFlow和Keras构建AI语言翻译

 码农9527 2021-04-25

在本系列文章中,我们将向您展示如何使用深度学习来创建自动翻译系统。本系列可以视为分步教程,可以帮助您了解和构建神经元机器翻译。

web

    本系列假定您熟悉机器学习的概念:模型训练,监督学习,神经网络以及人工神经元,层和反向传播。

    在上一篇文章中,我们安装了开发自动翻译系统所需的所有工具,并定义了开发工作流程。在本文中,我们将继续构建AI语言翻译系统。

    我们将只需要编写很少的代码行,因为对于大多数逻辑而言,我们将使用基于Keras的预格式化模板。

    如果您想查看最终的最终代码,可以在此Python笔记本中找到。

    导入库

    首先,我们需要加载所需的库:

import warnings
warnings.filterwarnings("ignore")
import tensorflow as tf
import numpy as np
import string
from numpy import array, argmax, random, take
#for processing imported data
import pandas as pd
#the RNN routines
from keras.models import Sequential
from keras.layers import Dense, LSTM, Embedding, RepeatVector
#we will need the tokenizer for BERT
from keras.preprocessing.text import Tokenizer
from keras.callbacks import ModelCheckpoint
from keras.preprocessing.sequence import pad_sequences
from keras.models import load_model
from keras import optimizers1234567891011121314151617复制代码类型:[html]

    建筑模型组件

    使用Keras建立模型非常简单。我们将从使用Keras提供的Sequential模型创建模型开始。

model = Sequential()1复制代码类型:[html]

    接下来,我们添加一个长短期记忆(LSTM)层。在Keras的LSTM类中,LSTM单元的大多数参数都具有默认值,因此我们唯一需要明确定义的是输出的维数:将为序列到序列的递归神经创建的LSTM单元的数量网络(RNN)。

    输入向量的大小是原始句子中单词的总数。因为我们使用的是嵌入,所以我们会得到标记化的单词。这意味着可以将单词拆分为子单词,从而增加输入句子中单词的数量。

    为了使模型的大小易于管理(从而确保可以在合理的时间内训练模型),我们将长度设置为512。我们添加了两个LSTM层:第一层是编码器,第二层是解码器。

model.add(LSTM(512))
model.add(RepeatVector(LEN_EN))
model.add(LSTM(512))123复制代码类型:[html]

    请注意,我们在中间添加了RepeatVector。这将是我们注意机制的一部分,我们将在不久后添加。

    接下来,我们在模型中添加一个Dense层。该层从上一层获取所有输出神经元。我们需要密集的层,因为我们要进行预测。我们想要获得俄语句子,该句子具有与输入的英语句子相对应的最高分数。本质上,密集层在每个LSTM单元的输出上计算softmax。

model.add(Dense(LEN_RU, activation='softmax'))1复制代码类型:[html]

    LEN_RU是输出向量的大小(稍后我们将计算这些参数)。变量也一样LEN_EN。

    到目前为止,这是我们的模型的外观:

model = Sequential()
model.add(LSTM(512))
model.add(LSTM(512))
model.add(Dense(LEN_RU, activation='softmax'))
rms = optimizers.RMSprop(lr=0.001)
model.compile(optimizer=rms, loss='sparse_categorical_crossentropy')123456复制代码类型:[html]

    我们正在使用称为RMSprop的Keras优化器。它优化了用于反向传播的梯度下降技术。

    我们仍然需要添加嵌入层,并在编码器和解码器之间包括关注层。

    嵌入层是使用Word2Vec创建的,实际上是一个预训练的嵌入层。现在,我们需要生成Word2Vec权重矩阵(该层神经元的权重),并用该矩阵填充标准的Keras嵌入层。

    我们可以使用该gensim包自动获取嵌入层:

from gensim.models import Word2Vec1复制代码类型:[html]

    然后,我们创建我们的Word2Vec嵌入层

model_w2v = Word2Vec(common_texts, size=100, window=5, min_count=1, workers=4)1复制代码类型:[html]

    然后可以按以下方式检索嵌入层:

model_w2v.wv.get_keras_embedding(train_embeddings=False)1复制代码类型:[html]

    我们可以调用该model.summary()函数以获取模型概述:

_________________________________________________________________
Layer (type)  Output Shape  Param #
=================================================================
embedding_1 (Embedding)   (None, None, 100)   1200
_________________________________________________________________
lstm_1 (LSTM) (None, 512)   1255424
_________________________________________________________________
repeat_vector_1 (RepeatVecto (None, 8, 512)   0
_________________________________________________________________
lstm_2 (LSTM) (None, 512)   2099200
_________________________________________________________________
dense_1 (Dense)  (None, 512)   262656
=================================================================
Total params: 3,618,480
Trainable params: 3,617,280
Non-trainable params: 1,200
_________________________________________________________________1234567891011121314151617复制代码类型:[html]

    增加注意力机制

    现在我们要添加一个注意力机制。我们可以从头开始编写它,但是更简单的解决方案是使用现有的Keras模块,例如Kerasself-attention。

    让我们导入这个模块:

from keras_self_attention import SeqSelfAttention1复制代码类型:[html]

    现在,我们将在两个LSTM模块之间添加导入的模块:

model.add(SeqSelfAttention(attention_activation='sigmoid'))1复制代码类型:[html]

    我们的模型现已完成。

    将模型放在一起

    这是用Keras编码的我们的NN的最终代码:

import warnings
warnings.filterwarnings("ignore")
import numpy as np
import string
from numpy import array, argmax, random, take
#for processing imported data
import tensorflow as tf
import pandas as pd
#the RNN routines
from keras.models import Sequential
from keras.layers import Dense, LSTM, Embedding, RepeatVector
from keras.preprocessing.text import Tokenizer
from keras.callbacks import ModelCheckpoint
from keras.preprocessing.sequence import pad_sequences
from keras.models import load_model
from keras import optimizers
#optional if you want to generate statistical graphs of the DMT
#import matplotlib.pyplot as plt
#from keras.utils import plot_model
#import pydot

from gensim.models import Word2Vec
from gensim.test.utils import common_texts
from keras_self_attention import SeqSelfAttention


model = Sequential()

model_w2v = Word2Vec(common_texts, size=100, window=5, min_count=1, workers=4)
model.add(model_w2v.wv.get_keras_embedding(train_embeddings=False))
model.add(LSTM(512))
model.add(RepeatVector(8))

model.add(SeqSelfAttention(attention_activation='sigmoid'))

model.add(LSTM(512))
model.add(Dense(LEN_RU, activation='softmax'))
rms = optimizers.RMSprop(lr=0.001)
model.compile(optimizer=rms, loss='sparse_categorical_crossentropy')

#plot_model(model, to_file='model_plot4a.png', show_shapes=True, show_layer_names=True)

model.summary()12345678910111213141516171819202122232425262728293031323334353637383940414243复制代码类型:[html]

    运行代码后,将获得以下输出:

[root@ids ~]# python3 NMT.py
Using TensorFlow backend.
_________________________________________________________________
Layer (type)  Output Shape  Param #
=================================================================
embedding_1 (Embedding)   (None, None, 100)   1200
_________________________________________________________________
lstm_1 (LSTM) (None, 512)   1255424
_________________________________________________________________
repeat_vector_1 (RepeatVecto (None, 8, 512)   0
_________________________________________________________________
seq_self_attention_1 (SeqSel (None, 8, 512)   32833
_________________________________________________________________
lstm_2 (LSTM) (None, 512)   2099200
_________________________________________________________________
dense_1 (Dense)  (None, 512)   262656
=================================================================
Total params: 3,651,313
Trainable params: 3,650,113
Non-trainable params: 1,2001234567891011121314151617181920复制代码类型:[html]

    尽管我们的模型代码按原样运行良好,但是考虑将模型创建代码包含在函数中将使其更易于重用。你不必有这样做-但得到的可能怎么看,看在最后的翻译器代码的想法笔记本我们前面提到的。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多