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

Kar*_*rus 10 machine-learning neural-network deep-learning keras tensorflow

我在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)
Run Code Online (Sandbox Code Playgroud)

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

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

但我不明白这个错误.形状x是(5,3),这正是我所说的第一个密集层期望作为输入.为什么它期待三个维度?看来这可能与批量大小有关,但我认为这input_shape仅仅是指网络的形状,与批量大小无关......

Mar*_*jko 12

问题在于:

model.add(Dense(32, input_shape=(5, 3)))
Run Code Online (Sandbox Code Playgroud)

它应该是:

model.add(Dense(32, input_shape=(3,)))
Run Code Online (Sandbox Code Playgroud)

第一个示例维度未包含在内input_shape.还因为它实际上取决于batch_size网络拟合期间的设置.如果您想指定,您可以尝试:

model.add(Dense(32, batch_input_shape=(5, 3)))
Run Code Online (Sandbox Code Playgroud)

编辑:

从您的评论我明白,您希望您的输入shape=(5,3)在这种情况下您需要:

  1. reshapex的设置:

    x = x.reshape((1, 5, 3))
    
    Run Code Online (Sandbox Code Playgroud)

    其中第一个维度来自示例.

  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))
    
    Run Code Online (Sandbox Code Playgroud)