【问题标题】:Variable length input to embedding layer Keras嵌入层 Keras 的可变长度输入
【发布时间】:2022-03-08 01:56:13
【问题描述】:

我有一个可变大小的文本语料库。我正在尝试使用 keras 中的嵌入层将我的文本提供给 LSTM 模型。我的代码如下所示:

import numpy as np
from keras.layers import Embedding, Input, LSTM, RNN, SimpleRNN
from keras.models import Model, Sequential


vocab_size = 20000
embedding_len = 50

model = Sequential()
model.add(Embedding(vocab_size, embedding_len))

我已经使用 numpy 随机数生成器生成了一个样本输入:

akak=[]
for i in range(10):
    akak.append(np.random.randint(0, 20, size = (np.random.randint(1,30, size=None))))
input_array = np.asarray(akak)
print(input_array)

输出:

array([array([16,  2,  9, 12, 18, 10, 10, 14,  3, 11,  4,  6,  8, 11,  3]),
       array([ 3,  6,  5,  8,  3, 10, 19,  9, 17]),
       array([ 1,  6, 17, 14, 14, 19, 12, 15, 14,  0, 16,  2,  1, 18, 13, 14, 17,
       14,  2, 11,  0, 19,  2,  8, 13, 10, 17, 13,  5]),
       array([ 5, 10, 18,  0,  4,  8]),
       array([ 5, 14, 19, 16, 10,  8, 13,  8, 12,  5, 19]),
       array([ 7,  4, 17,  0, 10,  8,  3,  6, 14,  4,  8,  9,  0]),
       array([ 4,  7,  7, 16,  7,  6, 16,  9,  4,  2, 11]),
       array([ 2, 16, 15, 16, 18, 11,  7,  1,  0,  5, 11, 12, 11,  8,  3,  8,  8,
       16, 19,  8]),
       array([12, 18, 19, 15, 11,  6, 16, 16,  2, 12,  0, 14, 16,  0]),
       array([12, 13, 13])], dtype=object)

当我尝试使用 model.predict(input_array) 预测仅获取嵌入时,我收到以下错误

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-49-313059fadb55> in <module>()
----> 1 model.predict(input_array).shape

/home/biswadip/.local/lib/python3.6/site-packages/keras/engine/training.py in predict(self, x, batch_size, verbose, steps)
   1167                                             batch_size=batch_size,
   1168                                             verbose=verbose,
-> 1169                                             steps=steps)
   1170 
   1171     def train_on_batch(self, x, y,

/home/biswadip/.local/lib/python3.6/site-packages/keras/engine/training_arrays.py in predict_loop(model, f, ins, batch_size, verbose, steps)
    292                 ins_batch[i] = ins_batch[i].toarray()
    293 
--> 294             batch_outs = f(ins_batch)
    295             batch_outs = to_list(batch_outs)
    296             if batch_index == 0:

/home/biswadip/.local/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py in __call__(self, inputs)
   2713                 return self._legacy_call(inputs)
   2714 
-> 2715             return self._call(inputs)
   2716         else:
   2717             if py_any(is_tensor(x) for x in inputs):

/home/biswadip/.local/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py in _call(self, inputs)
   2653                 array_vals.append(
   2654                     np.asarray(value,
-> 2655                                dtype=tf.as_dtype(tensor.dtype).as_numpy_dtype))
   2656         if self.feed_dict:
   2657             for key in sorted(self.feed_dict.keys()):

/home/biswadip/.local/lib/python3.6/site-packages/numpy/core/numeric.py in asarray(a, dtype, order)
    536 
    537     """
--> 538     return array(a, dtype, copy=False, order=order)
    539 
    540 

ValueError: setting an array element with a sequence.

我知道我可以只填充序列,但 LSTM 层不会只返回填充序列的最后一个隐藏状态。我想要来自实际序列的最后一个隐藏状态的隐藏状态,而不是填充状态,即如果我的序列长度为 15,最大序列长度为 200,我想要来自第 15 个状态而不是第 200 个状态的隐藏状态向量

【问题讨论】:

  • 你必须填充序列,因为计算图是静态的。
  • 如果我用 0 填充序列,我的 lstm 层不会展开到最大长度。如何像tensorflow中的动态rnn一样根据序列长度得到隐藏状态向量。
  • @BiswadipMandal 我知道这已经很晚了,但是如果你使用truncating='post',你不能只做output[:15],因此只保留前15个输出,并丢弃其余的,即丢弃输出的填充部分?如果truncating='pre',则使用output[185:]。

标签: python keras lstm embedding word-embedding


【解决方案1】:

从keras documentation 我们得到了这个对嵌入层非常有用的参数:

ma​​sk_zero:布尔值,输入值 0 是否是应被屏蔽的特殊“填充”值。这在使用可能采用可变长度输入的循环层时很有用。如果这是 True,则模型中的所有后续层都需要支持屏蔽,否则将引发异常。如果 mask_zero 设置为 True,则索引 0 不能在词汇表中使用(input_dim 应该等于词汇表的大小 + 1)。

这意味着,无论如何我们都应该填充序列,但将此参数设置为 True,以便序列可以用作 RNN 的可变长度序列。

【讨论】:

    猜你喜欢
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多