我正在尝试使用嵌入和RNN构建翻译网络。我已经训练了Gensim Word2Vec模型,并且可以很好地学习单词联想。但是,我无法理解如何正确地将层添加到Keras模型中。(以及如何对输出进行“反向嵌入”。但这是另一个已回答的问题:默认情况下您不能这样做。)
在Word2Vec中,当您输入一个字符串(例如)时model.wv[‘hello’],将获得该单词的矢量表示。但是,我相信keras.layers.EmbeddingWord2Vec的get_keras_embedding()返回的层采用单键/标记化输入,而不是字符串输入。但是文档没有提供有关适当输入内容的解释。我无法弄清楚如何获得与嵌入层的输入具有1对1对应关系的词汇表的一键式/标记式向量。
以下详细说明:
目前,我的解决方法是在将Keras馈送到网络之前,将其应用于Keras外部。这样做有什么害处吗?无论如何,我都会将嵌入设置为不可训练。到目前为止,我已经注意到内存使用效率非常低(甚至在声明Keras模型以收集64个单词长的句子之前,甚至是50GB)都必须将填充的输入和权重加载到模型外部。也许发电机可以提供帮助。
以下是我的代码。输入被填充为64个字长。Word2Vec嵌入具有300个尺寸。由于尝试反复进行嵌入工作的反复实验,此处可能存在很多错误。欢迎提出建议。
import gensim
word2vec_model = gensim.models.Word2Vec.load(“word2vec.model")
Run Code Online (Sandbox Code Playgroud)
from keras.models import Sequential
from keras.layers import Embedding, GRU, Input, Flatten, Dense, TimeDistributed, Activation, PReLU, RepeatVector, Bidirectional, Dropout
from keras.optimizers import Adam, Adadelta
from keras.callbacks import ModelCheckpoint
from keras.losses import sparse_categorical_crossentropy, mean_squared_error, cosine_proximity
keras_model = Sequential()
keras_model.add(word2vec_model.wv.get_keras_embedding(train_embeddings=False))
keras_model.add(Bidirectional(GRU(300, return_sequences=True, dropout=0.1, recurrent_dropout=0.1, activation='tanh')))
keras_model.add(TimeDistributed(Dense(600, activation='tanh')))
# keras_model.add(PReLU())
# ^ For some reason I get error when I add Activation ‘outside’:
# int() argument …Run Code Online (Sandbox Code Playgroud)