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