python - 在 Keras 中使用 MobileV2 一开始验证损失无法改善
问题描述
我为我的案例使用了两种不同的模型。案例是对不同类型表面缺陷的分类。输入形状为 (200, 200, 1),共有 6 个类。训练数据数为1440(1类240),验证数据数为360(1类60)。
第一个模型的训练过程非常好。训练损失和验证损失都在迅速下降。之后,我想使用 keras 的 MobileNetV2 来比较训练结果。MobileV2 中的训练损失和准确率有所提高,但验证准确率停留在 0.1667(损失比较坎坷)。
我想知道是什么导致了这个结果,我可以把这种情况称为“过度拟合”吗?或者只是这个模型对我来说太深了?
第一个模型:
from keras.models import Sequential
from keras.layers import Dense, Activation, Dropout, Flatten, Conv2D, MaxPooling2D, BatchNormalization
import parameter
input_shape = (parameter.IMAGE_SIZE_Y, parameter.IMAGE_SIZE_X, parameter.channel)
def MyModel():
model = Sequential()
model.add(Conv2D(16, (3, 3), input_shape = input_shape, padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size = (2, 2), strides = (2, 2)))
model.add(Conv2D(32, (3, 3), padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size = (2, 2), strides = (2, 2)))
model.add(Conv2D(64, (3, 3), padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size = (2, 2), strides = (2, 2)))
model.add(Conv2D(128, (3, 3), padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size = (2, 2), strides = (2, 2)))
model.add(Flatten())
model.add(Dense(256, activation = 'relu'))
model.add(Dropout(0.5))
model.add(Dense(6, activation = 'softmax'))
model.summary()
return model
第二种型号:
from keras.models import Sequential, Model
from keras.layers import Dense, Activation, Dropout, Flatten, Conv2D, MaxPooling2D, BatchNormalization, GlobalAveragePooling2D
from keras.optimizers import Adam
from keras.applications import MobileNetV2
import parameter
def MyMobileNetV2():
input_shape = (parameter.IMAGE_SIZE_X, parameter.IMAGE_SIZE_Y, parameter.channel)
model = MobileNetV2(input_shape = input_shape,
include_top = False,
weights = 'imagenet')
x = model.output
x = GlobalAveragePooling2D()(x)
x = BatchNormalization()(x)
x = Dense(1280, activation='relu')(x)
x = BatchNormalization()(x)
predictions = Dense(6, activation='softmax', kernel_initializer='random_uniform', bias_initializer='zeros')(x)
model = Model(inputs = model.input, outputs = predictions)
optimizer = Adam(lr=0.01)
loss = "categorical_crossentropy"
for layer in model.layers:
layer.trainable = True
model.compile(optimizer=optimizer,
loss=loss,
metrics=["accuracy"])
model.summary()
for i, layer in enumerate(model.layers):
print(i, layer.name, layer.trainable)
return model
解决方案
推荐阅读
- algorithm - 找到具有最多 1 的 nXn 子矩阵
- extjs - 如何在 ExtJs 网格中实现插件
- c# - 在以下情况下删除不需要的尾随逗号的正确和安全方法是什么?
- javascript - 多维数组中的 Javascript 表
- ruby-on-rails - ffmpeg 视频分割少于 10 秒会产生黑色剪辑 - ubuntu 18.04 LTS
- typescript - Typescipt 泛型 - 返回具有相同类型泛型参数的新实例
- r - 如何消除高度相关的特征?
- .net - 最新的稳定、不稳定和预发布包之间有什么区别
- c++ - Runtime 如何在运行时推断类型?
- javascript - Spring Framework:接收 POST 请求时如何接受对象数组作为数据参数之一?