Neural network Keras:将预先训练好的嵌入作为输入,而不是在嵌入层中加载权重

Neural network Keras:将预先训练好的嵌入作为输入,而不是在嵌入层中加载权重,neural-network,keras,lstm,recurrent-neural-network,word-embedding,Neural Network,Keras,Lstm,Recurrent Neural Network,Word Embedding,我正在使用Keras库进行序列标记。我已经在实验中使用预先训练过的嵌入,使用类似这样的方法() 我的代码(内部保存的嵌入项): 这工作得非常好,我们只需输入一个和数组(X,max\u sequence\u size)形状,它实际上是X填充序列的max\u sequence\u size时间步长(单词索引) 在模型内部保存预先训练的嵌入是完全缩小模型的大小(每个模型450MB)。如果有人想在自己的系统上对多个模型使用此体系结构,比如说20个模型,他需要大约10GB来保存所有模型在这种情况下,瓶颈在

我正在使用Keras库进行序列标记。我已经在实验中使用预先训练过的嵌入,使用类似这样的方法()

我的代码(内部保存的嵌入项):

这工作得非常好,我们只需输入一个和数组(X,max\u sequence\u size)形状,它实际上是X填充序列的max\u sequence\u size时间步长(单词索引)

在模型内部保存预先训练的嵌入是完全缩小模型的大小(每个模型450MB)。如果有人想在自己的系统上对多个模型使用此体系结构,比如说20个模型,他需要大约10GB来保存所有模型在这种情况下,瓶颈在于每个模型都在内部保存了单词嵌入权重,而它们总是相同的。

为了找到一种减少模型大小的方法,我认为最好从外部加载实际的特征向量(嵌入)。 ,这意味着加载一个(X,max\u sequence\u size,embeddings\u size)形状的数组,它实际上是X实际嵌入的max\u sequence\u size时间步长的填充序列

我找不到任何关于这个重要问题的讨论。在Keras文档中,嵌入似乎是RNN中唯一可用的选择,Keras社区似乎低估了这个内存问题。我试图找出一个解决办法

解决方案(外部加载的嵌入件):

<强>以上代码工作,但请考虑以下内容:

  • 您可能需要从头开始进行微调
  • 你必须特别注意序列的最大长度。很少有异常值(巨大的序列)可能会产生问题
我建议以下解决方案。

更好的解决方案(外部加载的嵌入+掩蔽):

请随意评论和批评,我们非常欢迎您

解决方案(外部加载的嵌入件):

<强>以上代码工作,但请考虑以下内容:

  • 您可能需要从头开始进行微调
  • 你必须特别注意序列的最大长度。很少有异常值(巨大的序列)可能会产生问题
我建议以下解决方案。

更好的解决方案(外部加载的嵌入+掩蔽):

请随意评论和批评,我们非常欢迎您

解决方案(外部加载的嵌入件):

<强>以上代码工作,但请考虑以下内容:

  • 您可能需要从头开始进行微调
  • 你必须特别注意序列的最大长度。很少有异常值(巨大的序列)可能会产生问题
我建议以下解决方案。

更好的解决方案(外部加载的嵌入+掩蔽):


请随意评论和批评,我们非常欢迎您

那么您只需将嵌入保留在RAM中,并作为预处理步骤加载它们,同时在网络内部应用掩蔽?很高兴看到其他人碰到这个问题。因为嵌入层是10GB,所以不能使用我家的GPU有点傻。我认为这篇文章可能会更好,如果你编辑的答案是你提出的解决方案@否定我在我的答案中移动了解决方案,向上投票我的答案plz:)那么您只需将嵌入保留在RAM中,并作为预处理步骤加载它们,同时在网络内部应用掩蔽?很高兴看到其他人碰到这个问题。因为嵌入层是10GB,所以不能使用我家的GPU有点傻。我认为这篇文章可能会更好,如果你编辑的答案是你提出的解决方案@否定我在答案中移动了解决方案,向上投票我的答案plz:)
    self._model = Sequential(name='core_sequential')
    self._model.add(Embedding(input_dim=weights.shape[0], 
                              output_dim=weights.shape[1],
                              weights=[weights],
                              name="embeddings_layer",trainable=False))
    self._model.add(Dropout(dropout_rate,name='dropout_layer_1'))
    self._model.add(Bidirectional(LSTM(output_dim=300,
                                       return_sequences=distributed,
                                       activation="tanh",
                                       name="lstm_layer"),name='birnn_layer'))
    self._model.add(Dropout(dropout_rate,name='dropout_layer_2'))
    self._model.add(TimeDistributed(Dense(output_dim=1,
                                          activation='sigmoid',
                                          name='dense_layer'), 
                    name="timesteps_layer"))
    self._model.compile(optimizer=Adam(lr=lr),
                        loss='binary_crossentropy', 
                        metrics=['accuracy'])
    self._model = Sequential(name='core_sequential')
    self._model.add(InputLayer((None, 200)))
    self._model.add(Dropout(dropout_rate,name='dropout_layer_1'))
    self._model.add(Bidirectional(LSTM(output_dim=300,
                                       return_sequences=distributed,
                                       activation="tanh",
                                       name="lstm_layer"),name='birnn_layer'))
    self._model.add(Dropout(dropout_rate,name='dropout_layer_2'))
    self._model.add(TimeDistributed(Dense(output_dim=1,
                                          activation='sigmoid',
                                          name='dense_layer'), 
                    name="timesteps_layer"))
    self._model.compile(optimizer=Adam(lr=lr),
                        loss='binary_crossentropy', 
                        metrics=['accuracy'])
    self._model = Sequential(name='core_sequential')
    self._model.add(Masking(mask_value=0., input_shape=(None, 200)))
    self._model.add(Dropout(dropout_rate,name='dropout_layer_1'))
    self._model.add(Bidirectional(LSTM(output_dim=300,
                                       return_sequences=distributed,
                                       activation="tanh",
                                       name="lstm_layer"),name='birnn_layer'))
    self._model.add(Dropout(dropout_rate,name='dropout_layer_2'))
    self._model.add(TimeDistributed(Dense(output_dim=1,
                                          activation='sigmoid',
                                          name='dense_layer'), 
                    name="timesteps_layer"))
    self._model.compile(optimizer=Adam(lr=lr),
                        loss='binary_crossentropy', 
                        metrics=['accuracy'])
    self._model = Sequential(name='core_sequential')
    self._model.add(InputLayer((None, 200)))
    self._model.add(Dropout(dropout_rate,name='dropout_layer_1'))
    self._model.add(Bidirectional(LSTM(output_dim=300,
                                       return_sequences=distributed,
                                       activation="tanh",
                                       name="lstm_layer"),name='birnn_layer'))
    self._model.add(Dropout(dropout_rate,name='dropout_layer_2'))
    self._model.add(TimeDistributed(Dense(output_dim=1,
                                          activation='sigmoid',
                                          name='dense_layer'), 
                    name="timesteps_layer"))
    self._model.compile(optimizer=Adam(lr=lr),
                        loss='binary_crossentropy', 
                        metrics=['accuracy'])
    self._model = Sequential(name='core_sequential')
    self._model.add(Masking(mask_value=0., input_shape=(None, 200)))
    self._model.add(Dropout(dropout_rate,name='dropout_layer_1'))
    self._model.add(Bidirectional(LSTM(output_dim=300,
                                       return_sequences=distributed,
                                       activation="tanh",
                                       name="lstm_layer"),name='birnn_layer'))
    self._model.add(Dropout(dropout_rate,name='dropout_layer_2'))
    self._model.add(TimeDistributed(Dense(output_dim=1,
                                          activation='sigmoid',
                                          name='dense_layer'), 
                    name="timesteps_layer"))
    self._model.compile(optimizer=Adam(lr=lr),
                        loss='binary_crossentropy', 
                        metrics=['accuracy'])