百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

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

toyiye 2024-06-21 12:24 11 浏览 0 评论

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

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

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

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

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码