首页 > 解决方案 > 使用双向 LSTM 的形状的 ValueError

问题描述

我正在尝试为序列到序列模型实现双向 LSTM。我已经对我的序列进行了一次热编码,共有 12 个特征。输入为 11 步,输出为 23 步。首先,我编写了这个 LSTM 实现,它使用第一个 LSTM 作为编码器,第二个作为解码器。

model = Sequential()
model.add(LSTM(75, input_shape=(11, 12)))
model.add(RepeatVector(23))
model.add(LSTM(50, return_sequences=True))
model.add(TimeDistributed(Dense(12, activation='softmax')))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()
X, y = generate_data(1, taskset, trainset)
model.fit(X, y, epochs=1, batch_size=32, verbose=1)

然后我尝试将其转换为双向 LSTM,如下所示:

model = Sequential()
model.add(Bidirectional(LSTM(75, return_sequences=True), input_shape=(11,12), merge_mode='concat'))
model.add(Bidirectional(LSTM(50, return_sequences=True)))
model.add(TimeDistributed(Dense(12, activation='softmax')))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics= ['accuracy'])
model.summary()
X, y = generate_data(1, taskset, trainset)
model.fit(X, y, epochs=1, batch_size=32, verbose=1)

目标是使用第一个双向 LSTM 作为编码器,第二个双向 LSTM 作为解码器。我在双向实现中删除了RepeatVector,因为它给了我一个尺寸错误(需要dim = 2,收到dim = 3)。使用当前的双向 LSTM,我收到此错误:

ValueError: Shapes (None, 23, 12) and (None, 11, 12) are incompatible

对于修复双向 LSTM 实现的任何帮助,我将不胜感激!

标签: pythontensorflowkeraslstmbidirectional

解决方案


只需设置您的第一个双向LSTMreturn_sequences=False并像以前一样添加即可RepeatVector(23)

n_sample = 10
X = np.random.uniform(0,1, (n_sample, 11, 12))
y = np.random.randint(0,2, (n_sample, 23, 12))

model = Sequential()
model.add(Bidirectional(LSTM(75), input_shape=(11,12), merge_mode='concat'))
model.add(RepeatVector(23))
model.add(Bidirectional(LSTM(50, return_sequences=True)))
model.add(TimeDistributed(Dense(12, activation='softmax')))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics= ['accuracy'])

model.fit(X, y, epochs=3, batch_size=32, verbose=1)

推荐阅读