训练预训练模型keras_vggface在添加批量标准化后会产生非常高的损失

时间:2018-06-11 16:05:53

标签: python machine-learning keras

我试图在1774个训练图像的数据集(所有面)上使用预训练的Keras VGGFace训练我的模型,并且由12个类组成313个验证图像。

我最近在我的代码脚本中添加了批量规范化和退出,因为它过度拟合了。 (我的训练是99周围和val约80)。这是我的代码:

train_data_path = 'dataset_cfps/train'
validation_data_path = 'dataset_cfps/validation'

#Parametres
img_width, img_height = 224, 224

vggface = VGGFace(model='resnet50', include_top=False, input_shape=(img_width, img_height, 3))

last_layer = vggface.get_layer('avg_pool').output
x = Flatten(name='flatten')(last_layer)
x1 = Dense(12, activation='sigmoid', name='classifier')(x)
x2 = BatchNormalization()(x1)
x3 = Dropout(0.5)(x2)
custom_vgg_model = Model(vggface.input, x3)

# Create the model
model = models.Sequential()

# Add the convolutional base model
model.add(custom_vgg_model)

当我尝试训练模型时,损失只是超过10,这是不应该发生的。批量标准化和丢失层是否添加在正确的位置? 我试图从他们的github repo中采用代码。

1 个答案:

答案 0 :(得分:0)

在您的代码的S形分类层之后添加了批处理规范化和辍学。辍学将导致不考虑密集层输出的某些S形激活或概率,这就是为什么在尝试以最大概率查找类时可能会有不正确的分类预测的原因。

请尝试如下修改您的代码,以包括两个Dense层。第一个隐藏的密集层的尺寸应约为输入和输出尺寸总和的一半。最终的密集层可以是用于预测通过S型激活的输出类别概率的层。可以在两层之间添加正则化层。

train_data_path = 'dataset_cfps/train'
validation_data_path = 'dataset_cfps/validation'

    #Parametres
    img_width, img_height = 224, 224

    vggface = VGGFace(model='resnet50', include_top=False, input_shape=(img_width, img_height, 3))

    last_layer = vggface.get_layer('avg_pool').output
    x = Flatten(name='flatten')(last_layer)
    x1 = Dense(1024, activation='relu')(x)
    x2 = BatchNormalization()(x1)
    x3 = Dropout(0.5)(x2)
    x4 = Dense(12, activation='sigmoid', name='classifier')(x3)
    custom_vgg_model = Model(vggface.input, x4)

    # Create the model
    model = models.Sequential()

    # Add the convolutional base model
    model.add(custom_vgg_model)