简介:
迁移学习是把一个领域(即源领域)的知识,迁移到另外一个领域(即目标领域),使得目标领域能够取得更好的学习效果。通常,源领域数据量充足,而目标领域数据量较小,迁移学习需要将在数据量充足的情况下学习到的知识,迁移到数据量小的新环境中。
本文我们根据PyTorch官网上的例子(作者:Sasank Chilamkurthy)学习如何使用传输学习来训练网络。 关于迁移学习的更多例子:http://cs231n.github.io/transfer-learning/
在实际工程上,很少有人从头开始训练整个卷积网络(随机初始化),因为拥有足够大小的数据集相对来说比较少见。 相反,我们可以在一个非常大的数据集(例如ImageNet,其中包含具有1000个类别的120万个图像)上预训练ConvNet模型,然后使用ConvNet模型作为初始化或固定特征提取器来处理继续处理当前的任务。这也是迁移学习常见的二个场景:
1.Finetuning the convnet: 用一个预训练好的网络模型来初始化网络当前模型参数,而不是随机初始化网络。(就像在imagenet 1000数据集上训练的网络一样。 其余过程一样)
2.ConvNet as fixed feature extractor: 冻结除最终完全连接层之外的所有网络的权重。 这个完全连接的层被替换为具有随机权重的新层,并且只有这个层被训练。
数据集
本文使用的数据集是imagenet的一个非常小的子集。数据集只包括蚂蚁和蜜蜂,要解决的问题是训练一个模型来分类蚂蚁和蜜蜂。 由于这是一个非常小的数据集。 所以我们使用迁移学习。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])
]),
}
data_dir = './data/hymenoptera_data'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&