首页 > 解决方案 > 检查目标时出错:预期 dense_18 的形状为 (1,) 但得到的数组的形状为 (10,)

问题描述

  Y_train = to_categorical(Y_train, num_classes = 10)#
    random_seed = 2
    X_train,X_val,Y_train,Y_val = train_test_split(X_train, Y_train, test_size = 0.1, random_state=random_seed)
    Y_train.shape
    model = Sequential()

    model.add(Flatten())
    model.add(Dense(64, activation='relu'))
    model.add(Dense(128, activation='relu'))
    model.add(Dense(10, activation='softmax'))
    model.compile(optimizer = 'adam', loss = 'sparse_categorical_crossentropy',metrics=['accuracy'])

    model.fit(X_train, Y_train, batch_size = 86, epochs = 3,validation_data = (X_val, Y_val), verbose =2)

我必须将 MNIST 数据分为 10 个类。我正在将 Y_train 转换为一个热编码数组。我已经经历了许多答案,但没有一个有帮助。请在这方面指导我,因为我是 ML 和神经网络的新手。

标签: tensorflowmachine-learningneural-network

解决方案


似乎没有必要model.add(Flatten())在您的第一层使用。代替这样做,您可以使用具有特定输入大小的密集层,例如:model.add(Dense(64, input_shape=your_input_shape, activation="relu").

为确保由于层而发生此问题,您可以检查to_categorical()函数是否单独与 jupyter notebook 一起使用。

更新的答案

在模型之前,你应该重塑你的模型。在那种情况下,28 * 28 到 784。

train_images = train_images.reshape((-1, 784))
test_images = test_images.reshape((-1, 784))

我还建议通过简单地将图像划分为 255 来规范化可以完成的数据

在该步骤之后,您应该创建模型。

model = Sequential([
Dense(64, activation='relu', input_shape=(784,)),
Dense(64, activation='relu'),
Dense(10, activation='softmax'),
])

你有没有注意到input_shape=(784,)那是你扁平化输入的形状。

最后一步,编译和拟合。

model.compile(
optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'],
)

model.fit(
train_images,
train_labels,
epochs=10,
batch_size=16,
)

您所做的是您刚刚展平了输入层,而没有向网络提供输入。这就是您遇到问题的原因。关键是您应该手动重塑输入并使用参数前馈给Dense()图层input_shape


推荐阅读