【问题标题】:Keras error: expected dense_input_1 to have 3 dimensionsKeras 错误:预期 dense_input_1 具有 3 个维度
【发布时间】:2017-08-31 04:26:10
【问题描述】:

我正在 Keras 中尝试一个简单的模型,我想将它作为输入一个大小为 5x3 的矩阵。在下面的示例中,这是在添加第一个密集层时使用input_shape=(5, 3) 指定的。

from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.optimizers import Adam
import numpy as np


model = Sequential()
model.add(Dense(32, input_shape=(5, 3)))
model.add(Activation('relu'))
model.add(Dense(32))
model.add(Activation('relu'))
model.add(Dense(4))


adam = Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
model.compile(loss='mean_squared_error', optimizer=adam)


x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15]])


y = model.predict(x)

但是,当我运行代码时,model.predict() 函数给出以下错误:

ValueError: 检查时出错:预期的 dense_input_1 有 3 个维度,但得到的数组形状为 (5, 3)

但我不明白这个错误。 x 的形状是 (5, 3),这正是我告诉第一个密集层期望的输入。为什么它期望三个维度?看来这可能和batch size有关,但我以为input_shape只是指网络的形状,与batch size无关……

【问题讨论】:

    标签: tensorflow machine-learning neural-network deep-learning keras


    【解决方案1】:

    问题出在这里:

    model.add(Dense(32, input_shape=(5, 3)))
    

    应该是:

    model.add(Dense(32, input_shape=(3,)))
    

    第一个示例维度不包含在input_shape 中。也因为它实际上依赖于网络拟合期间设置的batch_size。如果你想指定你可以尝试:

    model.add(Dense(32, batch_input_shape=(5, 3)))
    

    编辑:

    根据您的评论,我了解到您希望您的输入具有shape=(5,3),在这种情况下您需要:

    1. reshape 你的x 通过设置:

      x = x.reshape((1, 5, 3))
      

      第一个维度来自示例。

    2. 您需要在某个阶段flatten 您的模型。这是因为没有它,您将通过网络传递2d 输入。我建议您执行以下操作:

      model = Sequential()
      model.add(Dense(32, input_shape=(5, 3)))
      model.add(Activation('relu'))
      model.add(Dense(32))
      model.add(Activation('relu'))
      model.add(Flatten())
      model.add(Dense(4))
      

    【讨论】:

    • 感谢您的建议。我尝试使用input_shape=(3,),但网络y 的输出随后具有形状(5、4)。因此,这表明它将x 视为大小为 5 的批次,每个条目的大小为 3。然后,输出 y 也是大小为 5 的批次,每个输出的大小为 4。但这不是我想要的是。我希望输入的形状为 (5, 3),这样当我运行 model.predict() 时,它会给我一个形状为 (1, 4) 的输出。
    【解决方案2】:

    当您使用 Sequential API 中的 add() 方法添加 Keras 层时,参数 input_shape 只关心输入数据的形状,而与 batch_size 无关。 因此,在您的情况下,您通过指定参数 input_shape = (5, 3) 向模型说明您想要 (5, 3) 的输入形状是正确的。
    然而,Keras 总是希望您分批提供输入数据,即使您选择批量大小为 1。这意味着您需要在输入中添加一个额外的维度,以使其具有第一个维度的三维是batch_size。你可以这样做:

    x = x[无,:,:]

    我认为这应该可以解决您的问题

    【讨论】:

      猜你喜欢
      • 2017-06-03
      • 2018-04-04
      • 2018-12-04
      • 2019-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-27
      • 1970-01-01
      相关资源
      最近更新 更多