python - InceptionResNetV2 验证准确率停留在 20% 到 30% 左右
问题描述
我试图训练一个 CNN 对 9 类图像进行分类。每个类有 1000 张图像用于训练。我尝试在 VGG16 和 VGG19 上进行训练,两者都可以达到 90% 的验证准确率。但是当我尝试在 InceptionResNetV2 模型上进行训练时,该模型似乎停留在 20% 和 30% 左右。下面是我的 InceptionResNetV2 代码和培训。我可以做些什么来改进培训?
base_model = tf.keras.applications.InceptionResNetV2(input_shape=(IMG_HEIGHT, IMG_WIDTH ,3),weights = 'imagenet',include_top=False)
base_model.trainable = False
model = tf.keras.Sequential([
base_model,
Flatten(),
Dense(1024, activation = 'relu', kernel_regularizer=regularizers.l2(0.001)),
LeakyReLU(alpha=0.4),
Dropout(0.5),
BatchNormalization(),
Dense(1024, activation = 'relu', kernel_regularizer=regularizers.l2(0.001)),
LeakyReLU(alpha=0.4),
Dense(9, activation = 'softmax')])
optimizer_model = tf.keras.optimizers.Adam(learning_rate=0.0001, name='Adam', decay=0.00001)
loss_model = tf.keras.losses.CategoricalCrossentropy(from_logits=True)
model.compile(optimizer_model, loss="categorical_crossentropy", metrics=['accuracy'])
Epoch 1/10
899/899 [==============================] - 255s 283ms/step - loss: 4.3396 - acc: 0.3548 - val_loss: 4.2744 - val_acc: 0.3874
Epoch 2/10
899/899 [==============================] - 231s 257ms/step - loss: 3.5856 - acc: 0.4695 - val_loss: 3.9151 - val_acc: 0.3816
Epoch 3/10
899/899 [==============================] - 225s 250ms/step - loss: 3.1451 - acc: 0.4959 - val_loss: 4.8801 - val_acc: 0.2425
Epoch 4/10
899/899 [==============================] - 227s 252ms/step - loss: 2.7771 - acc: 0.5124 - val_loss: 3.7167 - val_acc: 0.3023
Epoch 5/10
899/899 [==============================] - 231s 257ms/step - loss: 2.4993 - acc: 0.5260 - val_loss: 3.7276 - val_acc: 0.3770
Epoch 6/10
899/899 [==============================] - 227s 252ms/step - loss: 2.3148 - acc: 0.5251 - val_loss: 3.7677 - val_acc: 0.3115
Epoch 7/10
899/899 [==============================] - 234s 260ms/step - loss: 2.1381 - acc: 0.5379 - val_loss: 3.4867 - val_acc: 0.2862
Epoch 8/10
899/899 [==============================] - 230s 256ms/step - loss: 2.0091 - acc: 0.5367 - val_loss: 4.1032 - val_acc: 0.3080
Epoch 9/10
899/899 [==============================] - 225s 251ms/step - loss: 1.9155 - acc: 0.5399 - val_loss: 4.1270 - val_acc: 0.2954
Epoch 10/10
899/899 [==============================] - 232s 258ms/step - loss: 1.8349 - acc: 0.5508 - val_loss: 4.3918 - val_acc: 0.2276
解决方案
VGG-16/19 的深度为 23/26 层,而 InceptionResNetV2 的深度为 572 层。现在,医学图像和 imagenet 数据集之间的域相似性最小。在 VGG 中,由于深度较低,您获得的特征并不复杂,网络能够根据密集层特征对其进行分类。然而,在 IRV2 网络中,由于它太深,fc层的输出更复杂(将其可视化为对象,但对于 imagenet 数据集),然后从这些层获得的特征无法连接到 Dense 层特征,因此过度拟合。我想你能明白我的意思。
在此链接上查看我对您非常相似的问题的回答:链接。这将有助于提高您的准确性。
推荐阅读
- python - 如何从一个csv中删除一行数据并将其写入不同的csv?
- angular - 什么模块用于按钮的外观?
- r - 如何从 Rcpp 在 Shiny 中添加进度指示器
- unity3d - 在 MacBook M1 上进行 Oculus Quest 测试。控制台调试消息未显示?
- node.js - Redis ( node-redis ) - 未处理的“错误”事件
- typescript - 打字稿中有什么方法可以用类型定义可选字段吗?
- sorting - 按 2 个变量排序
- r - 当 R 中的另一个单元格中有值时,为一个单元格分配一个名称
- python - 使用带有格式字符串的 matplotlib mathtext
- c# - DontDestroyOnLoad 中的游戏对象变换