[英]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.