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

目录

介绍

导入库

构建模型组件

添加注意力机制

将模型放在一起

下一步


介绍

谷歌翻译工作得如此之好,它通常看起来很神奇。但这不是魔法——这是深度学习!

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

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

上一篇文章中,我们安装了开发自动翻译系统所需的所有工具,并定义了开发工作流程。在本文中,我们将继续构建我们的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 optimizers

构建模型组件

使用Keras构建我们的模型非常简单。我们将首先使用Keras提供的Sequential模型创建我们的模型。

model = Sequential()

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

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

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

model.add(LSTM(512))
model.add(RepeatVector(LEN_EN))
model.add(LSTM(512))

请注意,我们在中间添加了一个RepeatVector。这将是我们注意力机制的一部分,我们将很快添加。

接下来,我们将一个Dense层添加到我们的模型中。该层采用前一层的所有输出神经元。我们需要密集层,因为我们正在做预测。我们想要得到与输入的英语句子对应的最高分的俄语句子。本质上,密集层在每个LSTM单元的输出上计算softmax

model.add(Dense(LEN_RU, activation='softmax'))

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')

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

我们仍然需要添加嵌入层,并在编码器和解码器之间包含一个注意力层。

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

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

from gensim.models import Word2Vec

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

model_w2v = Word2Vec(common_texts, size=100, window=5, min_count=1, workers=4)

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

model_w2v.wv.get_keras_embedding(train_embeddings=False)

我们可以调用该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
_________________________________________________________________

添加注意力机制

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

让我们导入这个模块:

from keras_self_attention import SeqSelfAttention

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

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

我们的模型现在已经完成。

将模型放在一起

这是我们的神经网络的最终代码,用Keras编码:

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()

运行代码后,我们得到以下输出:

[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,200

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

下一步

现在我们的模型已经准备好了。在接下来的文章中,我们将训练和测试这种模式。

https://www.codeproject.com/Articles/5299748/Building-AI-Language-Translation-with-TensorFlow-a

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值