【问题标题】:How to create a pre-trained weight model similar to Imagenet or Noisy-student?如何创建类似于 Imagenet 或 Noisy-student 的预训练权重模型?
【发布时间】:2020-10-19 03:34:03
【问题描述】:
我正在尝试创建一个预训练的权重模型文件,该文件可用于初始化类似于 imagenet 预训练权重文件或嘈杂学生的模型。
我有足够大的数据集,这些数据集非常多样化,但特定于我感兴趣的领域。
我希望针对我感兴趣的领域创建一个通用的预训练权重文件。
我知道我无法训练和保存模型权重,因为生成的预训练权重文件和我尝试使用的预训练网络之间的类数不匹配(因此层数)重量。
我在互联网上找不到有关创建自定义预训练体重文件的任何信息,因此任何提示或建议都会非常有帮助。
【问题讨论】:
标签:
tensorflow
machine-learning
keras
deep-learning
computer-vision
【解决方案1】:
当您定义用于训练数据集的模型时,它的头部应该是一个全局池化层,然后是一个密集层。密集层将用于根据您的数据集进行分类。一旦你的模型完成训练,你可以创建一个不同的模型,它基于你的训练模型的图形,但不包括它的头部。然后,您可以保存可用于迁移学习的新模型的权重。下面是我使用 Tensorflow 的函数式 API 解释的简化视图。
inputs = Input(shape)
# All hidden layers
x = (...)(inputs)
# Final pooling layer
x = GlobalAveragePooling2D()(x)
# Prediction layer
x = Dense(num_classes)(x)
model = Model(inputs, x)
一旦你训练了这个模型,创建一个不同的模型来连接除头部之外的所有模型并保存权重。
new_model = Model(inputs, model.layers[-2])
new_model.save_weights(file_path)
这个新模型包含与之前模型相同的输入,但输出是GlobalAveragePooling2D() 层之前的层。