我是张量流的新手,我正在尝试建立一个多变量(每个时间步具有两个特征)多步(未来将预测12个时间步)预测模型。
我创建了tensorflow数据集以将其提供给我的模型: 当我打印数据集的形状时,会发现以下内容:
<PrefetchDataset shapes: ((None, None, 2), (None, None)), types: (tf.float32, tf.float32)>
这是我的理解:
(None, None, 2) = Input tensor "features" : (batchSize, Timesteps input, Features by time step)
(None, None) =Output Tensor "label" (batchSize, future forecsated time steps )
我按照以下步骤创建模型:
keras.backend.clear_session()
tf.random.set_seed(42)
np.random.seed(42)
model = keras.models.Sequential([
keras.layers.SimpleRNN(50),
keras.layers.SimpleRNN(100),
keras.layers.Dense(12),
])
optimizer = keras.optimizers.SGD(lr=1.5e-6, momentum=0.9)
model.compile(loss="mae",
optimizer=optimizer,
metrics=["mae"])
当我适合模型
model.fit(train_set, epochs=5,
validation_data=valid_set)
我遇到以下错误:
ValueError: Input 0 of layer simple_rnn_1 is incompatible with the layer: expected ndim=3, found ndim=2. Full shape received: [None, 50]
我确实了解SimpleRNN层期望3维张量。但我认为我的投入具有这一方面。 非常感谢您的帮助。 如果您需要我与您分享我如何创建数据集,我会很乐意这样做。
答案 0 :(得分:0)
问题来自第二层而不是第一层。基本上,第一层的激活发出一个向量而不是序列,因此它的等级为2,例如:(a,b)。但是第二层需要三维输入。为了解决这个问题,我在RNN的第一层中添加了return_sequences = True。
答案 1 :(得分:0)
如果train_set
是numpy
数组,请将train_set.reshape((1,50))
传递给model.fit()
model.fit(train_set.reshape((1,50)), epochs=5,
validation_data=valid_set)
然后,您也不需要将return_sequences=True
应用于第一个RNN单元。