Keras错误:期望dense_input_1有3个维度

时间:2017-04-05 13:50:20

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

我在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),这正是我所说的第一个密集层期望作为输入。为什么它期待三个维度?看来这可能与批量大小有关,但我认为input_shape仅指网络的形状,与批量大小无关......

2 个答案:

答案 0 :(得分:11)

问题在于:

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))
    

答案 1 :(得分:0)

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

x = x [None,:,:]

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