python-3.x - 重新训练 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'])
解决方案
不,没有必要冻结 CNN 的第一层;您可以从预先训练的模型中初始化权重。但是,在大多数情况下,建议冻结它们,因为它们可以提取的特征足够通用,可以帮助完成任何与图像相关的任务,这样做可以加快训练过程。
话虽如此,您应该尝试一下要冻结的层数。允许您的后几层对您的任务base_model
进行微调可以提高性能。您可以将其视为模型的超参数。假设您只想冻结前30 层:
for layer in model.layers[:30]:
layer.trainable = False
推荐阅读
- excel - 如何在VBA的数组中单独排序每一行?
- excel - 如何触发多个工作表中所有文本框的输入按键?- VBA
- python - 如何从 Python 中的日期时间戳中提取小时:分钟
- amazon-web-services - AWS Lambda 函数如何在 VPC 子网内扩展?
- eclipse - 在全新安装时出现内部错误:“Acceleo”
- dialogflow-es - 在 Dialogflow 中将组合词作为实体的困难
- postgresql - PostgreSQL docker容器未将数据写入磁盘
- javascript - 如何将自定义图像选择器连接到 CKeditor5 在反应 js 中插入图像
- mongodb - MongoDB 3.6 - 如何使用 $lookup 修改此聚合查询,使其可以在多个文档上运行?
- excel - 如何使用来自不同工作表的源创建图表