簡體   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