【pytorch李沐动手学深度学习(图像增广和模型微调】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 一、图像增广
  • 二、微调


一、图像增广

在输入图像img上多次运行图像增广方法aug并显示所有结果

def apply(img, aug, num_rows=2, num_cols=4, scale=1.5):
    Y = [aug(img) for _ in range(num_rows * num_cols)]
    d2l.show_images(Y, num_rows, num_cols, scale=scale)

翻转

apply(img, torchvision.transforms.RandomHorizontalFlip())#水平翻转
apply(img, torchvision.transforms.RandomVerticalFlip())#上下翻转

【pytorch李沐动手学深度学习(图像增广和模型微调】_第1张图片
【pytorch李沐动手学深度学习(图像增广和模型微调】_第2张图片

裁剪

shape_aug = torchvision.transforms.RandomResizedCrop(
    (200, 200), scale=(0.1, 1), ratio=(0.5, 2))#随机裁剪一个面积为原始面积10%到100%的区域,该区域的宽高比从0.5到2之间随机取值。 然后,区域的宽度和高度都被缩放到200像素。
apply(img, shape_aug)

【pytorch李沐动手学深度学习(图像增广和模型微调】_第3张图片
改变颜色

apply(img, torchvision.transforms.ColorJitter(
    brightness=0.5, contrast=0, saturation=0, hue=0))#更改亮度在1-0.5到1+0.5之间
apply(img, torchvision.transforms.ColorJitter(
    brightness=0, contrast=0, saturation=0, hue=0.5))#更改色调
color_aug = torchvision.transforms.ColorJitter(
    brightness=0.5, contrast=0.5, saturation=0.5, hue=0.5)#同时随机更改图像的亮度(brightness)、对比度(contrast)、饱和度(saturation)和色调(hue)
apply(img, color_aug)

【pytorch李沐动手学深度学习(图像增广和模型微调】_第4张图片
【pytorch李沐动手学深度学习(图像增广和模型微调】_第5张图片
【pytorch李沐动手学深度学习(图像增广和模型微调】_第6张图片
结合多种图像增广方法(Compose)

augs = torchvision.transforms.Compose([
    torchvision.transforms.RandomHorizontalFlip(), color_aug, shape_aug])
apply(img, augs)

【pytorch李沐动手学深度学习(图像增广和模型微调】_第7张图片
如果要训练的时候,需要使用ToTensor实例将一批图像转换为深度学习框架所要求的格式,即形状为(批量大小,通道数,高度,宽度)的32位浮点数,取值范围为0到1。
例:

train_augs = torchvision.transforms.Compose([
     torchvision.transforms.RandomHorizontalFlip(),
     torchvision.transforms.ToTensor()])

多gpu训练

d2l.train_ch13(net, train_iter, test_iter, loss, trainer, num_epochs,devices=d2l.try_all_gpus())

二、微调

不从头训练模型,用预训练模型,之后只训练后面几层。
【pytorch李沐动手学深度学习(图像增广和模型微调】_第8张图片
加载预训练模型

pretrained_net = torchvision.models.resnet18(pretrained=True)
pretrained_net.fc#看全连接层输出层数,从而改变分类数目

在这里插入图片描述

finetune_net = torchvision.models.resnet18(pretrained=True)
finetune_net.fc = nn.Linear(finetune_net.fc.in_features, 2)#输出层为2类
nn.init.xavier_uniform_(finetune_net.fc.weight);

训练

# 如果param_group=True,输出层中的模型参数将使用十倍的学习率
def train_fine_tuning(net, learning_rate, batch_size=128, num_epochs=5,
                      param_group=True):
    train_iter = torch.utils.data.DataLoader(torchvision.datasets.ImageFolder(
        os.path.join(data_dir, 'train'), transform=train_augs),
        batch_size=batch_size, shuffle=True)
    test_iter = torch.utils.data.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"]]
        trainer = torch.optim.SGD([{'params': params_1x},
                                   {'params': net.fc.parameters(),
                                    'lr': learning_rate * 10}],
                                lr=learning_rate, weight_decay=0.001)
    else:
        trainer = torch.optim.SGD(net.parameters(), lr=learning_rate,
                                  weight_decay=0.001)
    d2l.train_ch13(net, train_iter, test_iter, loss, trainer, num_epochs,
                   devices)

微调学习率选的小,但是从头训练选大学习率

你可能感兴趣的:(python,pytorch,人工智能,机器学习)