25.迁移学习

目录

1 预训练网络

2  代码实现

2.1  制作数据集

2.2  建立模型

2.3  编译模型

2.4  训练模型

2.5  预测模型


1 预训练网络

我们之前每次创建模型,模型自我的第一步都是初始化自己的参数,初始化的参数都是随机的,如果我们使用预训练网络,我们初始化的参数就是之前已经训练好的神经网络

keras中包含VGG16,VGG19,ResNet50,Inception v3,Xception等网络

下面这个图是VGG的六种网络结构

  • VGG16中16的意思是网络中可训练参数层(不算池化层与输出层)共有16层,VGG19中19的意思是网络中共有19层
  • FC 是指Dense层,后面的数值是该层的神经元个数,FC-4096就是4096个神经元的dense层
  • VGG 有两个大的缺点,第一是消耗磁盘空间大,第二是训练速度慢

2  代码实现

2.1  制作数据集

我们使用上一章的猫狗分类添加VGG,我们沿用创建数据集前的所有代码,我们简单看一下

2.2  建立模型

之后调用VGG网络

我们首先点进keras.applications中看一下

发现其中有很多网络,此时我们用的网络为vgg16,之后我们再看VGG16的参数

我们这里首先使用到了weights,这个参数为是否使用VGG16的权重,如果使用我们就输入'imagenet',如果不使用,我们就输入None,第一次运行的时候权重会自动从网络上下载

这一步有可能下载失败,除了多尝试几次,我们还可以通过其他渠道先把模型下载好,之后放在 用户目录下的.keras\models中,我当前是C:\Users\MSI.keras\models,下面这两个文件是我运行代码自动下载下来的文件

nclude_top为是否使用最后的全链接层(就是上面提到的FC-4096这些),如果使用我们就输入True,如果不使用我们就输入False,这个就得看情况,如果是我们应用场景是日常的一些事物,且种类很多,这个我们最好是使用它原来的全连接层,当前我们是做猫狗二分类,所以我们这里输入False

我们称没有全连接层的神经网络为卷积基,这个也是我们变量名称conv_base的含义,卷积基本身就为一个神经网络,我们可以看一下它的summary()

之后我们在卷积基的基础上建立神经网络

  • GlobalAveragePooling2D()在这里与之前的例子中我们可以理解为加强版的Flatten()

我们看一下这个模型

由于我们继承了VGG的权重,之后进行的训练实际上我们希望仅对Dense层训练,所以我们要将卷积基置为不可训练状态

我们现在再看一下这个模型

发现可训练参数比起之前少了许多

2.3  编译模型

2.4  训练模型

我们看一下曲线

  • acc

  • loss

我们可以看到训练仅进行15次,正确率就可达到80%以上,且仍然有上升趋势,从图像上来看,我们的结果是有一点儿欠拟合,我们可以增加epoch,这样训练的acc与loss应该会有改观

之后我们保存模型

2.5  预测模型

然后我们对模型进行预测,我们使用这两张图像进行预测

我们训练时的输出层是有sigmoid的,所以在这里我们使用0.5作为阈值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是一个基于 PyTorch 的迁移学习实例,可以参考一下: 1. 导入必要的库 ```python import torch import torch.nn as nn import torchvision from torchvision import datasets, models, transforms import numpy as np import matplotlib.pyplot as plt ``` 2. 加载数据集 ```python data_dir = '/path/to/data' data_transforms = { 'train': transforms.Compose([ transforms.RandomResizedCrop(224), transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]), 'val': transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]), } image_datasets = {x: datasets.ImageFolder(os.path.join(data_dir, x), data_transforms[x]) for x in ['train', 'val']} dataloaders = {x: torch.utils.data.DataLoader(image_datasets[x], batch_size=4, shuffle=True, num_workers=4) for x in ['train', 'val']} dataset_sizes = {x: len(image_datasets[x]) for x in ['train', 'val']} class_names = image_datasets['train'].classes ``` 3. 加载预训练模型 ```python model_ft = models.resnet18(pretrained=True) num_ftrs = model_ft.fc.in_features model_ft.fc = nn.Linear(num_ftrs, 2) ``` 4. 定义损失函数和优化器 ```python criterion = nn.CrossEntropyLoss() # Observe that all parameters are being optimized optimizer_ft = torch.optim.SGD(model_ft.parameters(), lr=0.001, momentum=0.9) ``` 5. 训练模型 ```python def train_model(model, criterion, optimizer, num_epochs=25): for epoch in range(num_epochs): print('Epoch {}/{}'.format(epoch, num_epochs - 1)) print('-' * 10) # Each epoch has a training and validation phase for phase in ['train', 'val']: if phase == 'train': model.train() # Set model to training mode else: model.eval() # Set model to evaluate mode running_loss = 0.0 running_corrects = 0 # Iterate over data. for inputs, labels in dataloaders[phase]: inputs = inputs.to(device) labels = labels.to(device) # zero the parameter gradients optimizer.zero_grad() # forward # track history if only in train with torch.set_grad_enabled(phase == 'train'): outputs = model(inputs) _, preds = torch.max(outputs, 1) loss = criterion(outputs, labels) # backward + optimize only if in training phase if phase == 'train': loss.backward() optimizer.step() # statistics running_loss += loss.item() * inputs.size(0) running_corrects += torch.sum(preds == labels.data) epoch_loss = running_loss / dataset_sizes[phase] epoch_acc = running_corrects.double() / dataset_sizes[phase] print('{} Loss: {:.4f} Acc: {:.4f}'.format( phase, epoch_loss, epoch_acc)) return model device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") model_ft = model_ft.to(device) model_ft = train_model(model_ft, criterion, optimizer_ft, num_epochs=25) ``` 6. 保存模型 ```python torch.save(model_ft.state_dict(), '/path/to/save/model.pth') ``` 这个例子中,我们使用了一个预训练的 ResNet-18 模型进行迁移学习,然后训练了一个二分类模型。你可以根据自己的需要进行修改和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Suyuoa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值