Python 在Keras中使用CNN模型获得相当差的精度

Python 在Keras中使用CNN模型获得相当差的精度,python,tensorflow,keras,Python,Tensorflow,Keras,我对机器学习非常陌生,我有一个CNN模型来分类7种仪器: {“巴松管”:0,“二胡”:1,“长笛”:2,“法国号”:3,“吉他”:4,“萨克斯管”:5,“小提琴”:6} 有1214张图像用于培训,1206张图像用于测试 这是我的模型: import tensorflow as tf from tensorflow.keras.preprocessing.image import ImageDataGenerator normalizedTrainingSet = ImageDataGener

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

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

这是我的模型:

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')
我得到的准确度是:

我想在以后添加纪元,因为该模型需要花费太多的时间来训练

谢谢你的帮助

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

更新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。从除第一层之外的所有层中删除输入_shape=(100100,3)。在含有142个神经元的致密层中,将激活改变为relu。对于测试类,请在\u目录中的flow\u中设置shuffle=False。您有少量的训练样本。我建议您在培训课程的ImageDataGenerator中使用图像增强。例如,设置水平翻转=真。关于添加增强的文档是

我没有与CNN打交道,但我不希望在152 s/38批次中有好的准确性。我怀疑你没有足够的训练数据。我想你需要数万个数据点。@Andrey,这有点帮助,但现在我想我有一个过度拟合的问题。。。。。。5ndG也许这是真的,我会最后一次更改数据集,因为一直以来,拥有
softmax
都是非常不寻常的,甚至到了疯狂的地步。另外,您的输出是一个二进制变量,它不适合您的目标。@dedObed谢谢您的帮助!我把大部分改成了relu,现在只有15%的准确率,