数值错误:检查目标时出错:期望dense_2具有4个维度,但得到的数组形状为(7942, 1)。

3

我一直在使用以下功能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 不太熟悉的新手,可能出了什么问题呢?


如果X_train包含图像,那么这6400个值在图像中是如何分布的?高度、宽度和通道数是多少? - Daniel Möller
我正在从一个csv文件中读取特征值;每一行都包含6400个像素及其对应的标签;因此,我考虑的(高度、宽度、通道)是(1、6400、1)。 - Saurav--
这样行不通。如果它们是图像,那么它们是2D的,类似于(800,800,1)。 - Daniel Möller
是的,它们最初是80x80像素的图像,但我已经将所有像素强度值以1-D数组的形式列在csv文件中。那还是不行吗? - Saurav--
1个回答

4
该消息表示模型的输出与y_train不兼容。您的模型输出为(None, width, height, 1)。您应在卷积层之后添加一个Flatten()层,以使数据从此时起仅具有2个维度。
附加评论:
输入数据必须与模型兼容。
X_train的形状必须为(7942,80,80,1)。 模型的input_shape必须为(80,80,1)。
如果使用(1,6400,1)形状,则Conv2D层将非常无用,因为它无法将数据解释为2D图像。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接