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