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

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

ブログ    
ブログ    
ブログ    

推薦する

IntelがBigDLディープラーニングフレームワークをリリース、CPUを使ってGPUを攻撃する予定

[51CTO.com クイック翻訳] 先週、Intel は分散型ディープラーニング用のオープンソース...

機械学習で避けるべき3つの落とし穴

[[274438]]機械学習の分野は数十年にわたって「タンク問題」に悩まされてきました。この話は 1...

ビッグデータと人工知能が戦略的な新興分野となる

最近、教育部は「教育部の高等大学教育の建設を加速し、人材育成能力を全面的に向上させることに関する意見...

72歳の男性がコーラを飲みながら脳で麻雀をする:これはすべて脳コンピューターインターフェース技術のおかげです

浙江省メディアの報道によると、現在浙江大学医学部第二付属病院で治療を受けている72歳の張さんは、意識...

Xunlei 創設者 Cheng Hao: 人工知能起業における 6 つの核心課題

[[205875]]まず第一に、今日ビジネスを始めようと決めたなら、インターネットよりも人工知能に重...

...

...

人工知能の博士による記事では、分類と回帰評価指標について詳しく説明しています。機械学習の必読書です。

この記事では、機械学習における回帰と分類のさまざまな指標について説明します。私たちは常に、優れた機械...

今後5~10年で、人工知能+ブロックチェーンは第三者による支払いを終わらせるだろう

インターネットの出現により、伝統的な取引方法は一変しました。第三者保証の取引プラットフォームとして、...

笑顔は73年にわたる:ディープフェイクがイスラエル建国戦争の古い写真を「復活」させる

[[434314]]ディープフェイクを使って古い写真をアニメ化し、殉教者を追悼するのは良いことだが、...

...

2024年には、AI PCが目を見張るほど登場するでしょう。企業や消費者はどのように選択すべきでしょうか?

先日開催されたCES 2024カンファレンスでは、AI PC(人工知能コンピュータ)のコンセプトや製...

...

IBM、GPUに匹敵する新しいニューラルネットワークチップを開発

本日 Nature 誌に掲載された論文で、IBM Research のポスドク研究員 Stefano...