Datawhale ZeroFoundationエントリーCVコンペティション-Task04モデルのトレーニングと検証

前の章では、トレーニング用の単純なCNNを作成し、トレーニング中のエラー損失と最初の文字予測の精度を視覚化しましたが、これらは十分とは言えません。成熟した資格のある深層学習トレーニングプロセスには、少なくとも次の機能があります。

  • トレーニングセットでトレーニングし、検証セットで検証します。
  • モデルは最適な重量を節約し、重量を読み取ることができます。
  • パラメータ調整を容易にするために、トレーニングセットと検証セットの精度を記録します。

4モデルのトレーニングと検証

この目的のために、この章では、検証セットの構築、モデルのトレーニングと検証、モデルの保存と読み込み、およびモデルの調整について説明します。一部のセクションでは、Pytorchコードを組み合わせます。

4.1オーバーフィットを防ぐ方法

機械学習モデル(特に深層学習モデル)のトレーニングプロセスでは、モデルは非常に簡単にオーバーフィットします。深層学習モデルのトレーニングエラーは、継続的なトレーニングプロセスで徐々に減少しますが、テストエラーの傾向は必ずしもそうではありません。
モデルのトレーニングプロセスでは、モデルはトレーニングにトレーニングデータのみを使用でき、モデルはテストセットのサンプルに触れることはできません。したがって、モデルがトレーニングセットを十分に学習しすぎると、モデルはトレーニングサンプルの詳細を記憶し、テストセットでのモデルの一般化が不十分になります。この現象はオーバーフィットと呼ばれます。オーバーフィットに対応するのはアンダーフィットです。つまり、モデルのトレーニングセットへのフィットが不十分です。
ここに写真の説明を挿入
図に示すように、モデルの複雑さとモデルのトレーニングラウンド数が増えると、トレーニングセットのCNNモデルのエラーは減少しますが、テストセットのエラーは徐々に減少し、その後徐々に増加します。テストセットのモデルの精度が高いほど、優れています。
モデルの過剰適合には多くの理由がありますが、最も一般的な理由は、モデルの複雑さが高すぎるため、モデルがトレーニングデータのすべての側面を学習し、いくつかの微妙なルールを学習することです。オーバーフィッティングを解決する方法には、主にデータの強化、重量の減衰、早期停止方法、およびドロップアウトが含まれます。

  • データ拡張

一般に、より良いモデルを得るには、多数のトレーニングパラメータが必要です。これが、CNNネットワークがますます深くなっている理由の1つです。トレーニングサンプルに多様性がない場合、トレーニングパラメータの量が無意味であるため、意味がありません。オーバーフィットすると、それに応じてトレーニング済みモデルの一般化能力が低下します。大量のデータによってもたらされる機能の多様性は、すべてのトレーニングパラメータを最大限に活用するのに役立ちます。データ拡張方法には、一般に次のものが含まれます。1)より多くのデータを収集する、2)ランダムに回転、反転、トリミング、画像の明るさとコントラストを設定し、既存のデータのデータを標準化する。3)生成モデル(GANなど)を使用する)いくつかのデータを生成します。
一般的なデータ増幅方法では、画像の色、サイズ、形状、スペース、およびピクセルが一般的に変換されます。もちろん、さまざまなデータ増幅方法を自由に組み合わせて、より豊富なデータ増幅方法を取得できます。
テイクtorchvision.transformsを。一例として、まず、全体としてのデータの増幅の方法を理解して、含みます:

中心裁剪:transforms.CenterCrop
随机裁剪:transforms.RandomCrop
随机长宽比裁剪:transforms.RandomResizedCrop
上下左右中心裁剪:transforms.FiveCrop
上下左右中心裁剪后翻转: transforms.TenCrop
依概率p水平翻转:transforms.RandomHorizontalFlip(p=0.5)
依概率p垂直翻转:transforms.RandomVerticalFlip(p=0.5)
随机旋转:transforms.RandomRotation
对图像进行随机遮挡: transforms.RandomErasing 
尺寸变换:transforms.Resize
标准化:transforms.Normalize
填充:transforms.Pad
修改亮度、对比度和饱和度:transforms.ColorJitter
转灰度图:transforms.Grayscale
依概率p转为灰度图:transforms.RandomGrayscale
线性变换:transforms.LinearTransformation()
仿射变换:transforms.RandomAffine
将数据转换为PILImage:transforms.ToPILImage
转为tensor,并归一化至[0-1]:transforms.ToTensor
用户自定义方法:transforms.Lambda
transforms.RandomChoice(transforms): 从给定的一系列transforms中选一个进行操作
transforms.RandomApply(transforms, p=0.5): 给一个transform加上概率,依概率进行操作
transforms.RandomOrder: 将transforms中的操作随机打乱
  • 重量減衰

一般的に使用される重み減衰にはL1とL2の正規化があり、L1はL2よりもスパースなパラメーターを取得できますが、L1のゼロ点は発散しません。損失関数では、重み減衰は正規化項の前に置かれる係数です。正規化項は一般にモデルの複雑さを示すため、重み減衰の役割は、損失関数に対するモデルの複雑さの影響を調整することです。重み減衰が大きい場合、その場合、複素数モデル損失関数の値も大きくなります。

  • 早期停止(早期停止)

早期停止方法は、実際には別の正規化方法であり、トレーニングセットと検証セットで1回繰り返した後、それぞれのエラー率を計算します。検証セットのエラー率が最小の場合は、増加を開始する前にトレーニングを停止します。トレーニングを続けると、トレーニングセットのエラー率は一般的に減少し続けますが、検証セットのエラー率は増加します。つまり、モデルの一般化能力が低下し始め、過適合の問題が発生するため、時間内に停止します。より一般化されたモデルを取得できます。次の図に示すように(左はトレーニングセットのエラー率、右の図は検証セットのエラー率です。トレーニングは点線で早期に終了します):
ここに写真の説明を挿入

  • 脱落

CNNトレーニング中のドロップアウトの使用は、各トレーニングプロセス中に一部のニューロンの重みをランダムに0にリセットすることです。つまり、一部のニューロンを無効にすることで、パラメーターの量を減らし、オーバーフィットを回避できます。ドロップアウトが効果的である理由については、2つの見方があります。1。反復ごとに一部のニューロンがランダムに無効になり、モデルの多様性が高まり、複数のモデルの統合と同様の効果が得られ、オーバーフィットが回避されます。2.ドロップアウトは、実際にはデータ拡張のプロセスであり、スパース性につながり、ローカルデータクラスターの違いをより明確にします。そのため、オーバーフィットを防ぐことができます。
ここに写真の説明を挿入

  • 均一に分散された検証セットを構築します

オーバーフィッティング問題の最善の解決策:テストセットと可能な限り一貫性のあるサンプルセット(検証セットと呼ぶことができます)を作成し、トレーニングプロセス中に検証セットでモデルの精度を継続的に検証し、これを使用してモデルを制御しますトレーニング。

4.2検証セットの構築

一般に、競技者はローカル検証のために検証セットをローカルに分割できます。トレーニングセット、検証セット、およびテストセットには、異なる機能があります。

  • トレインセット:モデルは、モデルパラメータのトレーニングと調整に使用されます。
  • 検証セット:モデルの精度を検証し、モデルのハイパーパラメーターを調整するために使用されます。
  • テストセット:モデルの一般化機能を確認します。

トレーニングセットと検証セットは分離されているため、検証セットでのモデルの精度は、モデルの一般化能力をある程度反映できます。検証セットを分割するときは、検証セットとテストセットの分布にできるだけ一貫性を持たせる必要があります。そうしないと、検証セットのモデルの精度がその指針となる重要性を失います。
検証セットは非常に重要なので、ローカル検証セットをどのように分割するか。一部の競技会では、競技者は検証セットを提供します。競技者が検証セットを提供しない場合、競技者は検証セットを取得するためにトレーニングセットの一部を分割する必要があります。検証セットを分割する方法はいくつかあります。
ここに写真の説明を挿入

  • 留出法(Hold-Out)

トレーニングセットを、新しいトレーニングセットと検証セットの2つの部分に直接分割します。この分割方法の利点は、最も直接的で単純です。欠点は、検証セットが1つしか取得されないことです。これにより、モデルが検証セットに適合しなくなる可能性があります。取り置き方式の適用シナリオは、データ量が比較的多い状況です。

  • 相互検証(CV)

トレーニングセットをKパーツに分割し、K-1パーツをトレーニングセットとして使用し、残りの1パーツを検証セットとして使用して、Kトレーニングをループします。この分割方法では、すべてのトレーニングセットが検証セットであり、最終的なモデル検証の精度はKコピーの平均によって取得されます。この方法の利点は、検証セットの精度が比較的信頼できることであり、K回のトレーニングでさまざまな違いのあるKモデルを取得できます。CV検証の欠点は、K回トレーニングする必要があることです。これは、大量のデータがある状況には適していません。次の図は、10回の相互検証の概略図です。

ここに写真の説明を挿入

  • セルフサンプリング方式(BootStrap)

新しいトレーニングセットと検証セットは、交換を伴うサンプリング方法によって取得されます。各トレーニングセットと検証セットは異なります。この分割方法は、一般的にデータ量が少ない場合に適用できます。機械学習では、ブートストラッピング法により、モデルまたはアルゴリズムが、モデルまたはアルゴリズムに存在するバイアス、分散、および機能をよりよく理解できるようになります。リサンプリングでさまざまなバイアスを含めてから、それらを全体として含めます。下の図に示すように、各サンプルグループには異なる部分があり、それらはすべて異なります。これは、データセットの全体的な平均、標準偏差、およびその他の説明的な指標に影響します。次に、より堅牢なモデルを開発できます。
ここに写真の説明を挿入
このコンペティションでは、検証セットに分割されているため、プレイヤーはトレーニングセットを直接トレーニングに使用し、検証セットを使用して正確さを検証できます(もちろん、トレーニングセットと検証セットを組み合わせて検証セットを自分で分割することもできます)。
もちろん、これらの分割方法はデータ分割方法の観点からのものであり、既存のデータ競争で一般的に使用されている分割方法は、リーブアウト法とクロスバリデーション法です。データ量が比較的多い場合は、保持方法の方が適しています。もちろん、検証セットの分割によって得られる検証セットは、トレーニングセット-検証セット-テストセットの分布が一貫していることを保証する必要があるため、どのような分割方法に分割しても注意が必要です。
ここでの分布とは、通常、ラベルに関連する統計的分布を指します。たとえば、分類タスクでは、「分布」はラベルのカテゴリ分布を指します。トレーニングセット-検証セット-テストセットのカテゴリ分布は、ほぼ同じである必要があります。ラベルがタイミング情報を使用すると、検証セットとテストセットの間の時間間隔が一貫している必要があります。

4.3モデルのトレーニングと検証

ここでは、Pytorchを使用してCNNのトレーニングと検証のプロセスを完了することを目指しており、CNNネットワーク構造は前の章と一致しています。完了する必要のある論理構造は次のとおりです。

  • トレーニングセットと検証セットを作成します。
  • 各ラウンドをトレーニングして検証し、検証セットの最高の精度に従ってモデルを保存します。
train_loader = torch.utils.data.DataLoader(
    train_dataset,
    batch_size=10, 
    shuffle=True, 
    num_workers=10, 
)   

val_loader = torch.utils.data.DataLoader(
    val_dataset,
    batch_size=10, 
    shuffle=False, 
    num_workers=10, 
)

model = SVHN_Model1()
criterion = nn.CrossEntropyLoss (size_average=False)
optimizer = torch.optim.Adam(model.parameters(), 0.001)
best_loss = 1000.0

for epoch in range(20):
    print('Epoch: ', epoch)
    train(train_loader, model, criterion, optimizer, epoch)
    val_loss = validate(val_loader, model, criterion)   
    # 记录下验证集精度
    if val_loss < best_loss:
        best_loss = val_loss
        torch.save(model.state_dict(), './model.pt')

各エポックのトレーニングコードは次のとおりです。

def train(train_loader, model, criterion, optimizer, epoch):
    # 切换模型为训练模式
    model.train()
    
    for i, (input, target) in enumerate(train_loader):
        c0, c1, c2, c3, c4, c5 = model(data[0])
        loss = criterion(c0, data[1][:, 0]) + \
                criterion(c1, data[1][:, 1]) + \
                criterion(c2, data[1][:, 2]) + \
                criterion(c3, data[1][:, 3]) + \
                criterion(c4, data[1][:, 4]) + \
                criterion(c5, data[1][:, 5])
        loss /= 6
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

各エポックの検証コードは次のとおりです。

def validate(val_loader, model, criterion):
    # 切换模型为预测模型
    model.eval()
    val_loss = []
    
    # 不记录模型梯度信息
    with torch.no_grad():
        for i, (input, target) in enumerate(val_loader):
            c0, c1, c2, c3, c4, c5 = model(data[0])
            loss = criterion(c0, data[1][:, 0]) + \
                    criterion(c1, data[1][:, 1]) + \
                    criterion(c2, data[1][:, 2]) + \
                    criterion(c3, data[1][:, 3]) + \
                    criterion(c4, data[1][:, 4]) + \
                    criterion(c5, data[1][:, 5])
            loss /= 6
            val_loss.append(loss.item())
    return np.mean(val_loss)

モデルの保存と読み込み
Pytorchでのモデルの保存と読み込みは非常に簡単です。より一般的な方法は、モデルパラメータを保存して読み込むことです。
torch.save(model_object.state_dict(), 'model.pt')
model.load_state_dict(torch.load(' model.pt'))

4.4モデルの調整プロセス

ディープラーニングには原則がほとんどありませんが、非常に実用的です。基本的に、多くのモデルはトレーニングを通じてのみ検証できます。同時に、ディープラーニングには多くのネットワーク構造とハイパーパラメーターがあるため、繰り返し試す必要があります。深層学習モデルのトレーニングには、GPUハードウェアのサポートとより多くのトレーニング時間が必要です。深層学習モデルを効果的にトレーニングする方法が徐々に主題になっています。
深い学習のための多くのトレーニングテクニックがあります。推奨される読書リンクは次のとおりです。

  • http://karpathy.github.io/2019/04/25/recipe/

ここに写真の説明を挿入

  • pytorchオプティマイザーのチューニング

torch.optimは、さまざまな最適化アルゴリズムを実装するパッケージです。最も一般的に使用される方法はすでにサポートされており、インターフェイスは非常に従来型であるため、将来、より複雑な方法を簡単に統合できます。

optim.SGD:随机梯度下降法
optim.Adagrad:自适应学习率梯度下降法
optim.RMSprop:Adagrad的改进
optim.Adadelta:Adagrad的改进
optim.Adam:RMSprop结合Momentum
optim.Adamax:Adam增加学习率上限
optim.SparseAdam:稀疏版Adam
optim.ASGD:随机平均梯度下降
optim.Rprop:弹性反向传播
optim.LBFGS:BFGS的改进
  • pytorchの6つの学習率調整戦略

整然とした調整:ステップ、マルチステップ、指数およびコサインアニール
適応調整:ReduceLROnPleateau
カスタム調整:ラムダ
学習率の初期化:小さい方の数値を設定:0.01、0.001、0.0001

# 等间隔调整学习率
torch.optim.lr_scheduler.StepLR(optimizer,step_size,gamma=0.1)
# 按给定间隔调整学习率
optim.lr_scheduler.MultiStepLR(optimizer, milestones, gamma=0.1)
# 按指数衰减调整学习率
optim.lr_scheduler.ExponentialLR(optimizer, gamma=gamma)
# 余弦周期调整学习率
optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=t_max, eta_min=0.)
# 监控指标,当指标不再变化则调整
optim.lr_scheduler.ReduceLROnPlateau(optimizer, factor=factor, mode=mode, patience=patience, cooldown=cooldown, min_lr=min_lr, verbose=verbose)
# 自定义调整策略
torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=[lambda1, lambda2])

参照

コンピュータービジョンの練習(ストリートビューの文字エンコード認識)
datawhalechina
ハンズオンディープラーニング

Datawhaleは、データサイエンスとAIに焦点を当てたオープンソース組織であり、多くの大学やこの分野の有名企業から優秀な学習者を集め、オープンソースと探索精神を持ったチームメンバーのグループを集めています。Datawhaleは、「学習者のために、学習者とともに成長する」というビジョンを掲げ、真の自己表現、開放性と寛容性、相互信頼と相互支援、間違いを犯そうとする勇気、責任を取る勇気を奨励しています。同時に、Datawhaleはオープンソースの概念を使用して、オープンソースコンテンツ、オープンソース学習とオープンソースソリューションを探索し、人材トレーニングを強化し、人材の成長を支援し、人と人、人と知識、人と企業、人と未来の間のつながりを確立します。

おすすめ

転載: blog.csdn.net/OuDiShenmiss/article/details/106446702