我一直在使用以下功能API进行使用CNN的图像分类任务:
def create_model(X_train, X_test):
visible = Input(shape=(X_train.shape[0], X_train.shape[1], 1))
conv1 = Conv2D(32, kernel_size=4, activation='relu')(visible)
hidden1 = Dense(10, activation='relu')(pool2)
output = Dense(1, activation='sigmoid')(hidden1)
model = Model(inputs = visible, outputs = output)
model.compile(loss='binary_crossentropy',
optimizer='rmsprop',
metrics=['accuracy'])
return model
X_tr = np.reshape(X_train, (1,X_train.shape[0], X_train.shape[1], 1))
X_te = np.reshape(X_test, (1,X_test.shape[0], X_test.shape[1], 1))
model = create_model(X_train, X_test)
model.fit(X_tr, y_train, validation_split = 0.1, batch_size=10, epochs=10, verbose = 1, callbacks=[EarlyStopping(patience=5,verbose=1)])
其中,X_train
是一个7942 * 6400维度列表,y_train
是一个带有相应7942标签的一维列表。
错误:
ValueError:检查目标时出错:期望dense_2有4 尺寸,但得到形状的阵列(7942,1)
由于我是功能API的新手,这里可能出了什么问题?
答案 0 :(得分:1)
消息显示y_train
与模型的输出不兼容。
您的模型正在输出(None, width, height, 1)
。您应该在卷积后添加Flatten()
图层,以使数据从此时起只有2个维度。
补充意见:
输入数据必须具有与模型兼容的形状。
X_train
的形状必须为(7942,80,80,1)
模型的input_shape
必须为(80,80,1)
如果使用(1,6400, 1)
形状,则Conv2D
图层将毫无用处,因为它无法将数据作为2D图像进行解释。