工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Equipment >> 産業用ロボット

Pythonで多層パーセプトロンニューラルネットワークを作成する方法

この記事では、ニューラルネットワークのトレーニングと高度な分類の実行を可能にするPythonプログラムを段階的に説明します。

これは、AACのニューラルネットワーク開発シリーズの12番目のエントリです。シリーズが他に提供するものを以下で確認してください:

  1. ニューラルネットワークを使用して分類を実行する方法:パーセプトロンとは何ですか?
  2. 単純なパーセプトロンニューラルネットワークの例を使用してデータを分類する方法
  3. 基本的なパーセプトロンニューラルネットワークをトレーニングする方法
  4. 単純なニューラルネットワークトレーニングを理解する
  5. ニューラルネットワークのトレーニング理論の概要
  6. ニューラルネットワークの学習率を理解する
  7. 多層パーセプトロンを使用した高度な機械学習
  8. シグモイド活性化関数:多層パーセプトロンニューラルネットワークでの活性化
  9. 多層パーセプトロンニューラルネットワークをトレーニングする方法
  10. 多層パーセプトロンのトレーニング式とバックプロパゲーションを理解する
  11. Python実装のためのニューラルネットワークアーキテクチャ
  12. Pythonで多層パーセプトロンニューラルネットワークを作成する方法
  13. ニューラルネットワークを使用した信号処理:ニューラルネットワーク設計での検証
  14. ニューラルネットワークのデータセットのトレーニング:Pythonニューラルネットワークをトレーニングおよび検証する方法

この記事では、パーセプトロンニューラルネットワークで行った作業を取り上げ、使い慣れた言語であるPythonで実装する方法を学びます。

ニューラルネットワーク用のわかりやすいPythonコードの開発

最近、ニューラルネットワークのオンラインリソースをかなり調べました。間違いなく多くの優れた情報がありますが、見つけたソフトウェアの実装には満足できませんでした。それらは常に複雑すぎるか、密度が高すぎるか、または十分に直感的ではありませんでした。 Pythonニューラルネットワークを書いているとき、システムがどのように機能し、ニューラルネットワーク理論がプログラム命令にどのように変換されるかを人々が学ぶのに役立つ何かを作りたかったのです。

ただし、コードの明確さとコードの効率の間には反比例の関係がある場合があります。この記事で説明するプログラムは、間違いなく ではありません。 高速パフォーマンス用に最適化されています。最適化はニューラルネットワークの領域内で深刻な問題です。実際のアプリケーションでは膨大な量のトレーニングが必要になる場合があり、その結果、徹底的な最適化によって処理時間が大幅に短縮される可能性があります。ただし、これから行うような単純な実験の場合、トレーニングはそれほど長くはかからず、速度よりも単純さと理解を優先するコーディング手法について強調する理由はありません。

この記事の最後にPythonプログラム全体がイメージとして含まれており、ファイル(“ MLP_v1.py”)がダウンロードとして提供されています。コードはトレーニングと検証の両方を実行します。この記事はトレーニングに焦点を当てており、検証については後で説明します。ただし、いずれの場合も、検証部分には、トレーニング部分でカバーされていない機能はあまりありません。

コードについて熟考しているときに、パート10で提供した、やや圧倒的ですが非常に有益なアーキテクチャと用語の図を振り返ることができます。


関数と変数の準備

NumPyライブラリはネットワークの計算に広く使用されており、PandasライブラリはExcelファイルからトレーニングデータをインポートする便利な方法を提供してくれます。

ご存知のとおり、アクティベーションにはロジスティックシグモイド関数を使用しています。アクティベーション後の値を計算するにはロジスティック関数自体が必要であり、バックプロパゲーションにはロジスティック関数の導関数が必要です。

次に、学習率、入力レイヤーの次元、非表示レイヤーの次元、およびエポックカウントを選択します。複数のエポックにわたるトレーニングは、トレーニングデータからより多くの学習を抽出できるため、実際のニューラルネットワークにとって重要です。 Excelでトレーニングデータを生成する場合、より多くのトレーニングサンプルを簡単に作成できるため、複数のエポックを実行する必要はありません。

np.random.uniform() 関数は、2つの重み行列を–1から+1の間のランダムな値で埋めます。 (出力ノードが1つしかないため、非表示から出力への行列は実際には単なる配列であることに注意してください。) np.random.seed(1) ステートメントを使用すると、プログラムを実行するたびにランダムな値が同じになります。初期の重み値は、トレーニングされたネットワークの最終的なパフォーマンスに大きな影響を与える可能性があるため、他の方法を評価しようとしている場合は 変数によってパフォーマンスが向上または低下する場合は、この命令のコメントを解除して、ランダムな重みの初期化の影響を排除できます。

最後に、非表示レイヤーのアクティブ化前とアクティブ化後の値に空の配列を作成します。

トレーニングデータのインポート

これは、パート4で使用した手順と同じです。Excelからトレーニングデータをインポートし、「出力」列でターゲット値を分離し、「出力」列を削除して、トレーニングデータをNumPyマトリックスに変換し、保存します。 training_count のトレーニングサンプルの数 変数。

フィードフォワード処理

出力値を生成し、データが典型的なニューラルネットワーク図で左から右に移動する計算は、システムの操作の「フィードフォワード」部分を構成します。フィードフォワードコードは次のとおりです。


最初のforループでは、複数のエポックを持つことができます。各エポック内で、各サンプルの出力値(つまり、出力ノードのアクティブ化後の信号)を計算し、そのサンプルごとの操作は2番目のforループによってキャプチャされます。 3番目のforループでは、各隠れノードに個別に対応し、ドット積を使用して事前アクティブ化信号を生成し、アクティブ化関数を使用して事後アクティブ化信号を生成します。

その後、出力ノードのアクティブ化前の信号を計算する準備が整いました(ここでもドット積を使用)。アクティブ化関数を適用して、アクティブ化後の信号を生成します。次に、出力ノードのアクティブ化後の信号からターゲットを差し引いて、最終的なエラーを計算します。

バックプロパゲーション

フィードフォワード計算を実行したら、方向を逆にします。プログラムのバックプロパゲーション部分では、出力ノードから非表示から出力への重み、次に入力から非表示への重みに移動し、ネットワークを効果的にトレーニングするために使用するエラー情報を取得します。

>

ここには2つのforループの層があります。1つは非表示から出力への重み用で、もう1つは入力から非表示への重み用です。最初にS ERROR を生成します 、両方の勾配を計算するために必要です HtoO とgradient ItoH 、次に、勾配に学習率を掛けたものを差し引くことにより、重みを更新します。

入力から非表示への重みがでどのように更新されるかに注目してください。 非表示から出力へのループ。隠れノードの1つに戻るエラー信号から始めて、そのエラー信号をこの1つの隠れノードに接続されているすべての入力ノードに拡張します。


その1つの隠れノードに関連付けられているすべての重み(ItoHとHtoOの両方)が更新されたら、ループバックして次の隠れノードからやり直します。

また、ItoHの重みはHtoOの重みの前に変更されることに注意してください。勾配 ItoH を計算するときは、現在のHtoOの重みを使用します 、したがって、この計算が実行される前にHtoOの重みを変更したくありません。

結論

この比較的短いPythonプログラムにどれだけの理論が取り入れられているかを考えるのは興味深いことです。このコードが、ソフトウェアで多層パーセプトロンニューラルネットワークを実装する方法を本当に理解するのに役立つことを願っています。

私の完全なコードは以下にあります:

コードをダウンロード


産業用ロボット

  1. AWSを使用してCloudFormationテンプレートを作成する方法
  2. 卓越したクラウドセンターを作成するにはどうすればよいですか?
  3. 摩擦のないUXを作成する方法
  4. VHDL で文字列のリストを作成する方法
  5. セルフチェック テストベンチの作成方法
  6. VHDL でタイマーを作成する方法
  7. VHDL でクロック プロセスを作成する方法
  8. ニューラルネットワークトレーニングにおける極小値の理解
  9. ニューラルネットワークへのバイアスノードの組み込み
  10. Java でオブジェクトの配列を作成する方法
  11. Python-ネットワークプログラミング