3

我想在Keras中尝试一个简单的模型,我想将其作为输入大小为5x3的矩阵。在下面的示例中,在添加第一个致密层时,通过使用input_shape=(5, 3)来指定。Keras错误:期望dense_input_1有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: Error when checking : expected dense_input_1 to have 3 dimensions, but got array with shape (5, 3)

但我不理解的错误。 x的形状是(5,3),这正是我告诉第一个密集层期望的输入。为什么因此期待三个维度?看起来这可能与批量大小有关,但我认为input_shape只是指网络的形状,与批量大小无关......

回答

4

问题出在这里:

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

感谢您的建议。我尝试过使用'input_shape =(3,)',但是网络'y'的输出已经变形了(5,4)。因此,这表明它将'x'视为一个大小为5的批次,每个条目的大小为3.然后,输出'y'也是一个大小为5的批次,每个输出的大小为4。我想要的是。我希望输入是形状(5,3),这样当我运行'model.predict()'时,它会给出形状输出(1,4)。 – Karnivaurus

相关问题