ValueError:simple_rnn_1层的输入0与该层不兼容:预期ndim = 3,找到的ndim = 2。收到完整的形状:[无,50]

时间:2020-04-18 15:33:39

标签: python-3.x tensorflow machine-learning keras deep-learning

我是张量流的新手,我正在尝试建立一个多变量(每个时间步具有两个特征)多步(未来将预测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维张量。但我认为我的投入具有这一方面。 非常感谢您的帮助。 如果您需要我与您分享我如何创建数据集,我会很乐意这样做。

2 个答案:

答案 0 :(得分:0)

问题来自第二层而不是第一层。基本上,第一层的激活发出一个向量而不是序列,因此它的等级为2,例如:(a,b)。但是第二层需要三维输入。为了解决这个问题,我在RNN的第一层中添加了return_sequences = True。

答案 1 :(得分:0)

如果train_setnumpy数组,请将train_set.reshape((1,50))传递给model.fit()

model.fit(train_set.reshape((1,50)), epochs=5,
      validation_data=valid_set)

然后,您也不需要将return_sequences=True应用于第一个RNN单元。