我在gensim训练过word2vec.在Keras,我想用它来制作句子矩阵使用那个词嵌入.由于存储所有句子的矩阵,因此空间和内存效率很低.因此,我想在Keras中实现嵌入层以实现这一点,以便可以在其他层(LSTM)中使用它.你能详细告诉我怎么做吗?
PS:它与其他问题不同,因为我使用gensim进行word2vec训练而不是keras.
我试图通过使用预训练的嵌入和自定义语料库在带有Tensorflow后端的Keras 2中重新训练word2vec模型。
这是我使用预训练的嵌入初始化嵌入层的方式:
embedding = Embedding(vocab_size, embedding_dim,
input_length=1, name='embedding',
embeddings_initializer=lambda x: pretrained_embeddings)
Run Code Online (Sandbox Code Playgroud)
x pretrained_embeddings的大矩阵在哪里vocab_sizeembedding_dim
只要pretrained_embeddings不是太大,就可以使用。
在我的情况很不幸,这是不是这样的- vocab_size=2270872和embedding_dim=300。
初始化Embeddings层后,出现错误:
Cannot create a tensor proto whose content is larger than 2GB.
这个错误来自该函数add_weight()中
/opt/r/anaconda3/lib/python3.6/site-packages/keras/engine/base_layer.py,更具体如下一行:
weight = K.variable(initializer(shape),
dtype=dtype,
name=name,
constraint=constraint)
Run Code Online (Sandbox Code Playgroud)
initializer是上面的lambda函数,它返回大矩阵。shape是(2270872, 300)前面已经提到。
是否可以解决这个问题而不必进行低级Tensorflow编程?如果我将Theano用作后端,则代码运行良好,但我想使用Tensorflow以获得更好的长期前景。
我发现的唯一类似的Stackoverflow问题是this,它提出了占位符变量,但是我不确定如何在Keras级别上应用它们。
非常感谢
编辑: 我非常愿意在Tensorflow后端的级别上解决此问题。只是我不知道在这种情况下如何在同一应用程序中组合Tensorflow和Keras代码。大多数示例是一个或另一个,而不是两者。
例如,当Keras中的Embeddings层的初始化不可避免地调用add_weight()函数时,Tensorflow占位符变量有什么用?
解:
正如@ blue-phoenox的注释所暗示的那样,我重新编写了如下代码:
embedding = Embedding(vocab_size, embedding_dim,
input_length=1,
name='embedding')
embedding.build(input_shape=(1,)) # the input_shape here has no effect …Run Code Online (Sandbox Code Playgroud) 我已经在非常短的句子(最多 10 个单词)的语料库上使用 Gensim 训练了 fasttext 模型。我知道我的测试集包括不在我的训练语料库中的词,即我的语料库中的一些词像“催产素”、“Lexitocin”、“Ematrophin”、“Betaxitocin”
给定测试集中的一个新词,fasttext 非常清楚地知道通过使用字符级别 n-gram 生成一个与训练集中其他相似词具有高余弦相似度的向量
如何将 fasttext 模型合并到 LSTM keras 网络中,而不会丢失 fasttext 模型到词汇表中的向量列表?因为那样的话,即使 fasttext 做得很好,我也不会处理任何 OOV。
任何的想法?