Caffeでのディープラーニングトレーニングの全プロセス

Caffeでのディープラーニングトレーニングの全プロセス

[[189573]]

今日の目標は、Caffe を使用してディープラーニング トレーニングの全プロセスを完了することです。 Caffe は、カリフォルニア大学バークレー校の Yangqing Jia 博士によって 2013 年に Github でリリースされた有名なディープラーニング フレームワークです。それ以来、Caffe は研究コミュニティと業界コミュニティの両方で大きな注目を集めています。 Caffe は比較的使いやすく、コードも簡単に拡張でき、実行速度は業界で認められており、非常に成熟したコミュニティもあります。

ディープラーニングを学び始めたばかりの学生にとって、Caffe は非常に適したオープンソース フレームワークです。しかし、同じタイプの他のフレームワークと比較すると、その最大の特徴は、コードとフレームワークが比較的シンプルで、詳細な理解と分析に適していることです。今回ご紹介する内容は Caffe で長きにわたって形成されてきたものであり、現在では Caffe のほとんどのバージョンにこれらの機能が含まれています。 Caffeのダウンロードとインストールに関しては公式サイトの指示に従ってダウンロードとインストールを行ってください。ここでは詳細には触れません。

従来の教師あり学習タスクには、主にトレーニングと予測という 2 つの主要なステップが含まれます。ここでは、Caffe が提供する MNIST データセットの手書き数字認識を例に、その具体的な使用方法を紹介します。

上記のディープラーニングトレーニングの手順をさらに詳しく分解すると、一般的なプロセスは次のサブステップに分けられます。

  1. データ前処理(データベースの構築)
  2. ネットワーク構造とモデルトレーニング構成
  3. トレーニングと再トレーニング
  4. トレーニングログ分析
  5. 予測テストと分析
  6. パフォーマンステスト

以下、一つずつ紹介させていただきます。

1. データ前処理

最初のステップは、トレーニング データと予測データを前処理することです。ここでの作業は、一般的に、分析および識別する画像に対して簡単な前処理を実行し、それをデータベースに保存することです。画像ファイルから直接データを読み取るのではなく、なぜこの手順を実行する必要があるのでしょうか。実際のタスクのトレーニング データの量は非常に大きい場合があり、画像ファイルからデータを読み取って初期化する効率は非常に低いため、トレーニングのペースを速めるために、事前にデータをデータベースに保存する必要があります。

以下の操作はすべてターミナル内で完了します。最初のステップは、データをローカルにダウンロードすることです。幸いなことに、MNIST データの量はそれほど多くありません。ネットワーク環境が良好であれば、このステップは非常に高速になります。まず、caffe インストール ルート ディレクトリ (CAFFE_HOME) に移動し、次のコマンドを実行します。

  1. cd データ/mnist
  2.  
  3. ./get_mnist.sh

プログラムを実行すると、フォルダー内にさらに 4 つのファイルが存在するはずです。これら 4 つのファイルは、ダウンロードしたデータ ファイルです。 2 番目のステップでは、例のデータベース作成プログラムを呼び出す必要があります。

  1. $CAFFE_HOME をコピーする
  2.  
  3. ./examples/mnist/create_mnist.sh

プログラムを実行すると、examples/mnist フォルダーの下にさらに 2 つのフォルダーが作成され、それぞれ MNIST のトレーニング データとテスト データが格納されます。スクリプトの BACKEND 変数を変更することでデータベース形式を変更できることは注目に値します。現在、データベースには 2 つの主流オプションがあります。

  • レベルDB
  • ライト

これら 2 つのデータベースには、データの保存方法と操作方法にいくつかの違いがあります。1 つ目は、データの整理方法です。LevelDB では次のようになります。

LMDB の内容は次のとおりです。

構造から、LevelDB にはより多くのファイルがあり、LMDB ファイルはよりコンパクトであることがわかります。

2 つ目は、データ読み取りインターフェースです。シナリオによっては、データベースをトラバースして元の画像の分析と処理を完了する必要があるため、データの読み取り方法も理解する必要があります。まず、LMDB がデータを読み取るためのコードです。

次はLevelDB読み取り用のコードです。

最後に、このセクションの質問に戻りましょう。画像を直接読み取るのではなく、データベースを使用してデータを保存するのはなぜですか? ここでは、MNIST データで構築された 2 つのデータベースの順次読み取りの速度を簡単にテストできます。ここでは、システム関数 time を使用して時間を計測します。結果は次のとおりです。

元の画像の読み取り速度を比較するために、MNIST データを jpeg 形式の画像として保存し、その読み取り効率をテストします (Caffe python で使用される scikit 画像を例に挙げます)。コードは次のとおりです。

最終時間は以下のとおりです。

このことから、元の画像とデータベースを比較すると、データの読み取り効率に大きな差があることがわかります。 Caffe トレーニングではデータの読み取りは非同期で行われますが、あまり遅くすることはできないため、トレーニング中にデータベースが選択されます。

2 つのデータベースの比較については、ここではこれ以上の詳細は説明しません。興味のある人は、いくつかの大規模なデータ セットで実験を行うと、2 つのデータ セット間の違いを確認しやすくなります。

2. ネットワーク構造とモデルトレーニング構成

前のセクションでは、データベースを作成しました。これで、モデルをトレーニングする準備が整いました。一般的に、Caffe はトレーニングに設定ファイルを読み取る方法を使用します。 Caffe の設定ファイルは通常、solver.prototxt と net.prototxt の 2 つの部分で構成されます (net.prototxt が複数ある場合もあります)。これらは実際には、Caffe システム アーキテクチャの 2 つの非常に重要なエンティティ、つまりネットワーク構造 Net とソルバー Solver に対応しています。まず、solver.prototxt の比較的短い内容を見てみましょう。誰もが理解しやすいように、すべての構成情報に注釈が付けられています。

誰もが理解しやすいように、examples/mnist/lenet_solver.prototxt の内容をここで並べ替えます。構成ファイル全体は、次の質問に答えることと同じです。

  • ネットワーク構造ファイルはどこにありますか?
  • トレーニングにはどのようなコンピューティング リソースが使用されますか? CPU ですか、それとも GPU ですか?
  • トレーニングにはどのくらいの時間がかかりますか? トレーニングとテストの比率はどれくらいですか? 出力はいつ確認できるようになりますか?
  • 最適な学習率をどのように設定しますか? 運動量や正則化などの他の最適化パラメータについてはどうですか?
  • 必ずゲームを保存することを忘れないでください。そうしないと、最初からやり直す必要があります...

次は net.prototxt です。これは各ネットワーク層のパラメータ構成を無視し、ネットワークの基本構造とタイプ構成のみを表示します。

  1. 名前 「LeNet」  
  2. レイヤー {
  3. 名前: 「mnist」          
  4. タイプ: 「データ」      
  5. 上部 「データ」          
  6. 上部 「ラベル」  
  7. }
  8. レイヤー {
  9. 名前: "conv1"          
  10. タイプ: 「畳み込み」          
  11. 下部: 「データ」          
  12. : "conv1"  
  13. }
  14. レイヤー {
  15. 名前: "pool1"  
  16. タイプ: 「プーリング」  
  17. 下部: "conv1"  
  18. : "pool1"  
  19. }
  20. レイヤー {
  21. 名前: "conv2"  
  22. タイプ: 「畳み込み」  
  23. 下部: 「プール1」  
  24. : "conv2"  
  25. }
  26. レイヤー {
  27. 名前: "pool2"  
  28. タイプ: 「プーリング」  
  29. 下: "conv2"  
  30. 「プール2」  
  31. }
  32. レイヤー {
  33. 名前: "ip1"  
  34. タイプ: "InnerProduct"  
  35. 下部: 「プール2」  
  36. : "ip1"  
  37. }
  38. レイヤー {
  39. 名前: "relu1"  
  40. タイプ: "ReLU"  
  41. 下部: 「ip1」  
  42. : "ip1"  
  43. }
  44. レイヤー {
  45. 名前: "ip2"  
  46. タイプ: "InnerProduct"  
  47. 下部: 「ip1」  
  48. トップ 「ip2」  
  49. }
  50. レイヤー {
  51. 名前 「損失」  
  52. タイプ: "SoftmaxWithLoss"  
  53. 下: 「ip2」  
  54. 下部: 「ラベル」  
  55. トップ 「損失」  
  56. }

ここではネットワーク構造の基本的な構成のみが示されていますが、これも多くのスペースを占有します。一般的に、このファイルに 100 行以上が含まれることは珍しくありません。たとえば、有名な ResNet ネットワークのファイルの長さは通常 1,000 行を超えており、読み取るのはさらに困難になります。そこで疑問になるのが、このような大規模なネットワーク ファイルは人間によって直接編集されるのか、ということです。必ずしもそうとは限りません。忍耐強く少しずつ書き終える人もいますが、そのような大変な作業はやりたくないという人もいます。実際、Caffe は一連のインターフェースを提供しており、コードを記述することでこのファイルを生成できます。これにより、モデル構成の記述がはるかに簡単になります。以下は、LeNet ネットワーク構造を生成するコードを示しています。

最終結果は皆さんによく知られているので、ここでは述べません。

  1. レイヤー {
  2. 名前: 「データ」  
  3. タイプ: 「データ」  
  4. 上部 「データ」  
  5. 上部 「ラベル」  
  6. 変換パラメータ {
  7. スケール: 0.00390625
  8. ミラー: 
  9. }
  10. データパラメータ {
  11. 出典: "123"  
  12. バッチサイズ: 128
  13. バックエンド: LMDB
  14. }
  15. }
  16. レイヤー {
  17. 名前: "conv1"  
  18. タイプ: 「畳み込み」  
  19. 下部: 「データ」  
  20. : "conv1"  
  21. 畳み込みパラメータ {
  22. 出力数: 20
  23. カーネルサイズ: 5
  24. 歩幅: 1
  25. ウェイトフィラー {
  26. タイプ: "xavier"  
  27. }
  28. バイアスフィラー {
  29. タイプ: "定数"  
  30. }
  31. }
  32. }
  33. レイヤー {
  34. 名前: "pool1"  
  35. タイプ: 「プーリング」  
  36. 下部: "conv1"  
  37. : "pool1"  
  38. プーリングパラメータ{
  39. プール: MAX  
  40. カーネルサイズ: 2
  41. 歩幅: 2
  42. }
  43. }
  44. レイヤー {
  45. 名前: "conv2"  
  46. タイプ: 「畳み込み」  
  47. 下部: 「プール1」  
  48. : "conv2"  
  49. 畳み込みパラメータ {
  50. 出力数: 50
  51. カーネルサイズ: 5
  52. 歩幅: 1
  53. ウェイトフィラー {
  54. タイプ: "xavier"  
  55. }
  56. バイアスフィラー {
  57. タイプ: "定数"  
  58. }
  59. }
  60. }
  61. レイヤー {
  62. 名前: "pool2"  
  63. タイプ: 「プーリング」  
  64. 下: "conv2"  
  65. 「プール2」  
  66. プーリングパラメータ{
  67. プール: MAX  
  68. カーネルサイズ: 2
  69. 歩幅: 2
  70. }
  71. }
  72. レイヤー {
  73. 名前: "ip1"  
  74. タイプ: "InnerProduct"  
  75. 下部: 「プール2」  
  76. : "ip1"  
  77. 内部製品パラメータ {
  78. 出力数: 500
  79. ウェイトフィラー {
  80. タイプ: "xavier"  
  81. }
  82. バイアスフィラー {
  83. タイプ: "定数"  
  84. }
  85. }
  86. }
  87. レイヤー {
  88. 名前: "relu1"  
  89. タイプ: "ReLU"  
  90. 下部: 「ip1」  
  91. : "ip1"  
  92. }
  93. レイヤー {
  94. 名前: "ip2"  
  95. タイプ: "InnerProduct"  
  96. 下部: 「ip1」  
  97. トップ 「ip2」  
  98. 内部製品パラメータ {
  99. 出力数: 10
  100. ウェイトフィラー {
  101. タイプ: "xavier"  
  102. }
  103. バイアスフィラー {
  104. タイプ: "定数"  
  105. }
  106. }
  107. }
  108. レイヤー {
  109. 名前 「損失」  
  110. タイプ: "SoftmaxWithLoss"  
  111. 下: 「ip2」  
  112. 下部: 「ラベル」  
  113. トップ 「損失」  
  114. }

上記のコードではスペースをあまり節約できないと思われるかもしれません。実際、上記のコードをより適切にモジュール化すれば、非常に簡潔になります。ここではデモンストレーションしませんので、ぜひご自身で試してみてください。

3. トレーニングと再トレーニング

データの準備とトレーニングに関する構成の決定が完了したら、正式にトレーニングを開始しましょう。トレーニングでは次のスクリプトを開始する必要があります:

その後、一定期間のトレーニングの後、コマンドラインは大量のログを生成し、トレーニングプロセスが完了します。現時点では、トレーニング済みモデル ディレクトリにはさらにいくつかのファイルがあります。

明らかに、これらのファイルはトレーニング プロセスのコンテンツを保存しますが、これらのファイルは何をするのでしょうか。 *caffemodel* ファイルは caffe モデルのパラメーターを保存し、 *solverstate* ファイルはトレーニング プロセスの中間結果を保存します。パラメータを保存することは想像しやすいですが、トレーニング中の中間結果を保存することは少し抽象的です。 solverstate には何が保存されているのでしょうか? この質問に答えるには、src/caffe/proto/caffe.proto ファイルから取得される、solverstate のコンテンツ定義を見つける必要があります。

その内容の意味は定義から明確に分かります。その中でも、履歴はより興味深い情報であり、過去のパラメータ最適化情報を保存します。この情報はどのように使用されるのでしょうか? 多くのアルゴリズムは履歴更新情報に依存しているため、モデルがトレーニングを途中で停止し、以前のトレーニングの結果に基づいてトレーニングを続行する場合、トレーニングを続行するために履歴最適化情報が必要になります。モデルのトレーニングが突然中断され、履歴情報が失われた場合、モデルは最初からトレーニングするしかありません。このようなディープラーニングフレームワークには、「ブレークポイントトレーニング」の機能はなく、「もう一度やり直す」機能のみがあります。今日の大規模なディープラーニングモデルのトレーニングには長い時間がかかり、モデルによってはトレーニングに数日かかるものもあります。フレームワークがブレークポイントトレーニングを提供していない場合、マシンに問題が発生してプログラムがクラッシュすると、モデルを最初からトレーニングする必要があり、エンジニアの心身に大きな影響を与えます...そのため、このアーカイブメカニズムにより、モデルトレーニングの信頼性が大幅に向上します。

一方、モデルのトレーニングが完全に完了した場合、この履歴情報は役に立たなくなります。 caffemodel ファイルは保存する必要がありますが、solverstate ファイルは直接破棄できます。したがって、この個別の保管方法は操作が特に便利です。

先ほどの「ブレークポイントトレーニング」から、ディープラーニングには実は「再トレーニング」という概念が含まれていることがわかります。一般的に、「再トレーニング」には 2 つのモードがあり、その 1 つが前述の「ブレークポイント トレーニング」です。前の設定ファイルからわかるように、トレーニングの反復回数は合計 10,000 回で、モデルは 5,000 回のトレーニングごとに保存されます。トレーニング中に不可抗力によってモデルが中断された場合(たとえば、マシンの電源が切れた場合)、5000 回の反復中に保存されたモデルと履歴更新パラメータから復元できます。コマンドは次のとおりです。

これをもう少し深く分析してみましょう。モデルの履歴更新情報は保存されていますが、当時のトレーニング シナリオは完全に復元されているでしょうか? どうやらそうではないようです。トレーニングに影響を与える重要な要素がまだ復元されていません。それはデータであり、トレーニング プロセスで正確に制御することは容易ではありません。つまり、最初のトレーニング中の反復トレーニングの 5001 回目のデータは、現在の「ブレークポイント トレーニング」のデータとは異なります。しかし、一般的に言えば、各トレーニング バッチ内のデータの分布が類似しており、大きな違いがない限り、両方のタイプのトレーニングは正しい方向に進むことができ、それらの間の小さな違いは無視できます。

2 番目のタイプの「再トレーニング」は、理論的根拠によってサポートされるトレーニング モデルです。このモードでは、以前のトレーニングに基づいてモデル構造に特定の変更を加え、それを他のモデルに適用します。このタイプの学習は転移学習と呼ばれます。簡単な例を挙げます。現在のモデルのトレーニングが完了すると、モデル パラメータが新しいモデルに直接割り当てられ、新しいモデルが最初からトレーニングされます。これは次のコマンドで実行できます。

コマンドを実行すると、Caffe は通常通りトレーニングを開始し、大量のログを出力しますが、初期化が完了すると次のようなログが出力されます。

このログは、このパスのモデルに対する現在のトレーニングが「微調整」されていることを示しています。

4. トレーニングログ分析

トレーニング プロセス中に、Caffe は大量のログを生成します。これにはトレーニング プロセスに関する多くの情報が含まれており、分析する価値があります。分析する側面は多数ありますが、その 1 つは、トレーニング中の目的関数損失の変化曲線を分析することです。この例では、反復回数が増えるにつれて Softmax Loss がどのように変化するかを分析できます。まず、トレーニング プロセスのログ情報を保存します。たとえば、ログ情報は mnist.log ファイルに保存されます。次に、次のコマンドを使用して、反復と損失の情報を抽出して保存します。

抽出された情報は、別のスクリプトを使用して損失曲線を描画するために使用できます。

  1. matplotlib.pyplot をpltとしてインポートします。
  2. x = []
  3. y = []
  4.   'loss_data'fとして開きます:
  5. fの場合:
  6. sps = 行[:-1].split()
  7. x.append( int (sps[0])) を追加
  8. y.append( float (sps[1]))
  9. plt.plot(x,y)
  10. plt.show()

結果は図 1 に示されています。損失が急速に非常に低いレベルまで低下し、モデルのトレーニング速度が非常に速かったことがわかります。この優れたパフォーマンスは多くの問題を説明できますが、ここでは詳細に分析しません。

さらに、テストフェーズの精度など、ログに出力されるその他の情報も観察および分析することができ、これも上記の方法を使用して解析できます。使用される方法は基本的に同じなので、ここでは詳細には触れず、自分で試してみてください。

通常のトレーニング中、ログには各反復セット後のモデルトレーニングの全体的な情報のみが表示されます。より詳細な情報を知りたい場合は、solver.prototxt でデバッグ情報をオンにして、分析に役立つより有用な情報を取得する必要があります。

  1. デバッグ情報: true  

デバッグ情報をオンにすると、各反復セット後のネットワークの各層の順方向および逆方向の計算プロセスに関する詳細情報を確認できます。ここでは、反復処理後に 1 セットのログ情報を傍受して表示します。

ネットワークのパフォーマンスについて詳しく知りたい場合は、これらを分析することが不可欠です。

5. 予測テストと分析

モデルのトレーニングが完了したら、そのトレーニング パフォーマンスを検証して、他のテスト データ セットでも正しいかどうかを確認する必要があります。 Caffe はテスト結果を出力するための別の機能を提供します。そのスクリプトは次のとおりです。

スクリプトの出力は次のようになります。

テスト検証を完了することに加えて、モデルの動作の詳細を知る必要がある場合もあります。そのためには、モデルを深く調べて、モデルによって生成された中間結果を観察する必要があります。 Caffe が提供するインターフェースを使用すると、ネットワーク出力の各層の中間結果を視覚的に表示できるため、誰もがモデルの各層の役割を観察し、分析することができます。コードは次のとおりです。

上記のコードを実行すると、図 2 ~ 5 のような画像が生成されます。各画像はモデル レイヤーの出力画像を表します。

この一連の図は、畳み込みニューラル ネットワークが数値を特徴コードに変換する方法を示しています。この方法はモデルの内部性能をよく示すことができますが、例えば、conv1 の結果画像の中には数字の境界を抽出したものや、前景ピクセルの位置を明確にしたものなどがあります。この現象は、第 3 章で例示した畳み込み効果に似ています。しかし、conv2 の結果グラフになると、モデルの出力が少しわかりにくくなります。実際のところ、これらの画像が何を表現しようとしているのかを本当に理解するのは非常に困難です。

6. パフォーマンステスト

テストデータの精度に加えて、モデルの実行時間も大きな懸念事項です。モデルの実行に時間がかかりすぎたり、使用できなくなるほどになったりすると、その高い精度は意味をなさなくなります。テスト時間のスクリプトは次のとおりです。

Caffe は前方および後方の計算を正常に完了し、時間を記録します。以下はテスト結果の時間記録です。

パフォーマンス テスト中、Lenet モデルは順方向計算を完了するのに 1 ミリ秒未満しかかからず、非常に高速であることがわかります。もちろん、これは比較的良好な GPU 上で実行されていますが、条件の悪い GPU 上で実行された場合はどうなるでしょうか?

さまざまな環境がモデルの実行時間に大きな影響を与えることがわかります。

上記はモデルトレーニングの完全なプロセスです。今では、ディープラーニング モデルのトレーニングと使用について、誰もが基本的な理解を持っていると思います。実際、これを読んだ後は、本を置いてさまざまなモデルの効果を自分で練習し、ディープラーニングの実践的な旅を始めることもできます。

最後に、Caffe ソース コードの学習を容易にするために、Caffe ソース コードのアーキテクチャ図を示します。

著者について: Feng Chao は中国科学院大学を卒業し、現在は Yuanfudao でビジョンとディープラーニングの応用研究に従事しています。 2016 年から、私は Zhihu に独自のコラム「Painless Machine Learning」(https://zhuanlan.zhihu.com/hsmyy)を開設し、機械学習とディープラーニングに関する記事をいくつか公開し、好評を博しています。

<<:  PyTorch でリカレントニューラルネットワークを実装するにはどうすればいいですか?

>>:  機械学習の人気のトレンドの概要

ブログ    
ブログ    

推薦する

...

単一ニューロンは将来の活動を予測することで学習し、脳の働きを説明するのに役立つ。

何世紀にもわたり、人類は脳がどのように機能し、どのように情報を獲得するかを理解しようとしてきました。...

ルカンはソラを世界モデルとして非難し、自己回帰LLMは単純すぎると述べた。

近年、ソラは世界中の注目を集めています。それに関連するすべてのものが極端に拡大されます。 Sora ...

OpenAI は大規模なモデル ストアを立ち上げる予定で、開発者は製品を棚に置くことができます。

最近、OpenAIの人気が高まっています。GPTモデル機能のアップデートからセキュリティ問題まで、世...

AIを安全で信頼できるものにするためには、まずアルゴリズムの一般化能力を理解することから始める

ディープラーニング システムは、新しいデータに対してどの程度のパフォーマンス (一般化) を発揮しま...

中国科学院研究員蔡少偉:SATソルバーEDA基本エンジン

[[441194]]この記事はLeiphone.comから転載したものです。転載する場合は、Leip...

語尾予測に基づく英語-ロシア語翻訳品質の向上方法

[51CTO.com からのオリジナル記事] ニューラルネットワーク翻訳モデルは、使用できる語彙のサ...

データセンターの未来: AIの力を活用して経済成長とイノベーションを推進

人気のSF小説で「機械知能の台頭」が描かれる場合、通常はレーザーや爆発が伴い、軽度な場合には軽い哲学...

AIが都市の交通管理を改善する方法

交通分野における人工知能 (AI) の応用は、車両とインフラのより効果的で的を絞った使用に向けたイノ...

【人工知能】人間と機械の対決知能技術の総合レビュー

[[359893]] 1 はじめに<br /> 人工知能は誕生以来、人間の知能と比較して...

変革管理における生成AIの課題

AI が社会に重大なリスクをもたらすという警告が見出しで報じられているにもかかわらず、ボストン コン...

...

第6回ドルイドチャイナミートアップがKuaishou本部で開催されました

3月16日、KuaishouとTestin Cloud Testingが共同で主催するApache ...

教師あり学習、教師なし学習、強化学習とは何ですか?ついに誰かが明らかにした

01 用語このセクションでは、機械学習の概要とその 3 つの分類 (教師あり学習、教師なし学習、強化...

マスク氏も騙された。AIの虚偽の内容が「リアル」すぎる

イスラエルとパレスチナの紛争が深刻化するにつれ、ソーシャルメディアのプラットフォーム上には現地の情景...