【深度学习】迁移学习 (Transfer Learning) 及PyTorch代码实现

迁移学习 (Transfer Learning) 是把已学训练好的模型参数用作新训练模型的起始参数。迁移学习是深度学习中非常重要和常用的⼀个策略。

ff6be2cba27e586b496781b0f896f900.png

  • 下面是一个简单的 PyTorch 迁移学习示例代码,用于将训练好的 ResNet18 模型应用于 CIFAR-10 数据集的分类任务中:

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.models as models
import torchvision.datasets as datasets
import torchvision.transforms as transforms

# 加载数据集
transform = transforms.Compose([transforms.Resize(256),
                                transforms.CenterCrop(224),
                                transforms.ToTensor(),
                                transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225))])
train_dataset = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
test_dataset = datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=32, shuffle=True, num_workers=4)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=32, shuffle=False, num_workers=4)

# 定义模型,加载预训练参数
model = models.resnet18(pretrained=True)
num_features = model.fc.in_features
model.fc = nn.Linear(num_features, 10)

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

# 训练模型
def train(model, train_loader, criterion, optimizer):
    model.train()
    for inputs, labels in train_loader:
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

# 测试模型
def test(model, test_loader, criterion):
    model.eval()
    with torch.no_grad():
        total_loss = 0.0
        total_corrects = 0
        for inputs, labels in test_loader:
            outputs = model(inputs)
            loss = criterion(outputs, labels)
            _, preds = torch.max(outputs, 1)
            total_loss += loss.item() * inputs.size(0)
            total_corrects += torch.sum(preds == labels.data)
        avg_loss = total_loss / len(test_loader.dataset)
        accuracy = float(total_corrects) / len(test_loader.dataset)
    return avg_loss, accuracy

# 训练和测试模型
num_epochs = 10
for epoch in range(num_epochs):
    print('Epoch {}/{}'.format(epoch+1, num_epochs))
    train(model, train_loader, criterion, optimizer)
    test_loss, test_acc = test(model, test_loader, criterion)
    print('Test loss: {:.4f}, Test accuracy: {:.4f}'.format(test_loss, test_acc))

# 保存模型
torch.save(model.state_dict(), 'cifar10_resnet18.pth')

上面的示例代码中:

首先使用 PyTorch 内置的 datasets.CIFAR10 函数加载 CIFAR-10 数据集,并进行数据预处理;

然后使用预训练的 ResNet18 模型,并替换最后的全连接层,以适应 CIFAR-10 数据集的分类任务;

接着定义损失函数和优化器,并使用训练集对模型进行训练,并在测试集上进行测试;

最后,将训练好的模型保存到本地文件中。

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch中,实现迁移学习的方法有两种。一种是微调网络的方法,即更改最后一层全连接,并且微调训练网络。另一种是将模型看作特征提取器,冻结所有层并且更改最后一层,只训练最后一层。这样可以快速训练模型而准确率不低于自己训练的模型。 在实施迁移学习之前,我们需要准备数据并选择合适的模型。数据的准备包括选择数据增广的方式,而模型的选择可以使用PyTorch提供的预训练模型,如VGG16等。 在使用PyTorch进行迁移学习时,我们可以使用torchvision.models中的预训练模型。例如,可以使用models.vgg16(pretrained=True)来加载在ImageNet数据集上预训练的VGG16模型。然后,我们可以通过设置每个参数的requires_grad属性为False来冻结所有层,使其参数不会更新。 以上是关于在PyTorch实现迁移学习的基本步骤和方法。具体的实现细节可以根据具体的需求和问题进行调整和修改。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [【Pytorch迁移学习(Transfer Learning)](https://blog.csdn.net/m0_51941269/article/details/128258212)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [PyTorch使用教程-迁移学习(几分钟即可训练好自己的模型)](https://blog.csdn.net/weixin_42263486/article/details/108302350)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值