首页 > 解决方案 > 在 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

标签: pythontensorflowmachine-learningkerasdeep-learning

解决方案


推荐阅读