李沐动手学深度学习V2-微调练习

1、 继续提高finetune_net的学习率,模型的准确性如何变化?

原实验参数 lr=5e-5, batch_size=128, num_epochs=5
在这里插入图片描述
lr = 5e-4
lr=5e-4
lr = 5e-6
在这里插入图片描述

2、2. 在比较实验中进一步调整finetune_net和scratch_net的超参数。它们的准确性还有不同吗?

num_epochs=5是scratch_net
在这里插入图片描述

num_epochs改为3
scratch_net:
在这里插入图片描述
finetunr_net
在这里插入图片描述

3、将输出层finetune_net之前的参数设置为源模型的参数,在训练期间不要更新它们。模型的准确性如何变化?

#13.2 练习3
%matplotlib inline
import os
import torch
import torchvision
from torch import nn
from d2l import torch as d2l
data_dir = '../data/hotdog'
train_imgs = torchvision.datasets.ImageFolder(os.path.join(data_dir, 'train'))
test_imgs = torchvision.datasets.ImageFolder(os.path.join(data_dir, 'test'))
normalize = torchvision.transforms.Normalize(
    [0.485, 0.456, 0.406], [0.229, 0.224, 0.225]
)

train_augs = torchvision.transforms.Compose([
    torchvision.transforms.RandomResizedCrop(224),
    torchvision.transforms.RandomHorizontalFlip(),
    torchvision.transforms.ToTensor(),
    normalize
])
test_augs = torchvision.transforms.Compose([
    torchvision.transforms.Resize([256,256]),
    torchvision.transforms.CenterCrop(224),
    torchvision.transforms.ToTensor(),
    normalize
])

# pretrained_net = torchvision.models.resnet18(pretrained=True)
finetune_net = torchvision.models.resnet18(pretrained=True)
finetune_net.fc = nn.Linear(finetune_net.fc.in_features, 2)
nn.init.xavier_uniform_(finetune_net.fc.weight)

from torch.utils.data import DataLoader
def train_fine_tuning(net, lr, batch_size=128, num_epochs=5,
                      param_group=True):
    train_iter = DataLoader(dataset=torchvision.datasets.ImageFolder(os.path.join(data_dir, 'train'), transform=train_augs), batch_size=batch_size, shuffle=True)
    test_iter = DataLoader(torchvision.datasets.ImageFolder(
        os.path.join(data_dir, 'test'), transform=test_augs
    ), batch_size=batch_size)
    devices = d2l.try_all_gpus()
    loss = nn.CrossEntropyLoss(reduction='none')


    if param_group:
        # params_1x = [param for name, param in net.named_parameters()
        #              if name not in ["fc.weight", "fc.bias"]]
        param_pre = []
        for name, param in net.named_parameters():
            if name not in ['fc.weight', 'fc.bias']:
                param.requires_grad = False
                param_pre.append(param)
        trainer = torch.optim.SGD([
            {'params': param_pre},
            {'params': net.fc.parameters(),
             'lr': lr * 10}
        ], lr=lr, weight_decay=0.001)
    else:
        trainer = torch.optim.SGD(net.parameters(), lr=lr, weight_decay=0.001)
    d2l.train_ch13(net, train_iter, test_iter, loss, trainer, num_epochs, devices)
train_fine_tuning(finetune_net, 5e-5)

结果:53s

在这里插入图片描述

没改变之前:59s
在这里插入图片描述

4、事实上,ImageNet数据集中有一个“热狗”类别。我们可以通过以下代码获取其输出层中的相应权重参数,但是我们怎样才能利用这个权重参数?

#13.2 练习3
%matplotlib inline
import os
import torch
import torchvision
from torch import nn
from d2l import torch as d2l
data_dir = '../data/hotdog'
train_imgs = torchvision.datasets.ImageFolder(os.path.join(data_dir, 'train'))
test_imgs = torchvision.datasets.ImageFolder(os.path.join(data_dir, 'test'))
normalize = torchvision.transforms.Normalize(
    [0.485, 0.456, 0.406], [0.229, 0.224, 0.225]
)

train_augs = torchvision.transforms.Compose([
    torchvision.transforms.RandomResizedCrop(224),
    torchvision.transforms.RandomHorizontalFlip(),
    torchvision.transforms.ToTensor(),
    normalize
])
test_augs = torchvision.transforms.Compose([
    torchvision.transforms.Resize([256,256]),
    torchvision.transforms.CenterCrop(224),
    torchvision.transforms.ToTensor(),
    normalize
])

# pretrained_net = torchvision.models.resnet18(pretrained=True)
finetune_net = torchvision.models.resnet18(pretrained=True)
weight = finetune_net.fc.weight[934] #热狗的权重
finetune_net.fc = nn.Linear(finetune_net.fc.in_features, 2)
## Todo:使用ImageNet预训练好的热狗类的权重参数进行初始化
finetune_net.fc.weight.data[0] = weight.data
#需要reshape,否则一维tensor会报错
nn.init.xavier_uniform_(finetune_net.fc.weight[1].reshape((1,512)))

from torch.utils.data import DataLoader
def train_fine_tuning(net, lr, batch_size=128, num_epochs=5,
                      param_group=True):
    train_iter = DataLoader(dataset=torchvision.datasets.ImageFolder(os.path.join(data_dir, 'train'), transform=train_augs), batch_size=batch_size, shuffle=True)
    test_iter = DataLoader(torchvision.datasets.ImageFolder(
        os.path.join(data_dir, 'test'), transform=test_augs
    ), batch_size=batch_size)
    devices = d2l.try_all_gpus()
    loss = nn.CrossEntropyLoss(reduction='none')

    if param_group:
        # params_1x = [param for name, param in net.named_parameters()
        #              if name not in ["fc.weight", "fc.bias"]]
        param_pre = []
        for name, param in net.named_parameters():
            if name not in ['fc.weight', 'fc.bias']:
                # param.requires_grad = False
                param_pre.append(param)
        trainer = torch.optim.SGD([
            {'params': param_pre},
            {'params': net.fc.parameters(),
             'lr': lr * 10}
        ], lr=lr, weight_decay=0.001)
    else:
        trainer = torch.optim.SGD(net.parameters(), lr=lr, weight_decay=0.001)
    d2l.train_ch13(net, train_iter, test_iter, loss, trainer, num_epochs, devices)
train_fine_tuning(finetune_net, 5e-5)

结果:
在这里插入图片描述
原始结果
在这里插入图片描述
固定输出层之前的参数:
在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值