加入收藏 | 设为首页 | 会员中心 | 我要投稿 惠州站长网 (https://www.0752zz.com.cn/)- 办公协同、云通信、物联设备、操作系统、高性能计算!
当前位置: 首页 > 移动 > 正文

如何为您的机器学习问题选择正确的预训练模型

发布时间:2019-05-10 06:46:50 所属栏目:移动 来源:不靠谱的猫
导读:副标题#e# 在这篇文章中,我们将简要介绍一下迁移学习是什么,以及如何使用它。 什么是迁移学习? 迁移学习是使用预训练模型解决深度学习问题的艺术。 迁移学习是一种机器学习技术,你可以使用一个预训练好的神经网络来解决一个问题,这个问题类似于网络最

这是更新的架构。

迁移学习:如何为您的机器学习问题选择正确的预训练模型 迁移学习:如何为您的机器学习问题选择正确的预训练模型

现在,训练这个机器学习模型,更新最后4层的权重。

数据集的大小很大,但数据相似性非常低

考虑这个来自kaggle,皮肤癌MNIST的数据集:HAM10000

其具有超过10015个皮肤镜图像,属于7种不同类别。这不是我们在Imagenet中可以找到的那种数据。

这就是我们只保留模型架构而不保留来自预训练模型的任何权重的地方。让我们重新定义输出层,将项目分类为7个类别。

  1. model.fc = nn.Linear(num_ftrs, 7) 

这个模型需要几个小时才能在没有GPU的机器上进行训练,但是如果你运行足够的时代,你仍然会得到很好的结果,而不必定义你自己的模型架构。

数据大小很大,数据相似性很高

考虑来自kaggle 的鲜花数据集(https://www.kaggle.com/alxmamaev/flowers-recognition)。它包含4242个花卉图像。图片分为五类:洋甘菊,郁金香,玫瑰,向日葵,蒲公英。每个类大约有800张照片。

这是应用迁移学习的理想情况。我们保留了预训练模型的体系结构和每一层的权重,并训练模型更新权重以匹配我们的特定问题。

  1. model.fc = nn.Linear(num_ftrs, 5) 
  2. best_model_wts = copy.deepcopy(model.state_dict()) 
迁移学习:如何为您的机器学习问题选择正确的预训练模型

我们从预训练的模型中复制权重并初始化我们的模型。我们使用训练和测试阶段来更新这些权重。

  1. for epoch in range(num_epochs): 
  2.   
  3.  print(‘Epoch {}/{}’.format(epoch, num_epochs — 1)) 
  4.  print(‘-’ * 10) 
  5.  for phase in [‘train’, ‘test’]: 
  6.   
  7.  if phase == 'train': 
  8.  scheduler.step() 
  9.  model.train()  
  10.  else: 
  11.  model.eval() 
  12.  running_loss = 0.0 
  13.  running_corrects = 0 
  14.  for inputs, labels in dataloaders[phase]: 
  15.   
  16.  inputs = inputs.to(device) 
  17.  labels = labels.to(device) 
  18.  optimizer.zero_grad() 
  19.  with torch.set_grad_enabled(phase == ‘train’): 
  20.   
  21.  outputs = model(inputs) 
  22.  _, preds = torch.max(outputs, 1) 
  23.  loss = criterion(outputs, labels) 
  24.   
  25.  if phase == ‘train’: 
  26.  loss.backward() 
  27.  optimizer.step() 
  28.  running_loss += loss.item() * inputs.size(0) 
  29.  running_corrects += torch.sum(preds == labels.data) 
  30.   
  31.  epoch_loss = running_loss / dataset_sizes[phase] 
  32.  epoch_acc = running_corrects.double() / dataset_sizes[phase] 
  33.  print(‘{} Loss: {:.4f} Acc: {:.4f}’.format( 
  34.  phase, epoch_loss, epoch_acc)) 
  35.   
  36.  if phase == ‘test’ and epoch_acc > best_acc: 
  37.  best_acc = epoch_acc 
  38.  best_model_wts = copy.deepcopy(model.state_dict()) 
  39. print(‘Best val Acc: {:4f}’.format(best_acc)) 
  40. model.load_state_dict(best_model_wts) 
迁移学习:如何为您的机器学习问题选择正确的预训练模型

这种机器学习模式也需要几个小时的训练,但即使只有一个训练epoch ,也会产生出色的效果。

您可以按照相同的原则在任何其他平台上使用任何其他预训练的网络执行迁移学习。本文随机挑选了Resnet和pytorch。任何其他CNN都会给出类似的结果。希望这可以节省您使用计算机视觉解决现实世界问题的痛苦时间。

(编辑:惠州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读