Pythonでグラフを描いてニューラルネットワークを理解する

Pythonでグラフを描いてニューラルネットワークを理解する

Python 中国語コミュニティ (ID: python-china)

人工ニューラル ネットワーク (ANN) は、人間の監視を必要とする多くの日常的なタスクにうまく適用されてきましたが、その複雑さのために、その仕組みやトレーニング方法を理解することは困難です。

このブログでは、ニューラル ネットワークとは何か、どのように機能するか、外れ値の検出や金融時系列の予測などの問題にどのように適用するかについて詳しく説明しました。

この記事では、シンプルなフィードフォワード ニューラル ネットワークがトレーニング中に一連の入力をさまざまな空間にマッピングして、より簡単に理解できるようにする方法を視覚的に示します。

データ

仕組みを示すために、まず「おもちゃ」のデータセットを作成しました。 2 つのクラス (0 と 1) に均一に分散された 400 個のサンプルが含まれ、各サンプルには 2 つの次元 (X0 と X1) があります。

注: すべてのデータは、平均 [-1, 0, 1]、標準偏差 [0.5, 0.5, 0.5] の 3 つのランダム正規分布から取得されています。

ネットワークアーキテクチャ

次のステップは、ANN の構造を次のように定義することです。

隠し層は最小の次元 (2 ニューロン) を持ち、ネットワークが各サンプルの位置を 2D 散布図にマッピングしていることを示します。

前の図には示されていませんが、各レイヤーには出力を変更するアクティベーション関数があります。

•入力層には、入力値を複製するための線形活性化関数があります。

• 隠れ層には ReLU または tanh 活性化関数があります。

•出力層には、入力値を[0, 1]の範囲に「縮小」するシグモイド活性化関数があります。

電車

ネットワークのアーキテクチャに加えて、ニューラル ネットワークのもう 1 つの重要な側面はトレーニング プロセスです。 ANN をトレーニングする方法は多数ありますが、最も一般的なのはバックプロパゲーション プロセスです。

バックプロパゲーション プロセスでは、まずすべてのトレーニング例 (またはバッチ) がネットワークに送られ、次にオプティマイザーが損失関数に基づいてネットワークの重みを更新する方法を計算し、学習率に基づいて重みを更新します。

損失が収束するか、一定数のエポックが経過するか、ユーザーがトレーニングを停止すると、トレーニング プロセスは停止します。エポックとは、すべてのデータがネットワークに送信され、順方向計算 + 逆伝播プロセスが完了することを意味します。

私たちのケーススタディでは、隠れ層の 2 つの異なる活性化関数 (ReLU と Tanh) と 3 つの異なる学習率 (0.1、0.01、0.001) を使用してアーキテクチャをトレーニングしました。

入力サンプルの周囲には、その場所のサンプルに対してモデルによって提供される予測確率を示す点の「グリッド」があります。これにより、モデルはトレーニング中により明確な境界を生成できるようになります。

  1. # 進化を抱くフィギュア 
  2. f,= plt .subplots(1, 3, figsize =(18, 6), gridspec_kw ={'height_ratios':[.9]})  
  3. f.subplots_adjust(= 0 .82)  
  4. # 進化を記録するカメラ 
  5. カメラ=カメラ(f)  
  6. # エポック数 
  7. エポック= 20    
  8. # エポックタイムを繰り返す 
  9. i が範囲(エポック)内である場合:  
  10. # モデルを評価する (acc, loss)  
  11. 評価=モデル.evaluate(x_train, y_train, verbose = 0 )  
  12. # 中間モデルを生成する 
  13. model_hid_1 =モデル(model.input、model.get_layer("hidden_​​1").output)  
  14. model_act_1 =モデル(model.input、model.get_layer("activation_1").output)
  15.   # データを生成する 
  16. df_hid_1 = pd .DataFrame(model_hid_1.predict(x_train)、=['X0'、'X1'])  
  17. df_hid_1['y'] = y_train  
  18. df_act_1 = pd .DataFrame(model_act_1.predict(x_train)、=['X0'、'X1'])  
  19. df_act_1['y'] = y_train  
  20. # メッシュグリッドを生成(200 個の値)  
  21. x = np .linspace(x_train[:,0].min(), x_train[:,0].max(), 200)  
  22. y = np .linspace(x_train[:,1].min(), x_train[:,1].max(), 200)  
  23. xv, yv = np.meshgrid (x, y)  
  24. # メッシュグリッドの強度を生成する 
  25. df_mg_train = pd .DataFrame(np.stack((xv.flatten(), yv.flatten()), axis = 1 ), columns = ['X0', 'X1'])  
  26. df_mg_train['y'] = model.predict(df_mg_train.values)  
  27. df_mg_hid_1 = pd .DataFrame(model_hid_1.predict(df_mg_train.values[:,:-1]),=['X0', 'X1'])  
  28. df_mg_hid_1['y'] = model.predict(df_mg_train.values[:,:-1])  
  29. df_mg_act_1 = pd .DataFrame(model_act_1.predict(df_mg_train.values[:,:-1]),=['X0', 'X1'])  
  30. df_mg_act_1['y'] = model.predict(df_mg_train.values[:,:-1])  
  31. # データセットを表示
  32.   ax = sns .scatterplot( x = 'X0' y = 'X1' data = df_mg_train hue = 'y' x_jitter = True y_jitter = True legend = None ax = axes [0]、 palet = sns .diverging_palette(220, 20, as_cmap = True )、 alpha = 0 .15)
  33.   ax = sns .scatterplot( x = 'X0' y = 'X1' data = df_train hue = 'y' legend = None ax = axes [0]、 palet = sns .diverging_palette(220, 20, n = 2 ))
  34.   ax.set_title('入力レイヤー')  
  35. ax = sns .scatterplot( x = 'X0' y = 'X1' data = df_mg_hid_1 hue = 'y' x_jitter = True y_jitter = True legend = None ax = axes [1]、 palet = sns .diverging_palette(220, 20, as_cmap = True )、 alpha = 0 .15)
  36. ax = sns .scatterplot( x = 'X0' y = 'X1' data = df_hid_1 hue = 'y' legend = None ax = axes [1]、 palet = sns .diverging_palette(220, 20, n = 2 ))
  37. ax.set_title('非表示レイヤー')  
  38. # 現在のエポックとメトリックを表示します 
  39. ax.text( x = 0.5 y = 1.15 s = 'Epoch {}'. format(i+1)、 fontsize = 16 weight = 'bold' ha = 'center' va = 'bottom' transform = ax.transAxes )  
  40. ax.text( x = 0.5 y = 1.08 s = '精度 {:.3f} - 損失 {:.3f}'。 format(evaluation[1]、evaluation[0])、 fontsize = 13 ha = 'center' va = 'bottom' transform = ax.transAxes )  
  41. ax = sns .scatterplot( x = 'X0' y = 'X1' data = df_mg_act_1 hue = 'y' x_jitter = True y_jitter = True legend = None ax = axes [2]、 palet = sns .diverging_palette(220, 20, as_cmap = True )、 alpha = 0 .15)
  42.   ax = sns .scatterplot( x = 'X0' y = 'X1' data = df_act_1 hue = 'y' legend = None ax = axes [2]、 palet = sns .diverging_palette(220, 20, n = 2 ))
  43. ax.set_title('アクティベーション')  
  44. # プロットを表示 
  45. plt.show()  
  46. # GIFを生成するための呼び出し 
  47. カメラ.スナップ()  
  48. # 損失< = 0.263 の場合は実行を停止します (必要ない場合は 200 回のループを回避します)  
  49. 評価[0] < = 0.263の場合:  
  50. 壊す 
  51. # モデルを1エポックトレーニングする 
  52. model.fit(x_train, y_train,エポック= 1 詳細= 0 )

ReLU アクティベーション

Tanh アクティベーション

注: バイナリ分類問題を扱っているため、使用される損失関数はバイナリクロスエントロピーであり、オプティマイザーは Adam と呼ばれるオリジナルの確率的勾配降下法 (SGD) の修正版です。エポックが 200 に達するか、損失が 0.263 未満になると、モデルのトレーニングは停止します。

<<:  アルゴリズム要件実装の難航の記録: 軽量な人間姿勢推定モデル開発への道

>>:  AIを活用したリアルタイムの脅威インテリジェンスでサイバー脅威に対抗する方法

ブログ    
ブログ    
ブログ    

推薦する

ディープラーニングを使用した音声分類のエンドツーエンドの例と説明

サウンド分類は、オーディオのディープラーニングで最も広く使用されている方法の 1 つです。音を分類し...

シンプルなデータ暗号化と復号化アルゴリズムの実装方法を教えます

この記事では、シンプルだが実用的な暗号化方式を実装する方法を紹介します。実際のプロジェクト開発におけ...

人工知能を活用する準備はできていますか?

[[349302]]今日、職場での学習は課題に直面しています。高度な分析、人工知能、ロボットが職場...

クアルコムとインテルはAIをデータセンターから移行したいと考えている

これまで、AI への投資のほとんどは、大規模なデータセンター内でテクノロジーを実行することに重点を置...

OpenAIに挑戦する新しいモデルが無料で利用可能に。GPT-4の40%の計算能力とパフォーマンスに近い

今週木曜日、アメリカのAIスタートアップ企業Inflection AIが次世代の大規模言語モデルIn...

...

自動運転、顔認識…人工知能の時代が到来。私たちはどう対応すべきか?

2016年以降、人工知能がニュースに登場する頻度が高まっています。実は、理工系女子の私にとって、子...

...

Google、視覚障害者が世界を見るのを助けるAIメガネを開発

海外メディアの報道によると、オランダの新興企業EnvisionはGoogle Glassと提携し、視...

マイクロソフト、生成AIシステムのリスクを特定するためのPyRITをリリース

海外メディアの報道によると、マイクロソフトは2月26日、生成AIシステムのリスクを積極的に特定するた...

この AI 商用リストをお見逃しなく: アプリケーションで問題が解決するかもしれません (最終部分)

[[220562]]編纂者:小凡文、肖怡月、江宝尚長らくお待ちいただいておりましたが、ついにAIリ...

AIがあなたが何歳で死ぬかを予測?トランスフォーマーの「占い」がネイチャーのサブジャーナルに掲載され、事故死の予測に成功

AIは本当に科学的に占いができるんですね! ?デンマーク工科大学(DTU)の研究者らは、各人の死亡の...

今後の技術開発の動向はどうなると思いますか?

モバイル アプリケーション業界は長年にわたって発展しており、当社のシステムの重要な部分となっています...

2019年の人工知能予測

[[253703]]プライバシーやデータバイアス規制などの問題から、モデルのトレーニングやセルフサー...

PyTorch Lightning モデルを本番環境にデプロイするにはどうすればいいですか?

[51CTO.com クイック翻訳] 機械学習の分野を見ると、ソフトウェアエンジニアリングの原理を...