CIFAR データセットでディープ ラーニング モデルを効率的にトレーニングする

CIFAR データセットでディープ ラーニング モデルを効率的にトレーニングする

  現在、ImageNet データセットには多くの事前トレーニング済みモデルがありますが、CIFAR データセットには多くの事前トレーニング済みモデルはありません。CIFAR は、革新的なアイデアを検証するためのデータ セットとしてよく使用されます. これは小さなデータ セットですが、トレーニング設定が異なると、モデルの精度が大幅に異なります. ベースラインの精度を達成するモデルをトレーニングすることは、必要で時間のかかる作業です.

1 はじめに

  以前は、CIFAR 事前トレーニング モデルが必要になったときに、トレーニング コンフィギュレーションとモデル構造がなくなるとすぐに破棄していたため、次回のトレーニング コンフィギュレーションで構造の再設計とトレーニング パラメータの設定に多くの時間を浪費していました。新しいモデル アーキテクチャをトレーニングするために必要です。もちろんCIFARトレーニングの設定はGithubやGiteeなどのプラットフォームから簡単に取得できますが、多くのコードはスケーラビリティを考慮しておらず、基本的に計算能力に制限はありません。CIFAR データセット モデル トレーニングの問題を完全に解決するために、この論文では多くの論文のモデル トレーニング コードを利用し、pytorch ベースの CIFAR データセット モデル トレーニング フレームワーク (ここでは単にフレームワーク CMTF と呼びます) を記述ますコードを書いている過程で、CMTF の方が低パフォーマンスの GPU デバイスに適している可能性があることがわかりました。

  CMTF は、シンプルで効率的なトレーニング構成を採用し、明確なログ スタイルを持ち、VGG (VGG11、13、16、19 および Batchnormal を使用したそのバージョン) および ResNET (ResNet20、32、44、56、110) アーキテクチャ トレーニングをサポートします現時点では、CIFAR10 でトレーニングされた VGG16BN および ResNet20 モデルでチェックポイントが取得されており、ベースライン精度は一部の学術論文の精度よりも低くありませんさらに、CMTF はマルチカード並列計算をセットアップする必要がなく、簡単な操作で新しいモデル構造と小さなデータ セットを追加できるため、拡張が容易です。

2. CMTF のインストールと操作

  CMTF は github にアップロードされており、次の手順に従ってプロジェクトをローカル コンピューティング プラットフォームにデプロイできます。

  • まず、プロジェクトをローカルにダウンロードする必要があります。
    • Windows ユーザーの場合は、 Web サイトに直接アクセスしてプロジェクトをダウンロードし、ローカル IDE を使用してプロジェクトを開きます.ユーザーが github に入ることができない場合は、Baidu Cloud を使用してダウンロードすることもできます:

      リンク: https://pan.baidu.com/s/1ab1Z1yvhlqWU8pJwGeKcNQ?pwd=07un
      抽出コード: 07un

    • Linux ユーザーの場合、git メソッドを使用してプロジェクトを Linux サーバーにダウンロードできます。

      git クローン SunYaFeng1996/CifarModelTrainingFramework.git

サーバーが外部ネットワークに接続されていない場合は、Web サイトに直接アクセスしてプロジェクトをダウンロードし、Linux サーバーにアップロードすることもできます。

  • 次に、python 環境を構成します。

ユーザーがまったく同じ環境を使用したい場合は、conda を使用して新しい環境を作成できます。

cd CMTF所在目录
conda env create -f environment.yaml

ただし、CMTF の python 環境要件は非常に単純で、pytorch と tensorboardX のみが必要であり、ユーザーはこれら 2 つのパッケージを既存の環境に直接インストールすることをお勧めします。

  • 最後に、プログラムを実行してモデルをトレーニングします。
    トレーニング モデルのコア ファイルの場所は ModelTrainingFramework /training /load_model.py です。ユーザーは最初にプロジェクト ディレクトリに入る必要があります。
    cd 本地路径/ModelTrainingFramework
    
    ユーザーは ModelTrainingFramework フォルダーに入って上記のコマンドを実行することしかできないことに注意してください。トレーニング フォルダーに入って実行すると、インポートが失敗するためエラーが報告されます。次に、ユーザーはいくつかのパラメータを設定するだけで、モデルのトレーニングを開始できます。
    python ./training/train_model.py \
      --arch=resnet20 \
      --dataset=CIFAR10 \
      --save_path=./save/resnet20/
    
    パラメータ save_path には標準値を割り当てる必要があります。そうしないと、チェックポイントとログ ファイルが配置されているフォルダの名前がアーチに対応しなくなります。

  load_model.py がメイン プログラムで、オプションのパラメーターと範囲を次の表に示します。

パラメータ 意味   デフォルト オプション・備考
データセット データセット CIFAR10 CIFAR10、CIFAR100
データ経路 データセット パス ./datasets/CIFAR10 絶対パスと相対パスの両方が受け入れられます。
アーチ モデル構造 resnet20 resnet20、resnet34、resnet56、resnet110、vgg11(13,16,19)、vgg11(13,16,19)bn
保存パス チェックポイント ストレージ パス ./save/resnet20 絶対パスと相対パスの両方が受け入れられます。
手動シード 乱数シード なし 整数は許容され、変更は推奨されません
デバイス モデルをトレーニングするためのコンピューティング プラットフォーム クーダ クーダ、CPU
印刷頻度 出力するバッチの数 100 整数を使用できます。バッチ数を超えないようにしてください。変更はお勧めしません。
test_bs テスト セットのバッチ サイズ 256 整数は許容され、変更は推奨されません
train_bs トレーニング セットのバッチ サイズ 64 整数は許容され、変更は推奨されません
test_workers テスト セット プロセスの数 0 整数は許容され、変更は推奨されません
train_workers トレーニング セット プロセスの数 0 整数は許容され、変更は推奨されません
エポック トレーニング反復期間 160 変更はお勧めしません
start_epoch どの時期から 0 変更はお勧めしません
lr トレーニング開始時の学習率 0.1 変更はお勧めしません
勢い 勢い 0.9 変更はお勧めしません
weight_decay 減量 1.00E-04 変更はお勧めしません

  操作を簡単にするために、arch、dataset、および save_path のパラメーターのみを追加することをお勧めします。上記の操作が完了すると、チェックポイント、操作ログ、およびトレーニング カーブsave/resnet20フォルダーに保存されます。

3. CMTF 実行分析

  セクション 2 の動作パラメータを例にとると、最初の CMTF の出力を下の図に示します。CMTF は、最初にユーザー セットのモデル構造、データ セット、および出力結果の保存パスを出力します。次に、モデルの検証を実行し、最後にエポック反復トレーニングに入ります。

実行出力のスクリーンショット
  トレーニングが完了すると、save/resnet20 フォルダーの下に tb_log フォルダーと resnet20_best.pth.tar、resnet20_checkpoint.pth.tar、curve.png、log_training_resnet20_xxxx.txt が生成されます。tb_log は tensorboardX の使用可能なフォルダー、resnet20_best.pth.tar、resnet20_checkpoint.pth.tar はそれぞれトレーニング後に保存されたチェックポイントとトレーニング中の最適なチェックポイント、log_training_resnet20_xxxx.txt はプログラム出力を記録、curve.png はトレーニング曲線グラフ、下の図に示すように。
トレーニングカーブ
  トレーニング曲線は、トレーニング パフォーマンスが 80 番目のエポックと 120 番目のエポックのあたりで大幅に改善されることを示しています。これは、これら 2 つのエポックで学習率パラメーター lr が減少したためです。

if epoch in [args.epochs*0.5, args.epochs*0.75]:
            for param_group in optimizer.param_groups:
                param_group['lr'] *= 0.1

  これは、CMTF の唯一の lr スケジューリング戦略でもあり、非常に単純で効率的です。トレーニング後、ユーザーは training/load_model.py を使用してチェックポイントをロードし、検証できます。

python ./training/load_model.py \
    --arch=resnet20 \
    --save_path=./save/resnet20 \
    --resume=./save/resnet20/resnet20_checkpoint.pth.tar

  同様に、ユーザーはトレーニング フォルダーではなく、ModelTrainingFramework フォルダーに入って上記のコマンドを実行することしかできません検証が完了すると、出力は次の図のようになります。

ここに画像の説明を挿入

  最初に、チェックポイントが正常に読み込まれたかどうかを出力し、次にチェックポイントのアーキテクチャ、データセット、およびストレージ パスを出力し、最後にテスト精度、エポック、および学習率を出力します。**ユーザーの仕事がトレーニング後にモデルを操作することである場合は、load_model.py に直接コードを記述し続けることをお勧めします。**Tesla P40 GPU で実行して検証すると、resnet20、vgg16、vgg16bn のトップ 1 精度はそれぞれ 92.40% と 93.63% で、多くの学術論文のベースライン精度に達し、約 1 時間半かかります。

4. 拡張 CMTF

  CMTF のモデル構造、モデル操作、およびデータセット コードは all_utils フォルダーにあります。ユーザーは、簡単な操作で新しいデータセットとモデル構造を追加できます。

  • データセット。datasets_utils.py に GetDataLoader() 関数を追加し、if 判定の後に elif dataset == 'newly added dataset' を追加し、その後にデータセットの処理コードを追加します。
  • モデル構造。models フォルダーにモデル構造ファイルを追加し、models_utils.py の GetModel() 関数で新しいモデル作成メソッドを定義します。

  models_utils.py と models_utils.py のコードと同様に、ユーザーは独自のモデルとデータセットを CMTF にすばやく追加できます。

謝辞と結び

CMTF のログ コードとスタイルはNeural Network Weight Attack  に由来し、トレーニング設定はネットワーク プルーニングの再考に由来します。

Liu, Z., Sun, M., Zhou, T., Huang, G., & Darrell, T. (2018). ネットワーク プルーニングの価値を再考する。arXiv プレプリント arXiv:1810.05270.

Rakin, AS, He, Z., & Fan, D. (2019). ビット フリップ攻撃: プログレッシブ ビット検索によるニューラル ネットワークの粉砕。コンピュータ ビジョンに関する IEEE/CVF 国際会議の議事録 (pp. 1211-1220)。

  研究のおかげで、ユーザーは上記の 2 つの優れた作品を引用することを強くお勧めします。

  CMTF は私の数少ないブログの 1 つであり、私の最初の github プロジェクトです。現時点では、ブログの執筆レベルを向上させたいと考えています. 読者が実装プロセスで問題に遭遇した場合、またはこの記事を読んで混乱した場合は、メッセージを残すか、私の QQ: 1106295085 を追加してください. 日曜日の午後までに返信し、この記事を積極的に修正します。

おすすめ

転載: blog.csdn.net/qq_39068200/article/details/130162398