我试图通过使用预训练的嵌入和自定义语料库在带有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 in the build function
embedding.set_weights([pretrained_embeddings])
Run Code Online (Sandbox Code Playgroud)
做到了。再次感谢@ blue-phoenox。
blu*_*nox 14
embeddings_initializer您可以使用该参数为嵌入层加载预训练权重,而不是使用Embedding 层的weights参数,这样您应该能够移交大于 2GB 的预训练嵌入。
这是一个简短的例子:
from keras.layers import Embedding
embedding_layer = Embedding(vocab_size,
EMBEDDING_DIM,
weights=[embedding_matrix],
input_length=MAX_SEQUENCE_LENGTH,
trainable=False)
Run Code Online (Sandbox Code Playgroud)
哪里embedding_matrix只是一个包含您的权重的常规 numpy 矩阵。
对于示例,您也可以在这里查看:https :
//blog.keras.io/using-pre-trained-word-embeddings-in-a-keras-model.html
编辑:
正如@PavlinMavrodiev (见问题结尾)正确指出的那样,该weights论点已被弃用。他改为使用layer 方法 set_weights来设置权重:
layer.set_weights(weights): 从 Numpy 数组列表中设置层的权重(与 的输出具有相同的形状get_weights)。
要获得经过训练的权重,get_weights可以使用:
layer.get_weights(): 以 Numpy 数组列表的形式返回层的权重。
两者都是来自 Keras 层基类的方法,可用于所有 keras 层,包括嵌入层。
| 归档时间: |
|
| 查看次数: |
1317 次 |
| 最近记录: |