我是新手 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 Sequentialfrom keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2Ddef 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))
return model
ValueError: 层 sequential_7 的输入 0 与层不兼容:期望的最小维度为 4,但发现的维度为 2。接收到的完整形状为:(None, 1024)
回答:
您指定的输入形状需要更改。您的输入有 42000 个样本,每个样本的形状为 (32,32)
。您不应该将样本数量 (42000)
传递给输入层,并且您需要添加一个通道维度。因此,输入形状应该是 (32,32,1)
。
修改后的代码应如下所示:
from keras.models import Sequentialfrom keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D# 测试数据X_train = tf.random.uniform((42000,32,32)) y_train1 = tf.random.uniform((42000,))X_train = tf.expand_dims(X_train, axis=3) #添加通道轴 (42000,32,32) => (42000,32,32,1) model = Sequential()model.add(Conv2D(32, kernel_size=4, activation='relu', input_shape=(32,32,1))) #更改输入形状model.add(MaxPooling2D(pool_size=3))model.add(Conv2D(64, kernel_size=4, activation='relu'))model.add(Flatten())#最后一层应该有与您的 y 数据相似的输出。在这种情况下,它应该是 1,因为每个样本有一个 ymodel.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))