嵌入N维序列后的LSTM
LSTM after embedding of a N-dimensional sequence
我有一个二维 train_seq
形状为 (100000, 200, 2)
的输入序列,即 100000 个训练示例,序列长度为 200,以及 2 个特征。
序列是文本,因此每个元素是一个单词,词汇量为 5000 个单词。因此,我想在 LSTM 之前使用嵌入层。
MAX_SEQUENCE_LENGTH = 200
EMBEDDING_SIZE = 64
MAX_FEATURES = 5000
NUM_CATEGORIES = 5
model_input = Input(shape=(MAX_SEQUENCE_LENGTH,2))
x = Embedding(output_dim=EMBEDDING_SIZE, input_dim=MAX_FEATURES, input_length=(MAX_SEQUENCE_LENGTH,2))(model_input)
x_lstm = LSTM(64)(x)
x = Dense(128, activation='relu', name = 'lstm')(x_lstm)
output = Dense(NUM_CATEGORIES, activation='sigmoid')(x)
model = Model(inputs=[model_input], outputs=[output])
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
但是,我无法构建模型并收到以下错误:
ValueError: Input 0 is incompatible with layer lstm: expected ndim=3, found ndim=4
。通过查看没有 LSTM 的模型摘要,我可以看到我的嵌入的输出形状是 (None, 200, 2, 64)
Layer (type) Output Shape Param #
=================================================================
merged_input (InputLayer) (None, 200, 2) 0
_________________________________________________________________
embedding (Embedding) (None, 200, 2, 64) 196096
_________________________________________________________________
请注意,此体系结构在输入序列为一维时有效。 LSTM 可以接收二维序列吗?如何告诉 LSTM 层输入形状是 (None, 200, 2, 64)
?
如有任何帮助,我们将不胜感激
首先不要定义输入层,你不需要它。一般来说Embedding层是这样使用的:
model = Sequential()
model.add(Embedding(MAX_FEATURES, EMBEDDING_SIZE , input_length=MAX_SEQUENCE_LENGTH ))
model.add(LSTM(64))
(...)
函数式样式定义也是如此,试试吧。
解决方案是将输入形状添加到 LSTM 层:
x_lstm = LSTM(64, input_shape=(MAX_SEQUENCE_LENGTH,2))(x)
后面是 Flatten 层
x = Flatten()(x_lstm)
我有一个二维 train_seq
形状为 (100000, 200, 2)
的输入序列,即 100000 个训练示例,序列长度为 200,以及 2 个特征。
序列是文本,因此每个元素是一个单词,词汇量为 5000 个单词。因此,我想在 LSTM 之前使用嵌入层。
MAX_SEQUENCE_LENGTH = 200
EMBEDDING_SIZE = 64
MAX_FEATURES = 5000
NUM_CATEGORIES = 5
model_input = Input(shape=(MAX_SEQUENCE_LENGTH,2))
x = Embedding(output_dim=EMBEDDING_SIZE, input_dim=MAX_FEATURES, input_length=(MAX_SEQUENCE_LENGTH,2))(model_input)
x_lstm = LSTM(64)(x)
x = Dense(128, activation='relu', name = 'lstm')(x_lstm)
output = Dense(NUM_CATEGORIES, activation='sigmoid')(x)
model = Model(inputs=[model_input], outputs=[output])
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
但是,我无法构建模型并收到以下错误:
ValueError: Input 0 is incompatible with layer lstm: expected ndim=3, found ndim=4
。通过查看没有 LSTM 的模型摘要,我可以看到我的嵌入的输出形状是 (None, 200, 2, 64)
Layer (type) Output Shape Param #
=================================================================
merged_input (InputLayer) (None, 200, 2) 0
_________________________________________________________________
embedding (Embedding) (None, 200, 2, 64) 196096
_________________________________________________________________
请注意,此体系结构在输入序列为一维时有效。 LSTM 可以接收二维序列吗?如何告诉 LSTM 层输入形状是 (None, 200, 2, 64)
?
如有任何帮助,我们将不胜感激
首先不要定义输入层,你不需要它。一般来说Embedding层是这样使用的:
model = Sequential()
model.add(Embedding(MAX_FEATURES, EMBEDDING_SIZE , input_length=MAX_SEQUENCE_LENGTH ))
model.add(LSTM(64))
(...)
函数式样式定义也是如此,试试吧。
解决方案是将输入形状添加到 LSTM 层:
x_lstm = LSTM(64, input_shape=(MAX_SEQUENCE_LENGTH,2))(x)
后面是 Flatten 层
x = Flatten()(x_lstm)