在实际工作或者学习当中,为了节省时间提高效率,我们在深度学习训练中,一般会使用已经训练好的开源模型(一般都是基于ImageNet数据集),但通常情况下我们自己涉及的模型和别人训练好的有很多地方不一样。 难道我们就没法用了吗?当然不是,我们可以有很多种方法去实现我们想要的。
実際には、レイカーズはクリッパーズゲームを打つためにちょうど待って、学ぶことではありません
事前訓練を受けました
事前訓練されたモデルをロードするには、3つの方法は現在ありません。
- 最初は、完全にネットワーク接続された最終出力層を変更することです。
- 第2のモデルは、選択的ローディングのネットワーク層です。
- 第三の方法は、当社独自のネットワークモデル、それらに移植し、直接訓練されたネットワークモデルを移植することです。
#导入头文件
from torch import nn
import torch
from torchvision import models
from torch.autograd import Variable
from torch import optim
この方法の一つ
#改变最后输出类别数
transfer_model = models.resnet18(pretrained=True)
dim_in = transfer_model.fc.in_features
transfer_model.fc = nn.Linear(dim_in,10) #img_class =10
#print(transfer_model)
方法二
for param in transfer_model.parameters():
param.requires_grad = False
optimizer = optim.SGD(transfer_model.fc.parameters(),lr=1e-3)
#为了加快效率,我们只在优化器中更新全连接部分中的参数
メソッドスリー
resnet50 = models.resnet50(pretrained=True)#加载model
cnn = CNN(Bottleneck, [3, 4, 6, 3])#自定义网络
#读取参数
pretrained_dict = resnet50.state_dict()
model_dict = cnn.state_dict()
# 将pretrained_dict里不属于model_dict的键剔除掉
pretrained_dict = {k: v for k, v in pretrained_dict.items() if k in model_dict}
# 更新现有的model_dict
model_dict.update(pretrained_dict)
# 加载我们真正需要的state_dict
cnn.load_state_dict(model_dict)
# print(resnet50)
print(cnn)
微調整
いつ、どのように微調整します
移行係数は学ぶためにたくさん持っている使用方法を決定し、これは2つだけの最も重要である:新しいデータセットのサイズだけでなく、新しいデータと元のデータセットの類似性。私たちは忘れてはならない一つのこと:ネットワーク層が学んだ前には、層は、特性の種類に関係して学んだの後ろに、普遍的な特徴です。ここで使用される4つのシナリオは以下のとおりです。
1.新しいデータセットと小さく、元のデータセットに似ています。微調整が可能性がある場合、新しいデータセットは、比較的小さいので、オーバーフィッティング;および新旧のデータ収集は同様に、我々は彼らの特性の同様のレベルを期待しているため、線形分類器を訓練抽出された特徴で、事前に訓練されたネットワークの特徴抽出として使用することができます。
2.新しいデータセットが大きく、元のデータセットと同様です。新しいデータセットが十分な大きさですので、あなたは、ネットワーク全体を微調整することができます。
3.新しいデータセットが小さく、元のデータセットに類似していません。新しいデータセットは、それが最善の微調整ではなく、元のデータ・セットは、高レベルの機能を使用するのが最善ではありません、似ていない、小さいです。しかし、フロント層の機能を使用して、この時間は、訓練されたSVM分類器です。
4.新しいデータセットとオリジナルの大規模なデータセットと類似していません。新しいデータセットが十分な大きさであるため、あなたは再訓練をすることができます。しかし、実際の微調整で事前研修モデルはまだ有効です。新しいデータセットは、ネットワーク全体が微タインすることができ、十分な大きさです。