tensorflow学习(二)——finetune预训练网络--以mobileNetV1为例

本文详细介绍了如何使用MobileNetV1进行图像分类任务的微调,包括数据准备、网络结构定义、预训练权重加载及梯度下降算法设置。通过实例展示了如何调整网络以适应新的分类任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、 流程

微调预训练的流程为

  • 准备数据
  • 定义网络结构,除了网络外,还可以根据需要定义梯度下降算法,准确度计算等。
  • 找到网络的定义,设置需要导入的变量(重要,因为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 
### MobilenetV3 的配置方法及使用指南 #### 配置方法概述 MobilenetV3 是一种轻量级神经网络架构,广泛应用于移动端设备上的图像分类和其他视觉任务。其配置方式可以分为硬编码和外部文件两种形式[^4]。在 `mobilenetv3.pytorch` 项目中,大多数情况下,配置参数被直接写入到 Python 脚本中,如 `train.py` 或者 `mobilenetv3.py` 中。 以下是常见的配置项及其作用: - **Batch Size**: 控制每次迭代处理的数据样本数量。 - **Learning Rate (LR)**: 学习率决定了模型权重更新的速度。 - **Model Save Path**: 定义训练过程中或完成后模型保存的位置。 这些参数可以通过修改脚本中的变量来调整,或者通过命令行参数动态传入。 --- #### 示代码:基于 PyTorch 的 MobilenetV3 训练配置 以下是一个简单的示代码,展示了如何加载 MobilenetV3 并进行基本的训练配置: ```python import torch from torchvision import datasets, transforms from mobilenetv3 import MobileNetV3_Small # 假设已导入相应模块 # 数据预处理 transform = transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) dataset = datasets.ImageFolder('path_to_dataset', transform=transform) dataloader = torch.utils.data.DataLoader(dataset, batch_size=32, shuffle=True) # 加载模型并定义损失函数与优化器 model = MobileNetV3_Small(num_classes=1000) # 替换 num_classes 为你数据集的实际类别数 criterion = torch.nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.parameters(), lr=0.001) # 开始训练 for epoch in range(10): # 设置训练轮次 model.train() running_loss = 0.0 for images, labels in dataloader: optimizer.zero_grad() # 清零梯度 outputs = model(images) # 前向传播 loss = criterion(outputs, labels) # 计算损失 loss.backward() # 反向传播 optimizer.step() # 更新权重 running_loss += loss.item() print(f'Epoch [{epoch+1}/10], Loss: {running_loss/len(dataloader)}') ``` 此代码片段演示了如何加载数据、初始化模型以及执行训练循环[^1]。 --- #### 如何优化模型以适应移动设备 为了使 MobilenetV3 更适合部署在 Android 设备上,可以参考 TensorFlow 提供的相关教程[^2]。尽管这里是针对 PyTorch 实现的 MobilenetV3,但通用原则仍然适用: 1. 将模型转换为 ONNX 格式以便跨平台兼容。 2. 利用工具链(如 TensorRT 或 Core ML)进一步压缩模型尺寸。 3. 测试性能指标以确保推理速度满足需求。 具体操作可查阅官方文档或其他社区资源获取更多细节。 --- #### 微调与预训练的区别 当提到 Transformer 类型的网络时,通常会涉及两个阶段——预训练(pretraining) 和微调(finetuning)[^3]。然而对于 CNN 架构而言,“finetune”一般指代的是利用已有大型公开数据集(比如 ImageNet)预先训练好的权重作为初始状态,再针对目标领域的小规模数据重新调整部分层参数的过程。这种方式能够显著减少计算成本同时提升泛化能力。 如果计划采用这种方法,则需注意下载对应版本的 checkpoint 文件,并正确指定加载路径。 ---
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值