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

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

ブログ    
ブログ    
ブログ    

推薦する

2021 年のテクノロジートレンドはどこに向かうのでしょうか? IEEEが答えを教えます

[[357471]]このほど、全人類に利益をもたらす科学技術の進歩を促進することに尽力している世界最...

将来、人工知能が自発的な感情知能を獲得することは可能でしょうか?

人工知能の発展は人類の生存を脅かすという見方は以前からあった。人類の知能の典型的な反映である囲碁で、...

ファーウェイがAI戦略とフルスタックの全シナリオAIソリューションを発表

[中国、上海、2018年10月10日] 第3回HUAWEI CONNECT 2018(ファーウェイ・...

...

サイバーセキュリティにおける人工知能の役割と6つの製品オプション

現代の IT 環境では、サイバー脅威がますます顕著になっています。サイバーセキュリティとその製品にお...

5Gの導入により、インテリジェント交通は4つの大きな質的変化をもたらします。

現在、あらゆるToB市場において、5G+AIが並行して未来を創造しています。 [[331677]] ...

マイクロソフトはAIを活用して新しい電池材料を選別し、電池のリチウムの70%をナトリウムに置き換える

1 月 10 日、マイクロソフトの量子コンピューティング チームは、米国エネルギー省傘下のパシフィッ...

AI開発に最適なプログラミング言語トップ5

昨年、アルファ碁が世界中のチェスプレイヤー全員に勝利して以来、人工知能は注目を集めています。先日終了...

Pythonを全く知らなかった私がAIエンジニアになるまでに2年かかりました

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

一貫性ハッシュアルゴリズムの図

[[380706]]この記事はWeChatパブリックアカウント「Full-Stack Cultiva...

もはや魅力的ではない Google は次の IBM になるのでしょうか?深刻な高齢化、イノベーションへのサポートの喪失、従業員の信頼の喪失、人材流出

ジェミニが世論に大騒ぎを引き起こした後、ピチャイ氏の辞任を求める声があらゆるところで聞かれた。過去 ...

非常に便利な無料データマイニングツール 19 個のコレクション!

今日の世界では、データはお金を意味します。アプリベースの世界への移行に伴い、データは飛躍的に増加して...

必ず読むべき28の古典的なプログラミングアルゴリズム

最初の 10 個は、聖書からのトップ 10 アルゴリズムです。発起者からの説明: Proofs fr...

3つ目!マイクロソフト、米警察への顔認識技術の提供を拒否

近年、人工知能の台頭の勢いに乗って生体認証技術が急速に発展し、顔認識に代表される一連のサブセクターが...

A*アルゴリズムのC#実装に関する簡単な説明

もちろん、主な参照アルゴリズム ドキュメントは「http://www.vckbase.com/doc...