簡體   English   中英

多類分類 model 未正確訓練。 為什么訓練損失是恆定的?

[英]Multiclass Classification model not training properly. Why is the training loss constant?

我正在嘗試使用 keras 訓練 model 以進行多類分類。 有 5 個類別可供預測。 這是一個圖像分類問題,前面提到有五類圖像,卧室、浴室、客廳、餐廳和廚房。 問題是 model 似乎沒有學習,它總是停留在 20% 的准確度上,並且損失從 epoch 1 開始永遠不會改變。我正在使用來自 Xception model 的卷積基礎,上面有我的分類器。 使用 tf.data API 設置訓練、測試和驗證數據集。

有人可以指出我做錯了什么嗎?

這是數據集生成

train_dir = "House_Dataset/Train"
valid_dir = "House_Dataset/Valid"
test_dir = "House_Dataset/Test"

train_ds = trainAug.flow_from_directory(
        train_dir,
        target_size=(224,224),
        shuffle= False,
        class_mode= "sparse"
)
valid_ds = image_dataset_from_directory(
        valid_dir,
        image_size=(224,224),
        shuffle=False,
        
)

test_ds = image_dataset_from_directory(
        test_dir,
        image_size=(224,224),
        shuffle=False,
        
)

這是異常卷積基的導入。

conv_base = keras.applications.Xception(include_top=False, weights="imagenet", input_shape=(224,224,3))
conv_base.trainable = False

這是 model 構建 function。

def pre_trained():
    
    inputs = keras.Input(shape=(224,224,3))
    #x = data_augmentation(inputs)
    x = keras.applications.xception.preprocess_input(inputs)
    x = conv_base(x)
    x = layers.GlobalAveragePooling2D()(x)
    x = layers.BatchNormalization()(x)
    x = layers.Dropout(0.5)(x)
    outputs = layers.Dense(5, activation = "softmax")(x)
    
    
    
    
    model = keras.Model(inputs, outputs)
    
    model.compile(optimizer="rmsprop", loss="sparse_categorical_crossentropy", metrics = ["accuracy"])
    
    return model

培訓 function 來電

history = pre_trained_model.fit(train_ds, epochs=25)

這是時代的圖景。

在此處輸入圖像描述

試試我的 cnn 網絡,看看你是否能得到 87% 的准確率。 cnn 提取每一層的特征作為過濾器。 然后過濾器饋送到類別softmax function。

model=Sequential()

model.add(Conv2D(32, (3,3),activation='relu',input_shape=(IMG_SIZE,IMG_SIZE,3)))
#model.add(Dropout(0.25))
model.add(MaxPooling2D(2))

#model.add(BatchNormalization())
model.add(Conv2D(64, (3,3), activation="relu"))
model.add(MaxPooling2D(2,2))
model.add(Conv2D(128, (3,3), activation="relu"))
model.add(MaxPooling2D(2,2))
model.add(Conv2D(128, (3,3), activation="relu"))
model.add(MaxPooling2D(2,2))
#model.add(BatchNormalization())
model.add(Flatten())
model.add(Dropout(0.2))
model.add(Dense(512,activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics = ['accuracy'])
model.summary()

雖然我還不清楚造成這種情況的確切原因,但我已經找到了問題發生的位置以及解決方案。

我在數據集生成器 function 中添加了一些參數。

train_dir = "House_Dataset/Train"
valid_dir = "House_Dataset/Valid"
test_dir = "House_Dataset/Test"

train_ds = image_dataset_from_directory(
        train_dir,
        image_size=(224,224),
        shuffle= True,
        seed=1,
        labels="inferred",
        label_mode = "categorical"
)
valid_ds = image_dataset_from_directory(
        valid_dir,
        image_size=(224,224),
        shuffle=True,
        seed=1,
        labels="inferred",
        label_mode = "categorical"
)

test_ds = image_dataset_from_directory(
        test_dir,
        image_size=(224,224),
        shuffle=True,
        seed=1,
        labels="inferred",
        label_mode = "categorical"
        
)

我添加了使用一些種子隨機播放的選項,並將 label 模式更改為分類,這將產生標簽的單熱編碼。 同樣,我還將損失從 sparse_categorical_crossentropy 更改為 categorical_crossentropy。 這些變化使 model 訓練成為可能,並且在訓練和驗證損失以及准確性方面都有顯着改善。

培訓改進

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM