因为我们只必要最后一层提供两个概率,即图像的概率是否为cat,我们可以从头界说最后一层中的输出特性数。
- model.fc = nn.Linear(num_ftrs, 2)
这是我们模子的新架构。
我们此刻要做的就是实习模子的最后一层,我们将可以或许行使我们从头定位的vgg16来猜测图像是否是猫,并且数据和实习时刻都很是少。
数据的巨细很小,数据相似性也很低
思量来自(https://www.kaggle.com/kvinicki/canine-coccidiosis),这个数据集包括了犬异孢球虫和犬异孢球虫卵囊的图像和标签,异孢球虫卵囊是一种球虫寄生虫,可传染狗的肠道。它是由萨格勒布兽医学院建设的。它包括了两种寄生虫的341张图片。
这个数据集很小,并且不是Imagenet中的一个种别。在这种环境下,我们保存预先实习好的模子架构,冻结较低的层并保存它们的权重,并实习较低的层更新它们的权重以顺应我们的题目。
- count = 0
- for child in model.children():
- count+=1
- print(count)
Out: 10
ResNet18共有10层。让我们冻结前6层。
- count = 0
- for child in model.children():
- count+=1
- if count < 7:
- for param in child.parameters():
- param.requires_grad = False
此刻我们已经冻结了前6层,让我们从头界说最终输出层,只给出2个输出,而不是1000。
- model.fc = nn.Linear(num_ftrs, 2)
这是更新的架构。
此刻,实习这个呆板进修模子,更新最后4层的权重。
数据集的巨细很大,但数据相似性很是低
思量这个来自kaggle,皮肤癌MNIST的数据集:HAM10000
其具有高出10015个皮肤镜图像,属于7种差异种别。这不是我们在Imagenet中可以找到的那种数据。
这就是我们只保存模子架构而不保存来自预实习模子的任何权重的处所。让我们从头界说输出层,将项目分类为7个种别。
- model.fc = nn.Linear(num_ftrs, 7)
这个模子必要几个小时才气在没有GPU的呆板长举办实习,可是假如你运行足够的期间,你如故会获得很好的功效,而不愿界说你本身的模子架构。
数据巨细很大,数据相似性很高
思量来自kaggle 的鲜花数据集(https://www.kaggle.com/alxmamaev/flowers-recognition)。它包括4242个花草图像。图片分为五类:洋甘菊,郁金香,玫瑰,向日葵,蒲公英。每个类约莫有800张照片。
这是应用迁徙进修的抱负环境。我们保存了预实习模子的系统布局和每一层的权重,并实习模子更新权重以匹配我们的特定题目。
- model.fc = nn.Linear(num_ftrs, 5)
- best_model_wts = copy.deepcopy(model.state_dict())
我们从预实习的模子中复制权重并初始化我们的模子。我们行使实习和测试阶段来更新这些权重。
- for epoch in range(num_epochs):
-
- print(‘Epoch {}/{}’.format(epoch, num_epochs — 1))
- print(‘-’ * 10)
- for phase in [‘train’, ‘test’]:
-
- if phase == 'train':
- scheduler.step()
- model.train()
- else:
- model.eval()
- running_loss = 0.0
- running_corrects = 0
- for inputs, labels in dataloaders[phase]:
-
- inputs = inputs.to(device)
- labels = labels.to(device)
- optimizer.zero_grad()
- with torch.set_grad_enabled(phase == ‘train’):
-
- outputs = model(inputs)
- _, preds = torch.max(outputs, 1)
- loss = criterion(outputs, labels)
-
- if phase == ‘train’:
- loss.backward()
- optimizer.step()
- 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))
-
- if phase == ‘test’ and epoch_acc > best_acc:
- best_acc = epoch_acc
- best_model_wts = copy.deepcopy(model.state_dict())
- print(‘Best val Acc: {:4f}’.format(best_acc))
- model.load_state_dict(best_model_wts)
这种呆板进修模式也必要几个小时的实习,但纵然只有一个实习epoch ,也会发生精彩的结果。
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|