Python 在Keras中使用CNN模型获得相当差的精度
我对机器学习非常陌生,我有一个CNN模型来分类7种仪器: {“巴松管”:0,“二胡”:1,“长笛”:2,“法国号”:3,“吉他”:4,“萨克斯管”:5,“小提琴”:6} 有1214张图像用于培训,1206张图像用于测试 这是我的模型: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
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%的准确率,