ValueError:层顺序的输入0与层不兼容::预期的min_ndim = 4,发现ndim = 2。收到的完整形状:(无,1024)

Posted

技术标签:

【中文标题】ValueError:层顺序的输入0与层不兼容::预期的min_ndim = 4,发现ndim = 2。收到的完整形状:(无,1024)【英文标题】:ValueError: Input 0 of layer sequential_7 is incompatible with the layer: : expected min_ndim=4, found ndim=2. Full shape received: (None, 1024) 【发布时间】:2021-09-04 17:56:15 【问题描述】:

这里是新的 Python 开发人员。我在这里查看了其他类似的帖子,但我无法正确理解。将不胜感激。

print('X_train:', X_train.shape)
print('y_train:', y_train1.shape)
print('X_test:', X_train.shape)
print('y_test:', y_train1.shape)

X_train: (42000, 32, 32) y_train: (42000,) X_test: (42000, 32, 32) y_test: (42000,)

from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D
def featuremodel() :
    model = Sequential()
    model.add(Conv2D(32, kernel_size=4, activation='relu', input_shape=(X_train.shape[0],32,64)))
    model.add(MaxPooling2D(pool_size=3))
    model.add(Conv2D(64, kernel_size=4, activation='relu'))
    model.add(Flatten())
    model.add(Dense(len(y_train[0]), activation='softmax'))
    model.compile(loss='categorical_crossentropy',
          optimizer='adadelta',      
          metrics=['acc'])
    model.summary()
    model.fit(X_train, y_train, epochs = 10, validation_data = (X_test,y_test))

返回模型

ValueError:layersequential_7 的输入 0 与 layer 不兼容::预期 min_ndim=4,发现 ndim=2。收到的完整形状:(无,1024)

【问题讨论】:

这能回答你的问题吗? ValueError: Input 0 of layer sequential is incompatible with the layer: : expected min_ndim=4, found ndim=2. Full shape received: [None, 2584] 是的,看起来不错,我明白了这个问题 - 但不知道我做错了什么。谢谢。 您的输入形状不正确。你有 42000 个样本,每个样本有 32,32 个形状。所以输入的形状应该是(32,32)。 【参考方案1】:

您指定的输入形状应更改。您的输入有 42000 个样本,每个样本都有 (32,32) 形状。您不应该将样本数量(42000) 传递给输入层,并且应该添加通道维度。所以输入的形状应该是(32,32,1)

修改后的代码应该是这样的:

from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D

# test data
X_train = tf.random.uniform((42000,32,32))  
y_train1 = tf.random.uniform((42000,))

X_train = tf.expand_dims(X_train, axis=3)    #add channel axis (42000,32,32) => (42000,32,32,1) 

model = Sequential()
model.add(Conv2D(32, kernel_size=4, activation='relu', input_shape=(32,32,1))) #change input shape
model.add(MaxPooling2D(pool_size=3))
model.add(Conv2D(64, kernel_size=4, activation='relu'))
model.add(Flatten())
#last layer should have output like your y data. in this case it should be 1, since you have 1 y for each sample
model.add(Dense(1, activation='softmax'))  
model.compile(loss='categorical_crossentropy',
      optimizer='adadelta',      
      metrics=['acc'])
model.summary()
model.fit(X_train, y_train1, epochs = 10) #, validation_data = (X_test,y_test))

【讨论】:

谢谢,这有助于解释我做错了什么。

以上是关于ValueError:层顺序的输入0与层不兼容::预期的min_ndim = 4,发现ndim = 2。收到的完整形状:(无,1024)的主要内容,如果未能解决你的问题,请参考以下文章

ValueError:层顺序的输入 0 与层不兼容::预期 min_ndim=4,发现 ndim=3。收到的完整形状:[8, 28, 28]

ValueError:层顺序的输入0与层不兼容::预期的min_ndim = 4,发现ndim = 2。收到的完整形状:(无,1024)

ValueError: 层 lstm_12 的输入 0 与层不兼容:预期 ndim=3,发现 ndim=4

ValueError: 层序号_29 的输入 0 与层不兼容:预期 ndim=3,发现 ndim=2。收到的完整形状:[无,22]

ValueError: 层 lstm_21 的输入 0 与层不兼容:预期 ndim=3,发现 ndim=2。收到的完整形状:(无,546)

DNN 中的错误:层序贯_10 的输入 0 与层不兼容