联邦迁移学习

Finetune(微调) 和 Fixed Feature Extractor(固定特征提取器) 确实有相似之处,但它们的关键区别在于模型参数的调整范围和任务的相似性。

区别:

Finetune(微调):

所有层都参与训练:在Finetune中,预训练模型的所有层都会参与训练。虽然我们使用预训练权重进行初始化,但训练过程中会根据新任务的数据对模型参数进行更新。

适用于相似任务:Finetune 适合原始任务和新任务有较大相似性的情况。比如,如果预训练模型在 ImageNet(自然图片)上训练过,用它来处理另一个自然图片的分类任务,Finetune 的效果往往很好。

复制代码
import torch
import torch.nn as nn
import torchvision.models as models
import torch.optim as optim
from torch.utils.data import DataLoader
from torchvision import datasets, transforms

# 1. 加载预训练的 ResNet50 模型
model = models.resnet50(pretrained=True)

# 2. 修改最后的全连接层,适配新任务(假设新任务有10个类别)
model.fc = nn.Linear(model.fc.in_features, 10)  # in_features 为 ResNet50 的全连接层输入维度

# 3. 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 4. 加载数据集(例如,CIFAR-10 数据集)
transform = transforms.Compose([
    transforms.Resize((224, 224)),  # ResNet50 需要 224x224 的输入尺寸
    transforms.ToTensor(),
])

train_dataset = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)

# 5. 训练模型
model.train()  # 设置为训练模式
for epoch in range(10):  # 假设训练10个 epoch
    running_loss = 0.0
    for inputs, labels in train_loader:
        optimizer.zero_grad()  # 清除梯度
        outputs = model(inputs)  # 前向传播
        loss = criterion(outputs, labels)  # 计算损失
        loss.backward()  # 反向传播
        optimizer.step()  # 更新模型参数
        
        running_loss += loss.item()

    print(f"Epoch {epoch+1}, Loss: {running_loss/len(train_loader)}")

# 6. 模型训练完成后保存
torch.save(model.state_dict(), "finetuned_resnet50.pth")

Fixed Feature Extractor(固定特征提取器):

仅微调最后几层:在这种方法中,预训练模型的大部分层是被冻结的,只有最后的几层(通常是全连接层)参与训练。这种方式把前几层看作一个固定的特征提取器,用来提取图片的高层次特征,而只在最后的几层上根据新任务进行训练。

适用于不同的任务:这种方法适合原始任务和新任务差异较大的情况,因为你可能只是需要使用预训练模型提取的通用特征,而不需要修改整个模型。

复制代码
import torch
import torch.nn as nn
import torchvision.models as models
import torch.optim as optim

# 1. 加载预训练的 ResNet50 模型
model = models.resnet50(pretrained=True)

# 2. 冻结前几层参数,使得它们不参与训练
for param in model.parameters():
    param.requires_grad = False

# 3. 替换最后的全连接层,适应新的任务 (假设是10类分类任务)
model.fc = nn.Sequential(
    nn.Linear(model.fc.in_features, 256),  # 添加一层全连接层
    nn.ReLU(),
    nn.Dropout(0.4),
    nn.Linear(256, 10),  # 最后输出10个类别
)

# 4. 只训练新的全连接层
optimizer = optim.Adam(model.fc.parameters(), lr=0.001)

# 5. 训练模型
criterion = nn.CrossEntropyLoss()

# 假设有一个训练数据集 train_loader
for epoch in range(10):
    running_loss = 0.0
    for inputs, labels in train_loader:
        optimizer.zero_grad()  # 清除梯度
        outputs = model(inputs)  # 前向传播
        loss = criterion(outputs, labels)  # 计算损失
        loss.backward()  # 反向传播
        optimizer.step()  # 更新模型参数

        running_loss += loss.item()

    print(f"Epoch {epoch+1}, Loss: {running_loss/len(train_loader)}")
相关推荐
xwz小王子27 分钟前
Nature Communications 面向形状可编程磁性软材料的数据驱动设计方法—基于随机设计探索与神经网络的协同优化框架
深度学习
生信碱移1 小时前
大语言模型时代,单细胞注释也需要集思广益(mLLMCelltype)
人工智能·经验分享·深度学习·语言模型·自然语言处理·数据挖掘·数据可视化
88号技师1 小时前
【1区SCI】Fusion entropy融合熵,多尺度,复合多尺度、时移多尺度、层次 + 故障识别、诊断-matlab代码
开发语言·机器学习·matlab·时序分析·故障诊断·信息熵·特征提取
硅谷秋水2 小时前
通过模仿学习实现机器人灵巧操作:综述(上)
人工智能·深度学习·机器学习·计算机视觉·语言模型·机器人
开心快乐幸福一家人2 小时前
Spark-SQL与Hive集成及数据分析实践
人工智能·pytorch·深度学习
仙人掌_lz2 小时前
人工智能与机器学习:Python从零实现性回归模型
人工智能·python·机器学习·线性回归
阡之尘埃3 小时前
Python数据分析案例73——基于多种异常值监测算法探查内幕交易信息
人工智能·python·机器学习·数据分析·异常检测·无监督学习
极小狐3 小时前
极狐GitLab 如何 cherry-pick 变更?
人工智能·git·机器学习·gitlab
小宋加油啊3 小时前
深度学习小记(包括pytorch 还有一些神经网络架构)
pytorch·深度学习·神经网络
沛沛老爹3 小时前
从线性到非线性:简单聊聊神经网络的常见三大激活函数
人工智能·深度学习·神经网络·激活函数·relu·sigmoid·tanh