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

我在Keras中尝试构建一个简单的模型,希望输入一个大小为5×3的矩阵。在下面的例子中,通过在添加第一个全连接层时使用input_shape=(5, 3)来指定这一点。

from keras.models import Sequentialfrom keras.layers import Dense, Activationfrom keras.optimizers import Adamimport numpy as npmodel = 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: Error when checking : expected dense_input_1 to have 3 dimensions, but got array with shape (5, 3)

但我不明白这个错误。变量x的形状是(5, 3),这正是我告诉第一个全连接层期望的输入形状。为什么它因此期望三个维度?这似乎可能与批量大小有关,但我以为input_shape仅指网络的形状,与批量大小无关…


回答:

问题出在这里:

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

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注