文章目录
一、 流程
微调预训练的流程为
- 准备数据
- 定义网络结构,除了网络外,还可以根据需要定义梯度下降算法,准确度计算等。
- 找到网络的定义,设置需要导入的变量(重要,因为fine-tune最后分类层如果数据类别数目不同的话是一定要改的)
- 设置需要梯度下降更新的变量(即可以选择冻结前面特征提取层、只训练分类层)
二、 mobileNetV1预训练
- 下载预训练的权重并解压
网络结构
权重
这里我下载的是mobilenet_v1_0.25_224,解压后图如下:网络的ckpt名字为“mobilenet_v1_0.25_224.ckpt”,0.25指的是depth_multiplier的值,定义网络的时候要设置。
- 网络前向结构定义与导入变量设置
# 网络前向
with slim.arg_scope(mobilenet_v1_arg_scope(weight_decay=WEIGHT_DECAY)):
# with tf.name_scope("net"):
logits, _ = mobilenet_v1(images, num_classes=NUM_CLASS, is_training=is_training,
depth_multiplier=0.25,
dropout_keep_prob=KEEP_PROB)
# 对于mobileNet来说要重新赋值depth_multiplier,这个数字模型名称有
# 读入网络
# 需要restore 的变量要定义在新加的图前面
# assert (os.path.isfile(MODEL_PATH))
variables_to_restore = slim.get_variables_to_restore(exclude=['MobilenetV1/Logits/Conv2d_1c_1x1']) # 最后一层不要restore
init_fn = slim.assign_from_checkpoint_fn(MODEL_PATH, variables_to_restore)
- 设置梯度下降算法,指定需要下降的变量
# 初始化没有导入的变量
logits_variables1