Keras的CNN模型的准确性差

时间:2020-10-25 10:36:34

标签: python tensorflow machine-learning keras cnn

我需要建议。当仅使用CIFAR10数据集的子集(仅使用10000个数据,每个类1000个)时,使用Keras构建CNN模型时,得到的结果非常差(准确度为10%)。如何提高准确性?我尝试更改/增加纪元,但结果仍然相同。这是我的CNN架构:

cnn = models.Sequential()
cnn.add(layers.Conv2D(25, (3, 3), input_shape=(32, 32, 3)))
cnn.add(layers.MaxPooling2D((2, 2)))
cnn.add(layers.Activation('relu'))
cnn.add(layers.Conv2D(50, (3, 3)))
cnn.add(layers.MaxPooling2D((2, 2)))
cnn.add(layers.Activation('relu'))
cnn.add(layers.Conv2D(100, (3, 3)))
cnn.add(layers.MaxPooling2D((2, 2)))
cnn.add(layers.Activation('relu'))
cnn.add(layers.Flatten())
cnn.add(layers.Dense(100))
cnn.add(layers.Activation('relu'))
cnn.add(layers.Dense(10))
cnn.add(layers.Activation('softmax'))

编译并拟合:

EPOCHS = 200
BATCH_SIZE = 10
LEARNING_RATE = 0.1

cnn.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=LEARNING_RATE),
            loss='binary_crossentropy',
            metrics=['accuracy'])

es = EarlyStopping(monitor='val_loss', mode='min', verbose=1)
mc = ModelCheckpoint(filepath=checkpoint_path, monitor='val_accuracy', mode='max', verbose=1, save_best_only=True)

history_cnn = cnn.fit(train_images, train_labels, epochs=EPOCHS, batch_size=BATCH_SIZE,
                validation_data=(test_images, test_labels),callbacks=[es, mc],verbose=0)

我使用的数据是CIFAR10,但每个类仅拍摄1000张图像,因此总数据仅为10000。我使用规范化对数据进行预处理。

1 个答案:

答案 0 :(得分:1)

首先,问题是损失。您的数据集是一个多类问题,而不是二进制且不是多标签的问题

here所述:

这些类是完全互斥的。没有重叠 在汽车和卡车之间。 “汽车”包括轿车,越野车, 这样的事情。 “卡车”仅包括大型卡车。都没有 包括皮卡车。

在这种情况下,建议使用categorical crossentropy。请记住,如果标签稀疏(用0到999之间的数字编码)而不是一个热编码矢量([0,0,0 ... 1,0,0]),则应使用{{1 }}。

  • 不稀疏(标签编码为矢量[0,0,1,.... 0])

    sparse categorical crossentropy
  • 稀疏(标签编码为(0,... 999)中的数字)

    cnn.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=LEARNING_RATE),
              loss='categorical_crossentropy',
              metrics=['accuracy'])
    

此外,学习率非常高(0.1)。我建议您从较低的(0.001)开始。

post也与您的问题有关

编辑:不好,对于过滤器数量来说,这是一种常见的方法,其中过滤器数量不断增加