Tensorflow Keras错误:预期密集输入有3个维度

Tensorflow Keras错误:预期密集输入有3个维度,tensorflow,machine-learning,neural-network,deep-learning,keras,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(D

我正在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:检查时出错:预期密集_输入_1有3个维度,但得到了形状为(5,3)的数组

但我不理解这个错误。
x
的形状是(5,3),这正是我告诉第一个密集层作为输入所期望的。因此,它为什么期待三维空间?这似乎与批量大小有关,但我认为
input\u shape
仅指网络的形状,与批量大小无关…

问题在于:

model.add(Dense(32, input_shape=(5, 3)))
应该是:

model.add(Dense(32, input_shape=(3,)))
第一个示例维度不包括在
输入\u形状中。还因为它实际上取决于网络拟合期间设置的批大小。如果要指定,可以尝试:

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

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

  • 通过以下设置重塑
    您的
    x

    x = x.reshape((1, 5, 3))
    
    其中第一维度来自示例

  • 您需要在某个阶段将模型展平。这是因为没有它,您将通过网络传递
    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))
    

  • 当使用顺序API中的add()方法添加Keras层时,参数input_shape只关心输入数据的形状,而不管批次大小。 因此,在您的案例中,通过指定参数input_shape=(5,3),您向模型声明希望输入形状为(5,3)是正确的。
    但是,Keras始终希望您成批提供输入数据,即使您选择的批量大小为1。这意味着您需要向输入中添加一个额外的维度,以使其成为三维的,第一个维度是批次大小。您可以这样做:

    x=x[无,:,:]


    我想这应该能解决你的问题

    谢谢你的建议。我尝试使用
    input\u shape=(3,)
    ,但是网络
    y
    的输出结果是shape(5,4)。因此,这表明它将
    x
    视为大小为5的批次,每个条目的大小为3。然后,输出
    y
    也是一个大小为5的批次,每个输出的大小为4。但这不是我想要的。我希望输入是形状(5,3),这样当我运行
    model.predict()
    时,它会给我一个形状(1,4)的输出。