多类分类模型未正确训练。为什么训练损失不变?

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

我正在尝试使用 keras 训练模型以进行多类分类。有 5 类 个可以预测。这是一个图像分类问题,如前所述,有五个 类 图像,卧室、浴室、客厅、餐厅和厨房。问题是模型似乎没有学习,它总是停留在 20% 的准确度,并且损失从第 1 阶段开始就没有变化。我使用的是 Xception 模型的卷积基,我的分类器在上面。使用 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

这是建模函数。

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

训练函数调用

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

这是时代的写照。

试试我的 cnn 网络,看看你的准确率是否达到 87%。 cnn提取每一层的特征作为过滤器。过滤器然后馈送到类别 softmax 函数。

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(5, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics = ['accuracy'])
model.summary()

虽然我还不清楚具体的原因,但我已经找到了问题发生的地方,并找到了解决方法。

我在数据集生成器函数中添加了一些参数。

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"
        
)

我添加了使用一些种子进行随机播放的选项,并将标签模式更改为分类模式,这将生成标签的 one-hot 编码。同样,我也将损失从 sparse_categorical_crossentropy 更改为 categorical_crossentropy。这些变化使得模型可以训练,并且在训练和验证损失以及准确性方面都有显着改进。