PyTorch でシンプルな分類器を実装する

PyTorch でシンプルな分類器を実装する

[[328922]]

私自身の PyTorch の学習過程を思い出すと、最初はいろいろな情報を見つけ、それを書き留めて実行することはできましたが、学習プロセスを体験していませんでした。チュートリアルの中には、CNN を書くところから始まるものもあります。内容は実はとてもシンプルなのですが、いきなり始めると要点を見失い、混乱してしまいがちです。一部のチュートリアルは表面的な内容のみです。インストラクターが入り口まで案内してくれますが、中に入る前にチュートリアルが終わってしまったように感じてしまいます。

そこで私は、自分の元々の学習経路を要約し、引き続き Python Torch の基礎を強化する準備をしました。一方で、Python Torch にまったく触れたことがない状態から始めて、最新の論文の一部を完成させるまで、ゼロからチュートリアルを整理したいと考えていました。メインスレッドは自分の勉強ノートを整理し、誰でも参照できるようにすることです。

最初のノートでは、まず単純な分類器を完成させます。主なプロセスは次の 3 つの部分に分かれています。

1. 2 次元平面上のいくつかのポイントを 2 つのカテゴリに分割したトレーニング セットをカスタマイズして生成します。

2. 特徴に適合する浅いニューラル ネットワークを構築します。主に、PyTorch でネットワーク構造を構築する方法を理解するためです。

3. トレーニングとテストの部分を完了し、pytorch がネットワークをトレーニングおよびテストする方法を理解します。

1. データセットをカスタマイズする

  1. n_data =トーチ.ones (100, 2)  
  2. x0 =トーチ.normal (2*n_data, 1)  
  3. y0 =トーチゼロ(100)  
  4. x1 =トーチ.normal (-2*n_data, 1)  
  5. y1 =トーチ.ones (100)  
  6. x = torch.cat ((x0, x1)).type(torch.FloatTensor)  
  7. y = torch.cat ((y0, y1)).type(torch.LongTensor)

この記事では、ニューラル ネットワーク モデルを最も簡単な方法で理解し、それを PyTorch で構築できるように、まず自分で定義した単純なデータセットに分類を実装することを検討します。

NumPy に精通している学生であれば、このコードの内容を推測できるはずですが、これは NumPy では NumPy 配列であり、PyTorch ではテンソルです。ここでは、考えを整理する必要のある学生を支援するために、これらのコード行の機能を簡単に紹介します。

まず、n_dataは他のデータを生成するために使われるベンチマークデータです。100行2列のテンソルで、値はすべて1です。 x0 は、この n_data によって生成されるデータの種類の座標値です。

具体的な生成方法は、torch.normal() 関数を使用し、最初のパラメータが mean、2 番目のパラメータが std です。したがって、返される結果 x0 は n_data と同じ形状になりますが、データは平均 2、標準偏差 1 の正規分布からランダムに選択されます。 y0は値がすべて0である100次元テンソルです。

x0 と y0 はこのように理解できます。x0 の形状は 100 行 2 列のテンソルです。値は 2 を中心にランダムに分布しており、正規分布に従います。これらの点のラベルは y0 に設定されており、これは 0 です。一方、x1 に対応する中心は -2 で、ラベルは y1 です。つまり、各点のラベルは 1 です。

最終的に生成された x と y はすべてのデータをマージした結果であり、x0 と x1 はデータとしてマージされ、y0 と y1 はラベルとしてマージされます。

2. 浅いニューラルネットワークを構築する

  1. クラス Net(torch.nn.Module):  
  2. def __init__(self, n_feature, n_hidden, n_output):  
  3. super(Net, self).__init__()  
  4. self.n_hidden = torch.nn.Linear (n_feature、n_hidden) です。  
  5. 自己出力= torch.nn.Linear (n_hidden、n_output)  
  6. def forward(self, x_layer):  
  7. x_layer = torch.relu (self.n_hidden(x_layer))  
  8. x_layer =自分自身.out(x_layer)
  9.   x_layer = torch.nn. functional.softmax (x_layer) の x_layer ...  
  10. x_layerを返す 
  11. ネット=ネット( n_feature = 2 n_hidden = 10 n_output = 2 )  
  12. # 印刷(ネット)  
  13. オプティマイザー= torch.optim.SGD (net.parameters(), lr = 0.02 )  
  14. loss_func = torch.nn.CrossEntropyLoss () です。

上記の Net() クラスは、ニューラル ネットワークを構築する手順です。 PyTorch を使用してニューラル ネットワークを作成するのが初めてであれば、これは十分に単純な例です。コンテンツは、__init__() 関数と forward() 関数の 2 つの部分で構成されます。

簡単に言えば、__init__() 関数はネットワーク構造、存在するレイヤー、および各レイヤーの機能を定義します。たとえば、この関数では、self.n_hidden は線形フィッティング関数、つまり、隠し層へのマッピングと同等の完全接続層を定義します。入力は n_feature で、出力は隠れ層 n_hidden のニューロン数です。そして、self.out も完全に接続された層です。入力は隠れ層のニューロン数 n_hidden で、出力は最終出力結果 n_output です。

次は forward() 関数です。これはニューラル ネットワークの実行順序を定義することと同じです。ここでは、上記の隠し層関数が最初に入力 x_layer、つまり最初の完全に接続された self.n_hidden() で実行され、次に活性化関数 relu が出力で実行されることがわかります。次に、同じメソッドが繰り返され、出力層 self.out() を通じて最終出力が取得されます。出力 x_layer が返されます。

optimizer はここで定義される最適化手法であり、lr は学習率パラメータです。次に、損失関数としてクロスエントロピー損失関数を選択します。これは上記のコードの最後の行です。アルゴリズムと損失関数を最適化するには、pytorch でさまざまな API インターフェースを直接選択できます。形式に関しては、上記の固定形式を直接参照できます。

3. トレーニングとテストを完了する

  1. iが範囲(100)内にある場合:  
  2. アウト=ネット(x)  
  3. # print(out.shape, y.shape)  
  4. 損失= loss_func (出力、y)  
  5. オプティマイザ.zero_grad()  
  6. 損失.後方()  
  7. オプティマイザ.ステップ()

次に、トレーニングプロセスがどのように実行されるかを見てみましょう。 net() は Net() クラスからインスタンス化するオブジェクトなので、net() を使用してモデルを直接実行できます。out はモデルによって予測された結果であり、loss はクロスエントロピー損失関数に従って真の値から計算された誤差です。

次の 3 行のコードは、勾配バックプロパゲーションを実行する方法を示した標準形式です。この時点で、トレーニングは実際に完了しており、このネットワークを直接使用してテスト データ セットを予測および分類できるようになりました。

  1. # 列車の結果 
  2. トレーニング結果=ネット(x)  
  3. # 印刷(train_result.shape)  
  4. 訓練予測= torch.max (訓練結果、1)[1]  
  5. plt.scatter(x.data.numpy()[:, 0], x.data.numpy()[:, 1], c = train_predict .data.numpy(), s = 100 , lw = 0 , cmap = 'RdYlGn' )  
  6. plt.show()

このモデルの役割を誰もがよりよく理解できるように、ここで視覚化作業を行ってモデルの学習効果を確認してみましょう。この目標は、Python で非常に一般的なデータ視覚化ライブラリである matplotlib を通じて達成できます。matplotlib の具体的な使用法についてはここでは紹介しません。

ここでの目的は、トレーニング セットに対するトレーニング済みモデルの分類効果、つまりトレーニング エラーを示すことです。

  1. # テスト 
  2. t_data =トーチゼロ(100, 2)  
  3. テストデータ= torch.normal (t_data, 5)  
  4. テスト結果=ネット(テストデータ)  
  5. 予測= torch.max (テスト結果、1)[1]  
  6. plt.scatter(test_data[:, 0], test_data[:, 1], s = 100 c = prediction .data.numpy()、 lw = 0 cmap = 'RdYlGn' )  
  7. plt.show()

次に、平均値が 0 であるデータをランダムに生成し、モデルがこれらのデータ ポイントをどのように分類するかを確認します。

トレーニングされたセグメンテーション ラインは描画されていませんが、モデルがデータを 2 つのカテゴリに分割するセグメンテーション インターフェイスを学習したこともわかります。

<<:  AI温度測定から警備ロボットまで、インテリジェントセキュリティは新たな「ゲートキーパー」となるのでしょうか?

>>:  機械学習は電力業界に大きな変化をもたらすだろう

ブログ    
ブログ    
ブログ    

推薦する

...

...

機械学習アルゴリズムの比較

[[176276]]この記事では、主に、一般的に使用されているいくつかのアルゴリズムの適応シナリオと...

...

自動運転までどれくらい遠いのでしょうか?

[[412592]] 2021年、北京では初めて規制に従って無人配送車両の公道走行が許可された。写...

2020年の人工知能開発動向予測

調査によると、機械学習のアプリケーション、ツール、テクニック、プラットフォーム、標準に大きな変化が起...

生成 AI は通信業界を救うことができるか?

MWC 2024カンファレンスで、Nvidiaは、ARM、ServiceNow、SoftBankと...

AAAI 2024 フェロー発表、清華大学の朱軍教授が選出

AAAI(人工知能振興協会)は、人工知能分野で国際的に最も権威のある学術団体の一つです。フェローは協...

...

高性能 LLM 推論フレームワークの設計と実装

1. 大規模言語モデル推論の概要従来の CNN モデル推論とは異なり、大規模言語モデルの推論は通常、...

パスワード危機: ディープラーニングがパスワードクラッキングを加速!

情報セキュリティの専門家は、「生成的敵対ネットワーク」(GAN)がオンラインセキュリティをどのように...

ゼロから: Python で決定木アルゴリズムを実装する

決定木アルゴリズムは、非常に人気のある強力な予測方法です。初心者だけでなく専門家にも簡単に理解できる...

ビジネスにおける人工知能のリスクと限界

ビジネスにおいては、人工知能のリスクと限界を考慮する必要があります。 AI のリスクと限界には、プラ...