Keras Input_shape形状错误

时间:2018-07-11 15:00:14

标签: python input keras shape

当我运行以下代码时:

from keras import models
from keras import layers
from keras import optimizers
model = models.Sequential()
model.add(layers.Dense(256, activation='relu', input_shape = (4, 4, 512)))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(1, activation='sigmoid'))
model.compile(optimizer=optimizers.RMSprop(lr=2e-5),
                loss='binary_crossentropy',
                metrics=['acc'])
model.summary()
history = model.fit(train_features, train_labels,
                    epochs=30,
                    batch_size=20,
                    validation_data=(validation_features, validation_labels))

我收到此错误:

ValueError: Error when checking input: expected dense_40_input to have 2 dimensions, but got array with shape (2000, 4, 4, 512)

以下是训练和验证数据的形状:

print(train_features.shape, train_labels.shape, validation_features.shape, validation_labels.shape)

输出:

(2000, 4, 4, 512) (2000,) (1000, 4, 4, 512) (1000,)

这是怎么回事?我的训练和验证形状应与我刚才指定的相同。即使更改为input_dim = 4*4*512,我仍然会收到错误消息。

model.summary():的输出

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_42 (Dense)             (None, 4, 4, 256)         131328    
_________________________________________________________________
dropout_19 (Dropout)         (None, 4, 4, 256)         0         
_________________________________________________________________
dense_43 (Dense)             (None, 4, 4, 1)           257       
=================================================================
Total params: 131,585
Trainable params: 131,585
Non-trainable params: 0
_________________________________________________________________

我的Keras版本是2.1.6。

2 个答案:

答案 0 :(得分:0)

您可以在模型摘要中看到,最后一层的输出形状为(None, 4, 4, 1),并且由于每个样本只有一个标签,因此最后一层的输出形状应为(None, 1)。因此,您必须先将训练数据整形,然后再将其馈送到网络或将第一层Dense层的输出展平(或可以添加Reshape层作为第一层)。

方法1):重塑培训和验证数据:

train_features = train_features.reshape((2000, -1))
validation_features = validation_features.reshape((1000, -1))

model = models.Sequential()
model.add(layers.Dense(256, activation='relu', input_dim=train_features.shape[-1]))
# ... the rest is the same

方法2):添加一个Flatten层:

model = models.Sequential()
model.add(layers.Dense(256, activation='relu', input_shape = (4, 4, 512)))
model.add(layers.Flatten())
# ... the rest is the same

我推荐第一种方法(除非您有充分的理由选择第二种方法),因为根据该层的Dense layer documentation输入,其等级大于2(即3D,4D等)。 )在涂抹点积之前先弄平。并且考虑到您在第二种方法中应用了另一个扁平化操作,这可能不如直接使用2D张量进给它有效(尽管我本人尚未确认,但这只是一个疯狂的猜测!)。 { {3}},并且“密集”层的输入未展平,而是应用于最后一个轴。


请注意:您收到的错误有点奇怪。在我的计算机上运行代码时,我没有得到。相反,我抱怨最后一层的输出形状与标签形状不兼容(我在上面解决了)。

答案 1 :(得分:0)

在使用Dense()之前,应调用Flatten()。 错误很明显,当您为它装上4个昏暗的物体时,密网期望2个昏暗的物体。

model = models.Sequential()
model.add(Flattern(input_shape = (4, 4, 512)))
model.add(layers.Dense(256, activation='relu'))