模型测试精度卡住- Keras迁移学习

xwbd5t1u  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(149)

我试图创建一个ML模型,将根据道路的质量对卫星图像进行分类。这是一个四分类问题(道路被分类为“好”、“一般”、“差”和“坏”)。
我正在尝试使用迁移学习创建模型。我已经遵循了Keras文档中的步骤,可以在这里找到:https://keras.io/guides/transfer_learning/目前,我坚持我的模型有大约40%的测试准确度model.evaluate(``)的结果),尽管我已经尝试做了所有的改变。
我尝试过的一些调整包括:

  • 增加epoch(在某个时候,模型刚刚达到99%的训练准确率,我认为在这一点上是过度拟合的)
  • 使用不同的架构(Xception、ResNet、DenseNet、AlexNet等))
  • 使用不同的学习速率(0.1 - 0.000001)
  • 使用不同的优化器(SGD、Adam、RMSProp)
  • 调整图像数据集的大小(150 x150,200 x200,224 x224等))

下面是我的一些代码片段。

模型定义

model = keras.models.Sequential()
model.add(keras.applications.Xception(include_top=False, weights='imagenet', input_shape=(150, 150, 3)))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(100))
model.add(keras.layers.Activation(keras.activations.relu))
model.add(keras.layers.BatchNormalization())
model.add(keras.layers.Dropout(0.5))
model.add(keras.layers.Dense(4))
model.add(keras.layers.Activation(keras.activations.softmax))

model.layers[0].trainable=False

模型编译

对于这个,我使用分类交叉熵,因为我有一个使用tf.onehot对数据集的标签进行热编码。

model.compile(loss='categorical_crossentropy', optimizer=tf.optimizers.Adam(learning_rate=0.001), metrics=['accuracy'])

在训练了几个epoch之后,我解冻了预先构建的架构,并继续训练更多epoch。我使用下面的代码片段来实现这一点。

model.layers[0].trainable=True
model.compile(loss='categorical_crossentropy', optimizer=tf.optimizers.Adam(learning_rate=1e-5), metrics=['accuracy'])
model.summary()

模型摘要

Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 xception (Functional)       (None, 5, 5, 2048)        20861480  
                                                                 
 flatten (Flatten)           (None, 51200)             0         
                                                                 
 dense (Dense)               (None, 100)               5120100   
                                                                 
 activation (Activation)     (None, 100)               0         
                                                                 
 batch_normalization_4 (Batc  (None, 100)              400       
 hNormalization)                                                 
                                                                 
 dropout (Dropout)           (None, 100)               0         
                                                                 
 dense_1 (Dense)             (None, 4)                 404       
                                                                 
 activation_1 (Activation)   (None, 4)                 0         
                                                                 
=================================================================
Total params: 25,982,384
Trainable params: 5,120,704
Non-trainable params: 20,861,680
_________________________________________________________________

至于我的数据集,我有大约40,000张道路卫星图像,分为四类。我用整数重新标记它们,这样我就可以使用独热编码。它们在我的系统目录中看起来像这样,我使用keras.utils.image_dataset_from_directory()加载它们。

Directory
├───training
│   ├───0
│   ├───1
│   └───2
|   └───3
└───testing
│   ├───0
│   ├───1
│   └───2
|   └───3
└───validation
    ├───0
    ├───1
    └───2
    └───3

我已经检查了一遍又一遍,我似乎找不到任何改变了。

muk1a3rh

muk1a3rh1#

如果没有额外的上下文,这是一个很难回答的问题。正如你已经提到的,拥有99%的测试准确率很可能是分类器的过度拟合。然而,这并不一定意味着它是这里的主要问题。
可能有多种原因,其中一些可能是:
1.您的数据在类分布方面不平衡
1.您的数据在每个数据集(train、瓦尔、test)中分布不均匀
1.在预处理中存在一些错误(e.g.图片被错误地标记。)
验证以上内容后,可以尝试以下一些操作:
1.使用不同的正则化技术进行实验(例如:(例如,使用早期停止)
1.试着增加你的数据(e.g.翻转图像)

相关问题