我可以创建一个输入数据和目标数据不对称的 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=True
,y
也必须具有相同的时间步数。这就是导致不匹配的原因,因为 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=True
和 Conv1D
层来对时间步进行下采样:
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:]))
输入数据: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=True
,y
也必须具有相同的时间步数。这就是导致不匹配的原因,因为 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=True
和 Conv1D
层来对时间步进行下采样:
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:]))