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

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

推薦する

ジャック・マーがまた一人の世界クラスの科学者を採用しました。春節期間中に電車の切符を買うときにシステムクラッシュを心配する必要はもうありません!

アリババが中国だけでなく国際的にも素晴らしいインターネット企業であることは誰もが知っています。しかし...

第2世代のビッグデータの偏りを打破するには、アルゴリズムの公平性が必要

ビッグデータのシナリオでは、ますます多くのトランザクションがアルゴリズムを通じて完了します。インター...

人工知能は労働力不足の重要な解決策とみられる

セリディアンは、無限の労働力を動員する力に焦点を当てた年次経営者調査の結果を発表しました。調査では、...

AdobeなどがAIを活用しアニメキャラクターのポーズ移行を実現する新タイプの「パペットアニメーション」を提案

人形アニメーションの制作は、クリエイターの手描きに頼るアニメーションと比べると、非常に手間のかかる作...

追跡すべきマルチモーダル LLM が多すぎますか?まずは26のSOTAモデルを見てみましょう

現在、AI分野の焦点は大規模言語モデル(LLM)からマルチモーダルへと移行しており、その結果、LLM...

なぜ人工知能は第四次産業革命と呼ばれるのでしょうか?

[[234940]]過去2年間、世界のIT大手は人工知能の分野で展開してきました。GoogleはD...

AIを活用して大気汚染と戦う方法

大気汚染はほぼあらゆる場所で依然として問題となっており、地球温暖化、生物多様性の喪失、土壌劣化、淡水...

百度のCTO王海鋒が百度ブレイン7.0をリリース: イノベーションを統合し障壁を下げる

火星の環境について知りたいですか?たった一文であなた自身のデジタル人物を生成したいですか?こうした最...

自動化とロボットの違いと適用可能なシナリオ

[[421134]]ロボット工学と自動化には違いがありますか? 自動化が適用されるかどうかわからない...

2020年、アルゴリズムの話題が主流になる年

[[397576]]システムに閉じ込められた配達員から人々が飽きることのないソーシャルメディアまで、...

機械学習翻訳の限界を説明する

機械学習による翻訳は人間のコミュニケーションに非常に有益ですが、限界もあります。機械学習は、企業に文...

テンセントクラウドがAIペイント製品をリリース、25以上の生成スタイルをサポート

9月10日、テンセントクラウドは9月7日に開催された2023テンセントグローバルデジタルエコシステム...

NatureがAIGC禁止令を発令!ビジュアルコンテンツにAIを使用した投稿は受け付けられません

最も権威のある科学雑誌の一つであるネイチャー誌は最近、明確な声明を発表しました。 生成型人工知能 (...

...