繁体   English   中英

在 Keras 中使用 CNN Model 获得相当差的准确度

[英]Getting pretty bad accuracy using CNN Model in Keras

我对机器学习非常陌生,我有这个 CNN Model 来分类 7 种乐器:{'巴松管':0,'二胡':1,'长笛':2,'法国号':3,'吉他':4 , '萨克斯': 5, '小提琴': 6}

有 1214 张图像用于训练,1206 张图像用于测试

这是我的 model:

import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator


normalizedTrainingSet = ImageDataGenerator(rescale=1 / 255)
normalizedTestingSet = ImageDataGenerator(rescale=1 / 255)


trainingClass = normalizedTrainingSet.flow_from_directory("DataSet/Training",
                                                          target_size=(100, 100),
                                                          batch_size=32,
                                                          class_mode="categorical",
                                                          shuffle=True)

testingClass = normalizedTrainingSet.flow_from_directory("DataSet/Testing",
                                                         target_size=(100, 100),
                                                         batch_size=32,
                                                         class_mode="categorical",
                                                         shuffle=True)

print(trainingClass.class_indices)
print(testingClass.class_indices)

model = tf.keras.models.Sequential \
        ([
        tf.keras.layers.Conv2D(200, (3, 3), activation="softmax", input_shape=(100, 100, 3)),
        tf.keras.layers.MaxPool2D(2, 2),
        tf.keras.layers.Conv2D(200, (3, 3), activation="softmax", input_shape=(100, 100, 3)),
        tf.keras.layers.MaxPool2D(2, 2),
        tf.keras.layers.Conv2D(200, (3, 3), activation="softmax", input_shape=(100, 100, 3)),
        tf.keras.layers.MaxPool2D(2, 2),
        tf.keras.layers.Conv2D(200, (3, 3), activation="softmax", input_shape=(100, 100, 3)),
        tf.keras.layers.MaxPool2D(2, 2),
        tf.keras.layers.Flatten(),
        tf.keras.layers.Dense(142, activation="softmax"),
        tf.keras.layers.Dense(1, activation="sigmoid")
    ])

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

fittedModel = model.fit(trainingClass, epochs=1, batch_size=100, validation_data=testingClass, shuffle=True)

model.save('newModel')

我得到的准确性是: 在此处输入图像描述

我想稍后添加 epoch,因为 model 将花费太多时间来训练!

谢谢帮忙!!

更新:我删除了批量大小,得到了惊人的 85%,但是预测是错误的,如果我告诉 model 对训练数据集中的图像进行预测,它就会大错特错......

更新2:我将softmax更改为relu,现在我的准确率是15%......

import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator


normalizedTrainingSet = ImageDataGenerator(rescale=1 / 255)
normalizedTestingSet = ImageDataGenerator(rescale=1 / 255)


trainingClass = normalizedTrainingSet.flow_from_directory("DataSet/Training",
                                                          target_size=(100, 100),
                                                          class_mode="categorical",
                                                          shuffle=True)

testingClass = normalizedTrainingSet.flow_from_directory("DataSet/Testing",
                                                         target_size=(100, 100),
                                                         class_mode="categorical",
                                                         shuffle=True)

print(trainingClass.class_indices)
print(testingClass.class_indices)

model = tf.keras.models.Sequential \
        ([
        tf.keras.layers.Conv2D(200, (3, 3), activation="relu", input_shape=(100, 100, 3)),
        tf.keras.layers.MaxPool2D(2, 2),
        tf.keras.layers.Conv2D(200, (3, 3), activation="relu", input_shape=(100, 100, 3)),
        tf.keras.layers.MaxPool2D(2, 2),
        tf.keras.layers.Conv2D(200, (3, 3), activation="relu", input_shape=(100, 100, 3)),
        tf.keras.layers.MaxPool2D(2, 2),
        tf.keras.layers.Conv2D(200, (3, 3), activation="relu", input_shape=(100, 100, 3)),
        tf.keras.layers.MaxPool2D(2, 2),
        tf.keras.layers.Flatten(),
        tf.keras.layers.Dense(142, activation="softmax"),
        tf.keras.layers.Dense(7, activation="sigmoid")
    ])

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

fittedModel = model.fit(trainingClass, epochs=1, validation_data=testingClass, shuffle=True)

model.save('newModel')

您的最终分类层应该有 7 个神经元。 该层的激活应该是 softmax 而不是 sigmoid。 从除第一层之外的所有层中删除 input_shape=(100, 100, 3)。 在具有 142 个神经元的密集层中将激活更改为 relu。 对于 testing_Class 在 flow_from_directory 中设置 shuffle=False。 你有少量的训练样本。 我建议您在训练类的 ImageDataGenerator 中使用图像增强。 例如设置horizontal_flip=True。 关于添加增强的文档在这里。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM