我可以创建一个输入数据和目标数据不对称的 LSTM 吗?

Can I create an LSTM where the input data and the target data are asymmetric?

输入数据:x.shape = (500, 20, 1)

目标数据:y.shape = (500, 5, 1)

我创建了以下模型:

model = Sequential()
model.add(LSTM(units = 64, input_shape=(20, 1), return_sequences = True))
model.add(Dense(units=1))
model.compile(loss='mae', optimizer='adam')
model.fit(x, y, epochs=1000, batch_size=1)

但我收到此错误:

ValueError: Dimensions must be equal, but are 20 and 5 for '{{node mean_absolute_error/sub}} = Sub[T=DT_FLOAT](sequential/dense/BiasAdd, IteratorGetNext:1)' with input shapes: [1,20,1], [1,5,1].

有办法解决这个问题吗?

如果您使用 return_sequences=Truey 也必须具有相同的时间步数。这就是导致不匹配的原因,因为 x 有 20 而 y 5。您有几个选项可以试验:

选项 1:

您可以尝试使用 tf.keras.layers.RepeatVector:

import tensorflow as tf

x = tf.random.normal(((500, 20, 1)))
y = tf.random.normal(((500, 5, 1)))
model = tf.keras.Sequential()
model.add(tf.keras.layers.LSTM(units = 64, input_shape=(20, 1), return_sequences = False))
model.add(tf.keras.layers.RepeatVector(5))
model.add(tf.keras.layers.Dense(units=1))
model.compile(loss='mae', optimizer='adam')
model.fit(x, y, epochs=1000, batch_size=1)

选项 2:

您可以使用 return_sequences=TrueConv1D 层来对时间步进行下采样:

x = tf.random.normal(((500, 20, 1)))
y = tf.random.normal(((500, 5, 1)))
model = tf.keras.Sequential()
model.add(tf.keras.layers.LSTM(units = 64, input_shape=(20, 1), return_sequences = True))
model.add(tf.keras.layers.Conv1D(32, 16))
model.add(tf.keras.layers.Dense(units=1))
model.compile(loss='mae', optimizer='adam')
model.fit(x, y, epochs=1000, batch_size=1)

选项 3:

您可以使用 tf.keras.layers.Flatten() 然后重塑您的张量以获得正确的输出形状:

x = tf.random.normal(((500, 20, 1)))
y = tf.random.normal(((500, 5, 1)))
model = tf.keras.Sequential()
model.add(tf.keras.layers.LSTM(units = 64, input_shape=(20, 1), return_sequences = True))
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(5))
model.add(tf.keras.layers.Reshape(y.shape[1:]))