我有一个具有N个要素(维度)的多维时间序列数据集。我正在构建一个具有N个输入通道(每个功能一个)的CNN-LSTM模型。首先,模型应在每个要素上执行一维卷积,然后合并输出并将其馈送到LSTM层。但是,我在尺寸方面遇到了问题(我怀疑这是潜在的问题),即合并的输出尺寸不是预期的。
我在每个功能上都尝试过Flatten(),但是它返回了(?,?),而Reshape()似乎也没有用。
# Init the multichannel CNN-LSTM proto.
def mccnn_lstm(steps=window, feats=features, dim=1, f=filters, k=kernel, p=pool):
channels, convs = [], []
# Multichannel CNN layer
for i in range(feats):
chan = Input(shape=(steps, dim))
conv = Conv1D(filters=f, kernel_size=k, activation="tanh")(chan)
maxpool = MaxPooling1D(pool_size=p, strides=1)(conv) # Has shape (?, 8, 64)
flat = Flatten()(maxpool) # Returns (?, ?), not (?, 8*64) as expected
channels.append(chan)
convs.append(flat)
merged = concatenate(convs) # Returns (?, ?), would expect a tensor like (?, 8*64, num of channels)
# LSTM layer
lstm = TimeDistributed(merged)
lstm = LSTM(64)(merged) # This line raises the error
dense = Dense(1, activation="sigmoid")(lstm)
return Model(inputs=channels, outputs=dense)
model = mccnn_lstm()
错误消息:
ValueError: Input 0 is incompatible with layer lstm_1: expected ndim=3, found ndim=2
我希望多通道层的合并输出具有尺寸(?,8 * 64,通道数)或类似尺寸,然后将成为LSTM层的输入。
答案 0 :(得分:0)
您在使用Keras吗?在这种情况下,您没有创建任何Sequential()
模型。这可能是导致错误的原因。请让我知道。
-
编辑:
我认为该模型不需要Flatten()
。 Flatten旨在将conv2D()
层的输出馈送到Dense()
层,即将2维对象平整为1维向量。但是,如果您已经使用conv1D
进行一维工作,则不需要Flatten()
。