我试图通过使用预训练的嵌入和自定义语料库在带有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)