機械学習プロジェクトを管理および組織化する方法

機械学習プロジェクトを管理および組織化する方法

この記事では主に、機械学習プロジェクトの編成と管理に関する実践的な経験をいくつか紹介します。

パイソン

Python は、機械学習プロジェクトの開発に使用される主要な言語の 1 つです。機械学習に使用できる多数のライブラリ/パッケージが含まれています。

  • numpy: 多次元配列や数値計算に適しています。データ処理でよく使用されます。
  • pandas: データ分析によく使われるライブラリ。 Pandas データフレームは、基本的に、行と列のラベルとして説明的な文字列を持つ numpy 配列です。 pandas データフレームのデータは簡単に並べ替え、フィルタリング、グループ化、結合などを行うことができ、データ処理に非常に便利です。
  • PyTorch: ニューラル ネットワークの構築に使用されます。多数の事前トレーニング済みモデルとコンピューター ビジョン データセットが含まれています。 Pytorch はオブジェクト指向プログラミングを推奨しており、Pytorch でのコードの記述は高速で、Pytorch はデフォルトで高速実行をサポートしているため、Python デバッガーで使用できます。
  • TensorFlow: Pytorch よりも業界的に人気のある代替手段。 Pytorch は研究に適しています。 TensorFlow を使用し、より高レベルのインターフェースが必要な場合は、Keras を使用してください。
  • scikit-learn: これは、回帰、サポート ベクター マシン、k 近傍法、ランダム フォレスト、混同行列の計算などに最適なライブラリです。
  • matplotlib、seaborn: データの視覚化によく使用されるライブラリの 1 つ。

ギット

Git バージョン管理は、機械学習プロジェクトを整理するのに非常に便利です。

Git は、コードに加えられたすべての変更を追跡するために使用できるツールです。 Git「リポジトリ」は、コード ファイルを含むディレクトリです。 Git はストレージスペースを節約する技術を使用しているため、コードの複数のコピーを保存する代わりに、古いファイルと新しいファイル間の相対的な変更を保存します。 Git を使用すると、最新バージョンのみが存在するように見えるため、コード ファイル ディレクトリをクリーンかつ整理された状態に保つことができます (ただし、いつでも任意のバージョンのコードに簡単にアクセスできます)。ユーザーは、「コミット」を使用してコードへの特定の変更を関連する記述内容とともにバンドルすることで、どのような変更を加えるかを選択できます。 Git リポジトリを使用すると、コードの共有や共同作業も容易になります。全体的に、Git は、「myscriptv1.py」、「dataprocessingv56.py」、「utils_73.py」などの 100 万の異なるバージョンを保持するよりも、古いコードを保存するのに適した方法です。

Git バージョン管理は、GitHub、GitLab、Bitbucket を通じて実装できます。私は GitHub を最もよく使います。

GitHub の使い方は次のとおりです。

  • Gitをインストールする
  • GitHubアカウントにサインアップする
  • SSH 経由で GitHub アカウントをコンピューターに接続します。いつでもコードをアップロードしてクラウドに保存できるようにします。
  • プロフィールの「リポジトリ」セクションにある緑色の「新規」ボタンをクリックして、GitHub に新しいリポジトリを作成します。
  • パソコンでこのリポジトリにコードをプッシュできるようにします (コマンドの例を以下に示します)。
  1. echo "# pytorch-computer-vision" >> README.md
  2. git init git add README.md
  3. git commit -m "最初のコミット"   
  4. git ブランチ -M マスター git リモート originを追加https://github.com/rachellea/pytorch-computer-vision.git
  5. git プッシュ -u origin マスター

myeditedscript.py にコード変更があった場合、次のようにコミットすることでバージョンを管理できます。

  1. git でmyeditedscript.pyを追加します
  2. git commit -m '超便利な機能を追加しました'   
  3. git プッシュオリジンマスター

アナコンダ

Anaconda は、異なる Python バージョンや異なるパッケージ バージョンを含む可能性のあるさまざまな環境の作成をサポートしています。 Anaconda は、依存関係が競合する複数のプロジェクトで作業している場合に特に便利です。

Anaconda の使い方は簡単です:

まず、Anacondaをインストールします

次に、環境を作成します。環境には、その環境が含まれるプロジェクトにちなんで名前を付けることをお勧めします。たとえば、プロジェクトがニューラル ネットワークを使用した胸部 X 線分類に関するものであった場合、環境は chestxraynn という名前になります。

  1. conda作成  --name chestxraynn python=3.5  

環境名を引用符で囲まないようにしてください。そうしないと、引用符文字自体が環境名の一部になります。さらに、Python の任意のバージョンを選択できます。 python3.5である必要はありません。

環境が作成されたら、それをアクティブ化します。 「アクティベーション」とは、単に「環境に配置される」ことを意味し、その環境にインストールされているすべてのソフトウェアを使用できるようになります。 Windows のアクティベーション コマンドは次のとおりです。

  1. chestxraynnをアクティブにする

Linux/macOS のアクティベーション コマンドは次のとおりです。

  1. ソースをアクティブ化 chestxraynn

「conda install」コマンドを使用して、環境にパッケージをインストールします。 matplotlib のインストールを例に挙げます。

  1. conda をインストール -c conda-forge matplotlib

技術的には、conda 環境内で pip を使用してパッケージをインストールすることも可能ですが、問題が発生する可能性があるため、可能であれば避ける必要があります。

Anaconda は、環境内のすべてのバージョンに互換性があることを確認します。その他のコマンドについては、Conda チートシートを参照してください。

他の人のコマンドファイルを直接使用して conda 環境を作成することもできます。 GitHub の github/rachellea/pytorch-computer-vision には、チュートリアル コードを実行するために必要な依存関係を指定する tutorial_environment.yml ファイルがあります。このファイルに基づいて conda 環境を作成するには、Anaconda プロンプトで次のコマンドを実行するだけです。

  1. conda env作成-f チュートリアル環境.yml

コード管理: クラスと関数

コード管理は非常に重要です。コードが何千行もあり、ドキュメントがなく、至る所にコード ブロックが繰り返され、一部のコード ブロックが説明なしにコメント アウトされ、さまざまな奇妙な変数名が付けられている場合、それは単なる大惨事です。

Pytorch 実装で通常見られるすべてのコードは整理されており、適切に文書化されています。

長期的には、プロジェクトに高品質のコードを書くと多くの時間を節約できます。高品質なコードの特徴の 1 つは、モジュール内での編成と管理です。

コード管理の提案:

  • オブジェクト指向プログラミング。 PyTorch 機械学習フレームワークは、あらゆるものにオブジェクト指向プログラミングを使用するのに役立つため、使用することを強くお勧めします。 Pytorch では、モデルはクラスであり、データセットもクラスです。
  • 関数を使用します。クラスとしてうまく機能しないものを記述した場合は、コードを関数に整理します。関数は再利用可能です。


コード管理図

コード管理: ディレクトリ

複数のモジュールを使用してコードを整理し、それらのモジュールをディレクトリに整理します。簡単な例を見てみましょう。

全体的な構成は次のとおりです。

  • トレーニング-評価-テスト ループ モジュール (src/run_experiment.py)
  • パフォーマンス メトリックを計算するためのモジュール (src/evaluate.py)
  • データ処理用の 1 つ以上のモジュール (loaddataset/custom-pascal.py、loaddatasetcustomtiny.py)
  • 1 つ以上のモデル モジュール (models/custommodelsbase.py)


コード管理ディレクトリ図

データセットはこのリポジトリに保存されますが (「train」、「val」、「test」ディレクトリ内の png 画像)、一般にデータセットをリポジトリに置くことはお勧めできません。このリポジトリにデータセットが存在する唯一の理由は、それがデモンストレーション目的で作成された小さなデータセットであるためです。データが非常に小さい場合を除き、リポジトリに格納しないでください。

ファイルのインポート

モジュールがそれらのディレクトリからファイルをインポートできるように、各サブディレクトリに init.py という名前の空のファイルが必要であることに注意してください。

awesomecode.py というモジュールが、どのディレクトリにあるかに応じて helpercode.py というモジュールを呼び出す方法は次のとおりです。

ドキュメント

ドキュメントを書くのは素晴らしいことです。すべての関数、メソッド、クラスをドキュメント化します。場合によっては、関数が記述される前にドキュメント化します。ドキュメントがコードより長い場合でも問題ありません。十分に明確でないよりも「明確すぎる」方が良いです。

上の画像は、CT ボリュームを表す 3D numpy 配列をランダムに回転させる単純な関数 rand_rotate() です。コメントは、回転ベクトルが (k-1) を使用する理由を説明しているので役に立ちます。これは、選択された k が 1、2、または 3 であり、Python がゼロインデックスであるためです。このような簡単な指示により、後で混乱を防ぐことができます。


データ処理チュートリアルコード内の注記

ドキュメントがあれば、古いコードを確認するときに、コードと関数が何をするのかをすぐに思い出すことができます。ドキュメントは、ユーザーが何か変なものを見つけて変更したいと思ったときに、誤って自分のコードを壊してしまうことを防ぎます。ドキュメント化により、他の人もあなたのコードを理解して使用できるようになります。

変数の命名

常に説明的な変数名を使用してください。 「volumetricattngr_truth」は「truth」よりも適切な変数名です。

行と列を反復処理する場合でも、変数名として「i」と「j」ではなく、「row」と「col」を使用してください。かつて私は、非常に奇妙なバグの追跡に丸一日を費やしましたが、数百行のコードのうちのたった 1 行で「i」と「j」を入れ替えたために 2D 配列を誤って反復処理したことが原因であることがわかりました。これが、1 文字の変数名を使用した最後の例です。

モジュールテスト

多くの人は、研究目的のためだけにコードのテストを書く時間がないと主張します。研究の本質は「正しい答え」が何であるかが分からないということであり、答えを生成したコードが正しいかどうか分からない場合、その答えが正しいことをどうやって確認できるのか、研究コードをテストすることの方が重要だと思います。

コードの単体テストを 1 日かけて書くたびに、いくつかのバグが見つかります。その中には重要でないバグもあれば、非常に重大なバグもあります。ユニットテストを書くと、コード内にバグが見つかります。他の人のコードの単体テストを書くと、そのコードにもバグが見つかるでしょう。

コードの正確性を促進することに加えて、ユニット テストは、一度に多くのことを実行する「God 関数」の作成を抑制することで、適切なコード構成を強化するのに役立ちます。 God 関数は通常、テストするのが大変なので、より小さく管理しやすい関数に分割する必要があります。

少なくとも、複雑なデータ処理やモデル内のテンソルの奇妙な配置など、コードの最も重要な部分を単体テストすることをお勧めします。コードが正しいことを確認することは決して時間の無駄ではありません。

これらの単体テストには、デモンストレーション目的でいくつかの組み込み PyTorch 関数のテストが含まれています。

視覚的エラー修正

特にコンピューター ビジョンでは、視覚化を使用して健全性チェックを実行すると便利です。

Matplotlib は、画像、セグメンテーション プロット、境界線のある画像などを表示するのに最適です。以下は、matplotlib の imshow() 関数を入力画像に適用して生成された視覚化の例です。


Matplotlib 可視化

Seaborn は統計データの視覚化用に設計されています。ヒートマップを作成したり、パフォーマンス メトリックの複雑な視覚化を生成するのに非常に役立ちます。以下は、seaborn で約 1 行のコードで作成できるプロットの例です。


シーボーン視覚化

matplotlib と seaborn はどちらも、入力データが意味をなすかどうか、グラウンド トゥルースが意味をなすかどうか、データ処理が計画どおりに行われなかったかどうか、モデルの出力が意味をなすかどうかなどを即座に示す視覚化を作成するために使用できます。

ユニットテストと視覚化

Demo-0-Unit-Tests-and-Visualization.py は、まず src/unit_tests.py 内のユニット テストを実行し、次に PASCAL VOC 2012 データセットの画像セグメンテーションを視覚化します。

デモの視覚化部分を実行するには、demo-0-Unit-Tests-and-visualization.py を、PASCAL VOC 2012 データセットを保存したコンピューター上のフォルダーに変更します。データセットをダウンロードしたら、視覚化を実行できます。視覚化を実装するコードは loaddataset/custompascal.py にあります。現在、デモ ファイルでは、「imagestovisualize」の合計数は 3 に設定されています。さらに多くの画像を視覚化する場合は、この数をさらに増やして、たとえば 100 にすることができます。

視覚化結果は次のとおりです。


PASCAL VOC 2012データセットからの航空機画像


再サンプリング後の航空機画像

視覚化の結果から、いくつかの有用なことが推測できます。

  • 入力画像と画像セグメンテーション間のマッピングは正しいです。
  • ピクセル単位のセグメンテーションを定義するために使用される整数とラベル記述文字列間のマッピングは正しいです。たとえば、1 は「飛行機」に正しくマッピングされます。
  • 再サンプリング手順では、入力画像またはセグメント化された画像は「破壊」されません。

ターミナルでの可視化

「非対話型環境」(つまり、グラフィカル ユーザー インターフェイスのない端末) にいる場合は、対話型表示をオフにして図を保存し、他の場所で開くことができるようにする必要があります。

  1. インポートシーボーン
  2. matplotlibをインポートする
  3. matplotlib.use( 'agg' ) を使う
  4. matplotlib.pyplot をpltとしてインポートします。
  5. plt.ioff() #seaborn 図: heatmap = seaborn.heatmap(some_dataframe, cmap = 'Blues' , square= True , center=0)
  6. heatmap.get_figure().savefig( 'Descriptive_Figure_Name.png' ,bbox_inches= 'tight' )
  7. plt.close () 関数
  8. #matplotlib 図: plt.imshow(chest_x_ray,cmap= 'gray' )
  9. plt.savefig( 'その他の説明図名.png' )
  10. plt.close () 関数

Python デバッガー

Python デバッガーは、プログラムがクラッシュした時点での変数やオブジェクトの状態を検査し、プログラムがクラッシュした時点でのコード スニペットを実行して、可能な解決策を試すことができる、非常に便利なツールです。 Python デバッガーを使用すると、print ステートメントを使用してデバッグするよりもはるかに効率的であり、何時間もの時間を節約できます。 Python デバッガーを PyTorch と組み合わせて使用​​して、テンソル、勾配、ログ データフレームなどを検査することもできます。

Python デバッガーを使用してターミナルでスクリプトを対話的に実行するには、次のコマンドを使用します。

  1. python -m pdb myscript.py

上記のコマンドを入力すると、(Pdb) プロンプトが表示されます。続行するには「c」と入力してください。 (これは継続を意味する小文字の c 1 つだけです)。

Python デバッガーを終了するには、「q」(終了を意味する小文字の q) を使用します。完全に終了するには、q を 2 回使用する必要がある場合があります。

プログラムの特定の時点で停止したい場合は、関連するモジュールに pdb をインポートし、停止したい特定の時点で「pdb.set_trace()」を配置します。あるいは、pdb をインポートする手間を省きたい場合は、プログラムを停止する場所で常に「assert False」と入力できます。これにより、指定されたポイントでプログラムが終了することが保証されます (ただし、これは Python デバッガーを使用する正式な方法ではありません)。

Jupyter Notebookを使わない

これまでのすべてのセクションを考慮すると、この記事では、機械学習プロジェクト、または数日以上かかるコーディング プロジェクトには Jupyter Notebook を使用しないことを推奨します。

なぜ?

  • Jupyter ノートブックでは、すべてをグローバル名前空間に配置することが推奨されています。その結果、あらゆることを実行し、関数、クラス、または構造を持たない巨大なモンスター モジュールが作成されます。
  • Jupyter ノートブックではコードの再利用が難しくなります。関数は再利用可能ですが、セル 5、10、および 13 のコードは再利用できません。
  • Jupyter ノートブックではユニットテストが困難になります。関数とメソッドは単体テストできます。セル 5、10、および 13 のコードは単体テストできません。

1. コードが整理されるほど (つまり、クラスと関数に細分化されるほど)、Jupyter Notebook のインタラクティブ性は低下します。インタラクティブ性こそが、人々が Jupyter Notebook を好む主な理由です。 Jupyter Notebook の魅力的なインタラクティブ性は、本質的には、高度に構造化され、整理されたコードとは正反対です。

  • Jupyter ノートブックでは、Git バージョン管理を正しく使用することが困難です。 Jupyter ノートブックは単なる大量の JSON ファイルなので、それらを適切にマージしたり、プル リクエストを実行したりすることは基本的に不可能です。
  • Jupyter ノートブックでは他のユーザーとの共同作業が困難になります。 Jupyter ノートブックでは、「通常のコード」の場合のように同じ担当者からプッシュ/プルするのではなく、「交代で」作業する必要があります。
  • Jupyter ノートブックには非線形ワークフローがあり、これは再現可能な研究とは正反対です。

では、Jupyter ノートブックは何に適しているのでしょうか? 考えられる使用例としては、初期のデータ視覚化、宿題、インタラクティブなプレゼンテーションなどがあります。

コーディング標準

役に立つコーディング標準は次の 2 つです。

  • 正しく理解しやすいコードを記述します。コードが正しければ、モデルが良好な結果を生成し、研究の結論が正しい可能性が高くなり、実際に役立つものを作成できるようになります。
  • ターミナルで単一のコマンド (例: 「python main.py」) を実行するだけで、モデル、結果、グラフなど、作成したすべてのものを誰でも再現できるようにします。これにより、他の人があなたの作業を基に作業を進めることができるだけでなく、「将来のあなた」が自分の作業を基に作業を進めることもできます。

要約する

  • Pythonは機械学習に最適な言語です
  • Git バージョン管理は、さまざまなバージョンのコードを追跡するのに役立ちます。 GitHub から入手できます。
  • Anaconda は、異なる Python バージョンやパッケージを含むさまざまな環境の作成をサポートするパッケージ マネージャーです。競合する依存関係を持つ複数のプロジェクトで作業する場合に非常に便利です。
  • コードをモジュール内のクラスと関数に整理します。 Git リポジトリ内の階層ディレクトリ構造でモジュールを整理します。
  • コメントとドキュメント文字列でコードを文書化する
  • 説明的な変数名を使用します。 1 文字の変数名を使用しないでください。
  • 特にデータ処理とモデルの最も複雑または重要な部分については、単体テストを記述します。
  • matplotlib と seaborn を使用してデータセット、モデル出力、モデルパフォーマンスを視覚化します。
  • Pythonデバッガーによる高速かつ効率的なデバッグ
  • 機械学習プロジェクトに Jupyter Notebook を使用しないでください

レイチェル・リー・バランタイン・ドラエロス

<<:  自動運転は「終焉」に向かっている

>>:  Google Colab をマスターするための 20 のヒント

ブログ    
ブログ    

推薦する

GC アルゴリズムをアニメーション グラフィックで説明 - ガベージ コレクションを動かしましょう。

[[425799]] Java のガベージ コレクションに関しては、私と同じように、多くの友人が、...

信頼できる AI はどのように発展すべきでしょうか?

現在、人工知能の応用範囲と深さは絶えず拡大しており、情報インフラの重要な部分になりつつあります。しか...

...

...

製造業における AI: 2023 年に知っておくべき 4 つのユースケース

多くの企業にとっての優先事項は、人間の労働者を AI に置き換えることではなく、人間の能力を増強し、...

...

2021年に人工知能の倫理的問題、社会的価値、影響について読むべき8冊の本

[[387639]]人工知能に関するこれらの 8 冊の本は、AI に関連する倫理的問題、AI が雇用...

IDC: 生成型AIへの世界的な支出は2027年に1,430億ドルに達する

IDC は最近、世界中の企業による生成 AI サービス、ソフトウェア、インフラストラクチャへの支出が...

分散キャッシュの実装: Java と MongoDB のキャッシュ一貫性戦略

インターネット アプリケーションの急速な発展に伴い、分散システムにおけるキャッシュが重要な役割を果た...

...

スマートシティにおける低リスクの AI 応用分野 3 つ

スマート シティでは、一部の AI 駆動型システムは統合にコストがかかったり、実装前に複数の規制に準...

...

中国の自動運転が新たなブレークスルーをもたらす:百度世界2020のCCTV生中継で完全無人運転を体験

中国の自動運転は新たな進歩を遂げ、無人運転の時代が到来した。 9月15日、百度はCCTVニュースと提...

B2BにおけるAIと機械学習の台頭

ハーバード・ビジネス・レビューが実施した調査によると、販売に人工知能技術を活用する企業は、潜在顧客を...

「ブラックスワン」の翼の下で:情報戦場におけるAIの光と影

[51CTO.comからのオリジナル記事] 突然の流行に直面して、国民は情報の適時性、透明性、伝達効...