首页 > 解决方案 > 重新训练 Inception V3 模型以进行机器学习

问题描述

我正在使用 Inception V3 模型对两个类进行图像分类。因为我使用了两个新类(正常和异常),所以我冻结了 Inception V3 模型的顶层并用我自己的替换它。

base_model = keras.applications.InceptionV3(
        weights ='imagenet',
        include_top=False, 
        input_shape = (img_width,img_height,3))

#Classifier Model ontop of Convolutional Model
model_top = keras.models.Sequential()
model_top.add(keras.layers.GlobalAveragePooling2D(input_shape=base_model.output_shape[1:], data_format=None)),
model_top.add(keras.layers.Dense(400,activation='relu'))
model_top.add(keras.layers.Dropout(0.5))
model_top.add(keras.layers.Dense(1,activation = 'sigmoid'))
model = keras.models.Model(inputs = base_model.input, outputs = model_top(base_model.output))

在 Inception V3 中以这种方式冻结卷积层是训练所必需的吗?

#freeze the convolutional layers of InceptionV3
for layer in base_model.layers:
    layer.trainable = False

model.compile(optimizer = keras.optimizers.Adam(
                    lr=0.00002,
                    beta_1=0.9,
                    beta_2=0.999,
                    epsilon=1e-08),
                    loss='binary_crossentropy',
                    metrics=['accuracy'])

标签: python-3.xtensorflowmachine-learningkerasconv-neural-network

解决方案


没有必要冻结 CNN 的第一层;您可以从预先训练的模型中初始化权重。但是,在大多数情况下,建议冻结它们,因为它们可以提取的特征足够通用,可以帮助完成任何与图像相关的任务,这样做可以加快训练过程。

话虽如此,您应该尝试一下要冻结的层数允许您的后几层对您的任务base_model进行微调可以提高性能。您可以将其视为模型的超参数。假设您只想冻结30 层:

for layer in model.layers[:30]:
    layer.trainable = False

推荐阅读