在本系列文章中,,我們將向您展示如何使用深度學(xué)習(xí)來(lái)創(chuàng)建自動(dòng)翻譯系統(tǒng),。本系列可以視為分步教程,可以幫助您了解和構(gòu)建神經(jīng)元機(jī)器翻譯,。 本系列假定您熟悉機(jī)器學(xué)習(xí)的概念:模型訓(xùn)練,,監(jiān)督學(xué)習(xí),神經(jīng)網(wǎng)絡(luò)以及人工神經(jīng)元,,層和反向傳播,。 在上一篇文章中,我們安裝了開發(fā)自動(dòng)翻譯系統(tǒng)所需的所有工具,,并定義了開發(fā)工作流程,。在本文中,我們將繼續(xù)構(gòu)建AI語(yǔ)言翻譯系統(tǒng),。 我們將只需要編寫很少的代碼行,,因?yàn)閷?duì)于大多數(shù)邏輯而言,我們將使用基于Keras的預(yù)格式化模板,。 如果您想查看最終的最終代碼,,可以在此Python筆記本中找到。 導(dǎo)入庫(kù)首先,,我們需要加載所需的庫(kù): 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復(fù)制代碼類型:[html] 建筑模型組件使用Keras建立模型非常簡(jiǎn)單,。我們將從使用Keras提供的Sequential模型創(chuàng)建模型開始。 model = Sequential()1復(fù)制代碼類型:[html] 接下來(lái),,我們添加一個(gè)長(zhǎng)短期記憶(LSTM)層,。在Keras的LSTM類中,LSTM單元的大多數(shù)參數(shù)都具有默認(rèn)值,因此我們唯一需要明確定義的是輸出的維數(shù):將為序列到序列的遞歸神經(jīng)創(chuàng)建的LSTM單元的數(shù)量網(wǎng)絡(luò)(RNN),。 輸入向量的大小是原始句子中單詞的總數(shù),。因?yàn)槲覀兪褂玫氖乔度耄晕覀儠?huì)得到標(biāo)記化的單詞,。這意味著可以將單詞拆分為子單詞,,從而增加輸入句子中單詞的數(shù)量。 為了使模型的大小易于管理(從而確??梢栽诤侠淼臅r(shí)間內(nèi)訓(xùn)練模型),,我們將長(zhǎng)度設(shè)置為512,。我們添加了兩個(gè)LSTM層:第一層是編碼器,,第二層是解碼器。 model.add(LSTM(512)) model.add(RepeatVector(LEN_EN)) model.add(LSTM(512))123復(fù)制代碼類型:[html] 請(qǐng)注意,,我們?cè)谥虚g添加了RepeatVector,。這將是我們注意機(jī)制的一部分,我們將在不久后添加,。 接下來(lái),,我們?cè)谀P椭刑砑右粋€(gè)Dense層。該層從上一層獲取所有輸出神經(jīng)元,。我們需要密集的層,,因?yàn)槲覀円M(jìn)行預(yù)測(cè)。我們想要獲得俄語(yǔ)句子,,該句子具有與輸入的英語(yǔ)句子相對(duì)應(yīng)的最高分?jǐn)?shù),。本質(zhì)上,密集層在每個(gè)LSTM單元的輸出上計(jì)算softmax,。 model.add(Dense(LEN_RU, activation='softmax'))1復(fù)制代碼類型:[html] LEN_RU是輸出向量的大?。ㄉ院笪覀儗⒂?jì)算這些參數(shù))。變量也一樣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復(fù)制代碼類型:[html] 我們正在使用稱為RMSprop的Keras優(yōu)化器。它優(yōu)化了用于反向傳播的梯度下降技術(shù),。 我們?nèi)匀恍枰砑忧度雽?,并在編碼器和解碼器之間包括關(guān)注層。 嵌入層是使用Word2Vec創(chuàng)建的,,實(shí)際上是一個(gè)預(yù)訓(xùn)練的嵌入層?,F(xiàn)在,我們需要生成Word2Vec權(quán)重矩陣(該層神經(jīng)元的權(quán)重),,并用該矩陣填充標(biāo)準(zhǔn)的Keras嵌入層,。 我們可以使用該gensim包自動(dòng)獲取嵌入層: from gensim.models import Word2Vec1復(fù)制代碼類型:[html] 然后,我們創(chuàng)建我們的Word2Vec嵌入層 model_w2v = Word2Vec(common_texts, size=100, window=5, min_count=1, workers=4)1復(fù)制代碼類型:[html] 然后可以按以下方式檢索嵌入層: model_w2v.wv.get_keras_embedding(train_embeddings=False)1復(fù)制代碼類型:[html] 我們可以調(diào)用該model.summary()函數(shù)以獲取模型概述: _________________________________________________________________ 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復(fù)制代碼類型:[html] 增加注意力機(jī)制現(xiàn)在我們要添加一個(gè)注意力機(jī)制,。我們可以從頭開始編寫它,,但是更簡(jiǎn)單的解決方案是使用現(xiàn)有的Keras模塊,,例如Kerasself-attention。 讓我們導(dǎo)入這個(gè)模塊: from keras_self_attention import SeqSelfAttention1復(fù)制代碼類型:[html] 現(xiàn)在,,我們將在兩個(gè)LSTM模塊之間添加導(dǎo)入的模塊: model.add(SeqSelfAttention(attention_activation='sigmoid'))1復(fù)制代碼類型:[html] 我們的模型現(xiàn)已完成,。 將模型放在一起這是用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復(fù)制代碼類型:[html] 運(yùn)行代碼后,將獲得以下輸出: [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復(fù)制代碼類型:[html] 盡管我們的模型代碼按原樣運(yùn)行良好,,但是考慮將模型創(chuàng)建代碼包含在函數(shù)中將使其更易于重用,。你不必有這樣做-但得到的可能怎么看,看在最后的翻譯器代碼的想法筆記本我們前面提到的,。 |
|
來(lái)自: 碼農(nóng)9527 > 《WEB》