python - 如何纠正/改进我的 CNN 模型?如何处理验证准确性冻结问题?
问题描述
验证集准确度冻结在 0.0909。这是欠拟合吗?如何解决该问题以获得更好的模型精度。该模型稍后被转换为 tflite 以部署在 android 上。
我的模型:
model = Sequential([
Conv2D(filters=32, kernel_size=(3, 3), activation='relu', padding='same', input_shape=(224, 224, 3)),
MaxPool2D(pool_size=(2, 2), strides=2),
Conv2D(filters=64, kernel_size=(3, 3), activation='relu', padding='same'),
MaxPool2D(pool_size=(2, 2), strides=2),
Conv2D(filters=128, kernel_size=(3, 3), activation='relu', padding='same'),
MaxPool2D(pool_size=(2, 2), strides=2),
Flatten(),
Dense(units=train_batches.num_classes, activation='softmax')
])
model.summary()
层(类型)输出形状参数#
conv2d (Conv2D) (无, 224, 224, 32) 896
max_pooling2d (MaxPooling2D) (无, 112, 112, 32) 0
conv2d_1 (Conv2D) (无, 112, 112, 64) 18496
max_pooling2d_1 (MaxPooling2 (无, 56, 56, 64) 0
conv2d_2 (Conv2D) (无, 56, 56, 128) 73856
max_pooling2d_2 (MaxPooling2 (无, 28, 28, 128) 0
展平(展平)(无,100352)0
密集(密集)(无,11)1103883
总参数:1,197,131 可训练参数:1,197,131 不可训练参数:0
model.compile(optimizer=Adam(learning_rate=0.01), loss=categorical_crossentropy, metrics=['accuracy'])
model.fit(x=train_batches, validation_data=valid_batches, epochs=10, verbose=2)
Epoch 1/10
53/53 - 31s - loss: 273.5211 - accuracy: 0.0777 - val_loss: 2.3989 - val_accuracy: 0.0909
Epoch 2/10
53/53 - 27s - loss: 2.4001 - accuracy: 0.0928 - val_loss: 2.3986 - val_accuracy: 0.0909
Epoch 3/10
53/53 - 28s - loss: 2.4004 - accuracy: 0.0795 - val_loss: 2.3986 - val_accuracy: 0.0909
Epoch 4/10
53/53 - 29s - loss: 2.4006 - accuracy: 0.0739 - val_loss: 2.3989 - val_accuracy: 0.0909
Epoch 5/10
53/53 - 29s - loss: 2.3999 - accuracy: 0.0720 - val_loss: 2.3986 - val_accuracy: 0.0909
Epoch 6/10
53/53 - 28s - loss: 2.4004 - accuracy: 0.0720 - val_loss: 2.3986 - val_accuracy: 0.0909
Epoch 7/10
53/53 - 28s - loss: 2.4004 - accuracy: 0.0682 - val_loss: 2.3993 - val_accuracy: 0.0909
Epoch 8/10
53/53 - 29s - loss: 2.3995 - accuracy: 0.0871 - val_loss: 2.3986 - val_accuracy: 0.0909
Epoch 9/10
53/53 - 29s - loss: 2.4008 - accuracy: 0.0852 - val_loss: 2.3988 - val_accuracy: 0.0909
Epoch 10/10
53/53 - 28s - loss: 2.4004 - accuracy: 0.0833 - val_loss: 2.3991 - val_accuracy: 0.0909
解决方案
尝试使用较低的学习率。还要检查您的数据集。我的意思是您正在使用的数据集,如果它是一个小的数据集,则使用图像增强来增加它,以便模型可以更好地学习它。使用批量归一化以及正则化技术和 LR 调度程序,因为您的梯度下降正落入局部最小值。
推荐阅读
- swiftui - UIBezierPath / Shape 有奇怪的定位和调整大小行为
- python - 熊猫中的连接数据框给出了不同的结果
- javascript - 如何使用 Firebase、JavaScript、jQuery、Ajax、JSON 向多个设备/令牌发送移动推送通知
- julia - Julia 在脚本中共享变量
- c# - 让方法返回一些东西只是为了测试它?
- spring - springframework 中注解的植入在哪里?
- python - 彩条轴格式不正确
- laravel - 在 LARAVEL .ENV 文件中读取系统变量
- mysql - mySql 根据多列值对结果进行排序
- java - Java 最好的写法 x = Math.max(x, newX)