【问题标题】:Keras: Embedding layer for multidimensional time stepsKeras:多维时间步长的嵌入层
【发布时间】:2018-05-18 21:48:32
【问题描述】:

我正在尝试将两个字符级别的句子输入 LSTM 层进行分类。我的样本与以下类似,我的标签是一个热编码类。

标签:

label array([1., 0., 0., 0., 0.])

样本:

array([['0', ' '],
   [' ', 'l'],
   ['1', 'e'],
   ['1', 't'],
   ['2', 'n'],
   ['8', 'i'],
   [' ', ' '],
   ['"', ';'],
   ['h', 'h'],
   ['t', 's'],
   ['t', 'o'],
   ['p', 't'],
   ['s', 'n'],
   [':', 'i'],
   ['/', 'c'],
   ['/', 'a'],
   ['w', 'm'],
   ['w', '('],
   ['w', ' '],
   ['.', '0'],
   ['e', '.'],
   ['x', '5'],
   ['a', '/'],
   ['m', 'a'],
   ['p', 'l'],
   ['l', 'l'],
   ['e', 'i'],
   ['.', 'z'],
   ['c', 'o'],
   ['o', 'm'],
   ['m', '"'],
   ['/', ' '],
   ['c', '"'],
   ['m', '/'],
   ['s', 'd'],
   ['/', 'a'],
   ['t', 'o'],
   ['i', 'l'],
   ['n', 'n'],
   ['a', 'w'],
   ['-', 'o'],
   ['a', 'd'],
   ['c', '-'],
   ['c', 'r'],
   ['e', 'o'],
   ['s', 'f'],
   ['s', '-'],
   ['-', 'r'],
   ['e', 'o'],
   ['d', 't'],
   ['i', 'i']], dtype='<U1')

我正在尝试使用 Keras 的嵌入层将字符映射到向量中。然而,嵌入层只接受一维序列。如何调整网络以接收多维序列?目前我有以下适用于一维样本的代码。 51 是我的 lstm 窗口大小,74 是我的词汇量。

model = keras.models.Sequential()
model.add(keras.layers.Embedding(input_dim=74,
                                 output_dim=74,
                                 input_length=51))

model.add(keras.layers.Dropout(0.2))
model.add(keras.layers.LSTM(64,
                            dropout=0.5,
                            recurrent_dropout=0.5,
                            return_sequences=True,
                            input_shape=(51, 74)))
model.add(keras.layers.LSTM(64,
                            dropout=0.5,
                            recurrent_dropout=0.5))
model.add(keras.layers.Dense(num_classes, activation='sigmoid'))
model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

【问题讨论】:

  • Embedding 确实适用于更高的维度,但上游 LSTM 不会。如果你通过input_shape=(...) Embedding 也应该嵌入更高维的张量。
  • 我认为嵌入不适用于更高的维度。来自 Keras 文档 input_shape: input_dim: int > 0。词汇量的大小,即最大整数索引 + 1。
  • input_dim 只是索引大小,与输入的实际张量的形状无关。

标签: multidimensional-array keras lstm embedding


【解决方案1】:

好的,我通过在 Embedding 之前添加一个 Reshape 层,然后在嵌入后添加另一个 reshape 层解决了这个问题。代码如下:

model = keras.models.Sequential()

model.add(keras.layers.Reshape((2 * lstm_window_size, 1), input_shape=(
    lstm_window_size, 2)))

model.add(keras.layers.Embedding(input_dim=vocab_size + 1,
                                 output_dim=100,
                                 input_length=lstm_window_size * 2))

model.add(keras.layers.Reshape((lstm_window_size, 200)))
model.add(keras.layers.Dropout(0.2))
model.add(keras.layers.LSTM(64,
                            dropout=0.5,
                            recurrent_dropout=0.5,
                            return_sequences=True,
                            input_shape=(lstm_window_size, 2)))
model.add(keras.layers.LSTM(64,
                            dropout=0.5,
                            recurrent_dropout=0.5))
model.add(keras.layers.Dense(num_classes, activation='sigmoid'))
model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

【讨论】:

  • 这里的 lstm_window_size 是什么?
猜你喜欢
  • 2018-01-11
  • 1970-01-01
  • 2017-03-31
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
  • 2019-05-17
  • 2019-05-29
相关资源
最近更新 更多