小编Pav*_*iev的帖子

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=2270872embedding_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)

keras tensorflow

5
推荐指数
1
解决办法
1317
查看次数

标签 统计

keras ×1

tensorflow ×1