重新训练用于机器学习的Inception V3模型

时间:2018-08-22 17:02:16

标签: python-3.x tensorflow machine-learning keras conv-neural-network

我正在使用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'])

1 个答案:

答案 0 :(得分:1)

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

也就是说,您应该对要冻结的图层的数量进行一些试验。允许您的base_model的后几层对任务进行微调可以提高性能。您可以将其视为模型的超参数。假设您只冻结前30层:

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