Datawhaleゼロ基礎入門CV試合-Task 4モデル訓練と検証

6312 ワード

4モデルトレーニングと検証
この章では、構築検証セット、モデルトレーニングと検証、モデル保存とロード、モデルチューニングのいくつかのセクションを参照し、セクションではPytorchコードと組み合わせて説明します.
4.1学習目標
  • 検証セットの役割を理解し、訓練セットおよび検証セットを使用して訓練
  • を完了する.
  • 学会Pytorch環境でのモデルの読み取りとロード、および参照プロセス
  • の理解
    4.2検証セットの構築
    機械学習モデル(特に深さ学習モデル)の訓練過程では、モデルは非常にフィットしやすい.深さ学習モデルは絶えず訓練過程で訓練誤差が徐々に低下するが、テスト誤差の動きは必ずしもそうではない.
    モデルの訓練中、モデルは訓練データのみを利用して訓練を行うことができ、モデルはテストセットのサンプルに接触することができない.したがって、モデルが訓練集合学をよくしすぎると、モデルは訓練サンプルの詳細を記憶し、モデルの試験集合での汎化効果が劣る現象をオーバーフィット(Overfitting)と呼ぶ.オーバーフィットに対応するのはアンダーフィット(Underfitting)であり、すなわちモデルの訓練集合でのフィット効果が劣る.
    [画像のアップロードに失敗しました...(image-7 bc 543-15900848692949)]
    図に示すように、モデルの複雑さとモデルのトレーニングホイール数が増加するにつれて、CNNモデルのトレーニングセットでの誤差は減少するが、テストセットでの誤差は徐々に減少し、その後徐々に上昇するが、私たちはモデルのテストセットでの精度が高いほど良いことを追求している.
    モデルがフィットしすぎる原因には多くの原因があり、その中で最もよく見られるのはモデル複雑度(Model Complexity)が高すぎて、モデルが訓練データの各方面に学び、枝葉末節の法則を学んだことだ.
    上記の問題を解決するための最良の解決方法:テストセットと可能な限り分布が一致するサンプルセット(検証セットと呼ぶことができる)を構築し、訓練中にモデルの検証セットでの精度を絶えず検証し、モデルの訓練を制御する.
    試合問題が与えられた後、試合問題側は訓練セットとテストセットの2つの部分のデータを与えます.参加者は訓練セットの上にモデルを構築し、テストセットの上でモデルの汎化能力を検証する必要がある.したがって,参加者はモデル対テストセットの予測結果を提出することによって,自分のモデルの汎化能力を検証することができる.同時に、参加者も提出回数の制限を制限し、参加選手の「点数」を避ける.
    一般的には、参加選手も自分でローカルに検証セットを分けてローカル検証を行うことができます.トレーニングセット、検証セット、およびテストセットはそれぞれ異なる役割を果たします.
  • トレーニングセット(Train Set):モデルを使用してモデルパラメータをトレーニングおよび調整します.
  • 検証セット(Validation Set):モデルの精度を検証し、モデルのスーパーパラメータを調整します.
  • テストセット(Test Set):モデルの汎化能力を検証します.
  • 訓練セットと検証セットは別々であるため,モデルの検証セット上の精度はモデルの汎化能力をある程度反映できる.検証セットを分割する際には、検証セットの分布がテストセットとできるだけ一致しなければならないことに注意する必要があります.そうしないと、モデルの検証セットでの精度は指導的な意味を失います.
    検証セットがこんなに重要である以上、ローカル検証セットをどのように区分するか.いくつかの試合では、試合の問題側は検証セットを与えます.試合問題者が検証セットを与えていない場合、参加選手は訓練セットから一部を分割して検証セットを得る必要がある.検証セットの区分には、次のような方法があります.
    [画像のアップロードに失敗しました...(image-c 1 a 51 e-15900848692949)]
  • 残法(Hold-Out)
  • 直接訓練セットを2つの部分に分け、新しい訓練セットと検証セットを作成します.このような区分方式の利点は最も直接的で簡単である.欠点は、検証セットが1つしか得られず、モデルが検証セットにフィットする可能性があることです.シーンを残して適用するのはデータ量が大きい場合です.
  • クロス検証法(Cross Validation,CV)
  • 訓練セットをK部に分割し,その中のK−1部を訓練セットとし,残りの1部を検証セットとし,K訓練をループする.この分割方式は,すべての訓練セットが検証セットであり,最終モデル検証精度はK部平均で得られた.この方式の利点は,検証セットの精度が比較的信頼性が高く,訓練K回でK個の多様性の違いのあるモデルを得ることができることである.CV検証の欠点は,K回の訓練が必要であり,データ量が大きい場合には不適切であることである.
  • セルフサンプリング法(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')
    

    各Epochのトレーニングコードは以下の通りです.
    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()
    

    各Epochの認証コードは以下の通りです.
    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)
    

    4.4モデルの保存とロード
    Pytorchではモデルの保存とロードが非常に簡単で、モデルパラメータの保存とロードが一般的です:torch.save(model_object.state_dict(), 'model.pt') model.load_state_dict(torch.load(' model.pt'))4.5モデル参照プロセス
    深さ学習原理は少ないが実践性は非常に強く,基本的に多くのモデルの検証は訓練によってしか達成できない.同時に深さ学習には多くのネットワーク構造とスーパーパラメータがあるため,試行を繰り返す必要がある.訓練深さ学習モデルはGPUのハードウェアサポートが必要であり,訓練時間も多く必要であり,どのように効果的に訓練深さ学習モデルを訓練するかが次第に学問となっている.
    深い学習には多くのトレーニングテクニックがあり、比較的推奨される読書リンクは以下の通りです.
  • http://lamda.nju.edu.cn/weixs/project/CNNTricks/CNNTricks.html
  • http://karpathy.github.io/2019/04/25/recipe/

  • この節では、よくあるテクニックを選んで説明し、今回の試合問題について具体的な分析を行います.従来の機械学習モデルとは異なり,深さ学習モデルの精度はモデルの複雑さ,データ量,正規化,データ増幅などの要因と直接関連している.したがって,深さ学習モデルが異なる段階(フィッティング,オーバーフィッティング,完璧フィッティング)にある場合,どの角度でモデルを最適化し続けることができるかを知ることができる.
    今回の試合に参加する過程で、以下の論理で完成することをお勧めします.
  • 1.簡単なCNNモデルを初歩的に構築し、特に複雑ではなく、訓練、検証、予測の流れを走る.
  • 2.単純CNNモデルの損失は比較的大きく,モデルの複雑さを増大させ,検証セットの精度を観察することを試みた.
  • 3.モデルの複雑さを増大させながら,検証セット精度が変わらないまでデータ増幅法を増大させた.

  • [画像のアップロードに失敗しました...(image-38 d 015-15900848692949)]
    4.6本章小節
    この章では、深さ学習モデルのトレーニングと検証に基づいて、検証セットの区分方法、モデルトレーニングと検証、モデル保存とロード、およびモデルパラメータの流れについて説明します.
    モデルの複雑さは相対的であり、必ずしもモデルが複雑であればあるほど良いとは限らないことに注意してください.有限装置と有限時間では,高速反復訓練が可能なモデルを選択する必要がある.