我正在使用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'])
答案 0 :(得分:1)
否,没有必要冻结CNN的第一层;您可以只从预先训练的模型中初始化权重。但是,在大多数情况下,建议冻结它们,因为它们可以提取的特征是通用的,足以帮助完成任何与图像相关的任务,因此可以加快培训速度过程。
也就是说,您应该对要冻结的图层的数量进行一些试验。允许您的base_model
的后几层对任务进行微调可以提高性能。您可以将其视为模型的超参数。假设您只冻结前30层:
for layer in model.layers[:30]:
layer.trainable = False