Python-deep-learning-quick-guide

提供:Dev Guides
移動先:案内検索

Pythonディープラーニング-はじめに

ディープストラクチャードラーニング、階層的ラーニング、またはディープラーニングは、それ自体が人工知能の幅広い分野のサブセットである機械学習方法のファミリーの一部です。

ディープラーニングは、特徴抽出と変換に非線形処理ユニットの複数の層を使用する機械学習アルゴリズムのクラスです。 連続する各レイヤーは、前のレイヤーの出力を入力として使用します。

ディープニューラルネットワーク、ディープビリーフネットワーク、リカレントニューラルネットワークは、コンピュータービジョン、音声認識、自然言語処理、音声認識、ソーシャルネットワークフィルター処理、機械翻訳、バイオインフォマティクスなどの分野に適用されており、場合によっては同等の結果が得られました人間の専門家よりも優れています。

深層学習アルゴリズムとネットワーク-

  • 複数レベルの特徴またはデータの表現の教師なし学習に基づいています。 上位レベルの機能は、下位レベルの機能から派生して、階層表現を形成します。
  • 何らかの方法で勾配降下法を使用してトレーニングします。

Pythonディープラーニング-環境

この章では、Pythonディープラーニング用に設定された環境について学習します。 ディープラーニングアルゴリズムを作成するには、次のソフトウェアをインストールする必要があります。

  • Python 2.7以降
  • NumpyのScipy
  • Matplotlib
  • テアノ
  • ケラス
  • TensorFlow

Python、NumPy、SciPy、およびMatplotlibは、Anacondaディストリビューションを通じてインストールすることを強くお勧めします。 これらのパッケージはすべて付属しています。

さまざまな種類のソフトウェアが適切にインストールされていることを確認する必要があります。

私たちのコマンドラインプログラムに行き、次のコマンドを入力しましょう-

$ python
Python 3.6.3 |Anaconda custom (32-bit)| (default, Oct 13 2017, 14:21:34)
[GCC 7.2.0] on linux

次に、必要なライブラリをインポートし、そのバージョンを印刷できます-

import numpy
print numpy.__version__

出力

1.14.2

Theano、TensorFlowおよびKerasのインストール

Theano、TensorFlow、およびKerasのパッケージのインストールを開始する前に、 pip がインストールされているかどうかを確認する必要があります。 Anacondaのパッケージ管理システムはpipと呼ばれます。

pipのインストールを確認するには、コマンドラインで次を入力します-

$ pip

pipのインストールが確認されたら、次のコマンドを実行してTensorFlowとKerasをインストールできます-

$pip install theano
$pip install tensorflow
$pip install keras

次のコード行を実行して、Theanoのインストールを確認します-

$python –c “import theano: print (theano.__version__)”

出力

1.0.1

次のコード行を実行してTensorflowのインストールを確認します-

$python –c “import tensorflow: print tensorflow.__version__”

出力

1.7.0

次のコード行を実行して、Kerasのインストールを確認します-

$python –c “import keras: print keras.__version__”
Using TensorFlow backend

出力

2.1.5

Python Deep Basic Machine Learning

人工知能(AI)は、コンピューターが人間の認知行動または知能を模倣できるようにするコード、アルゴリズム、または手法です。 機械学習(ML)はAIのサブセットであり、統計的手法を使用して、機械を学習し、経験とともに向上させることができます。 ディープラーニングは、機械学習のサブセットであり、多層ニューラルネットワークの計算を実行可能にします。 機械学習は浅い学習と見なされ、深層学習は抽象化された階層的学習と見なされます。

機械学習は、幅広い概念を扱います。 概念は以下のとおりです-

  • 監督
  • 監督されない
  • 強化学習
  • 線形回帰
  • コスト関数
  • 過剰適合
  • アンダーフィッティング
  • ハイパーパラメーターなど

教師あり学習では、ラベル付きデータから値を予測することを学びます。 ここで役立つMLテクニックの1つは分類であり、ターゲット値は離散値です。たとえば、猫と犬。 助けになる機械学習のもう1つの手法は、回帰です。 回帰は、ターゲット値に対して機能します。 目標値は連続値です。たとえば、株式市場データは回帰を使用して分析できます。

教師なし学習では、ラベル付けも構造化もされていない入力データから推論を行います。 100万件の医療記録があり、その意味を理解し、基礎となる構造、異常値を見つけ、異常を検出する必要がある場合、クラスタリング手法を使用してデータを広範なクラスターに分割します。

データセットは、トレーニングセット、テストセット、検証セットなどに分けられます。

2012年のブレークスルーにより、ディープラーニングの概念が顕著になりました。 アルゴリズムは、2つのGPUとビッグデータのような最新のテクノロジーを使用して、100万の画像を1000のカテゴリに分類しました。

ディープラーニングと従来の機械学習の関連付け

従来の機械学習モデルで遭遇する主な課題の1つは、特徴抽出と呼ばれるプロセスです。 プログラマーは具体的であり、コンピューターに注目すべき機能を伝える必要があります。 これらの機能は、意思決定に役立ちます。

生データをアルゴリズムに入力することはめったに機能しないため、特徴抽出は従来の機械学習ワークフローの重要な部分です。

これはプログラマーに大きな責任を負わせ、アルゴリズムの効率はプログラマーの独創性に大きく依存します。 オブジェクト認識や手書き認識などの複雑な問題の場合、これは大きな問題です。

表現の複数の層を学習する機能を備えたディープラーニングは、自動特徴抽出に役立つ数少ない方法の1つです。 下層は自動特徴抽出を実行していると見なすことができ、プログラマーからのガイダンスはほとんど必要ありません。

人工ニューラルネットワーク

人工ニューラルネットワーク、または単にニューラルネットワークは、新しいアイデアではありません。 約80年前からあります。

Deep Neural Networksが新しい手法、膨大なデータセットの可用性、強力なコンピューターの使用で人気を博したのは2011年まででした。

ニューラルネットワークは、樹状突起、核、軸索、および末端軸索を持つニューロンを模倣します。

端末軸索

ネットワークには、2つのニューロンが必要です。 これらのニューロンは、1つの樹状突起と別の樹状突起の軸索との間のシナプスを介して情報を転送します。

ニューロン転送情報

人工ニューロンの推定モデルはこのように見えます-

推定モデル

ニューラルネットワークは次のようになります-

ニューラルネットワーク

円はニューロンまたはノードであり、それらの機能はデータにあり、それらを接続する線/エッジは重み/情報が渡されます。

各列はレイヤーです。 データの最初のレイヤーは入力レイヤーです。 次に、入力レイヤーと出力レイヤーの間のすべてのレイヤーが非表示レイヤーになります。

1つまたはいくつかの隠れ層がある場合、浅いニューラルネットワークがあります。 多くの隠れ層がある場合、ディープニューラルネットワークがあります。

このモデルでは、入力データがあり、それを重み付けして、しきい値関数または活性化関数と呼ばれるニューロン内の関数に渡します。

基本的に、特定の値と比較した後のすべての値の合計です。 シグナルを発する場合、結果は(1)であるか、何も発しないで、(0)です。 次に、それが重み付けされて次のニューロンに渡され、同じ種類の関数が実行されます。

アクティベーション関数としてシグモイド(s形状)関数を使用できます。

重みについては、開始するのはランダムであり、ノード/ニューロンへの入力ごとに一意です。

最も基本的なタイプのニューラルネットワークである典型的な「フィードフォワード」では、作成したネットワークを直接情報が通過し、出力をサンプルデータを使用して期待したものと比較します。

ここから、出力を目的の出力に一致させるために重みを調整する必要があります。

ニューラルネットワークを介して直接データを送信する行為は、「フィードフォワードニューラルネットワーク」と呼ばれます。

データは、入力からレイヤー、順番に出力されます。

後方に移動して、損失/コストを最小限に抑えるために重みの調整を開始する場合、これは*逆伝播*と呼ばれます

これは*最適化の問題*です。実際には、ニューラルネットワークでは、数十万、または数百万以上の変数を処理する必要があります。

最初の解決策は、確率的勾配降下法を最適化方法として使用することでした。 現在、AdaGrad、Adam Optimizerなどのオプションがあります。 いずれにせよ、これは大規模な計算操作です。 それが、ニューラルネットワークがほぼ半世紀以上棚に放置されていた理由です。 ごく最近になって、これらの操作の実行を検討するためのマシンの能力とアーキテクチャ、および一致する適切なサイズのデータ​​セットさえ用意されました。

単純な分類タスクの場合、ニューラルネットワークのパフォーマンスは、K最近傍のような他の単純なアルゴリズムに比較的近いです。 ニューラルネットワークの真の有用性は、他の機械学習モデルよりもはるかに大きなデータとはるかに複雑な質問がある場合に実現されます。

ディープニューラルネットワーク

ディープニューラルネットワーク(DNN)は、入力層と出力層の間に複数の隠れ層を持つANNです。 浅いANNと同様に、DNNは複雑な非線形関係をモデル化できます。

ニューラルネットワークの主な目的は、入力のセットを受け取り、それらに対して徐々に複雑な計算を実行し、出力を提供して分類などの現実の問題を解決することです。 ニューラルネットワークのフィードフォワードを制限します。

ディープネットワークには、入力、出力、およびシーケンシャルデータのフローがあります。

ディープネットワーク

ニューラルネットワークは、教師あり学習および強化学習の問題で広く使用されています。 これらのネットワークは、相互に接続された一連のレイヤーに基づいています。

深層学習では、ほとんどが非線形である隠れ層の数が多くなる可能性があります。約1000層と言います。

DLモデルは、通常のMLネットワークよりもはるかに優れた結果をもたらします。

ネットワークの最適化と損失関数の最小化には、主に勾配降下法を使用します。

数百万のデジタル画像のリポジトリである Imagenet を使用して、データセットを猫や犬などのカテゴリに分類できます。 DLネットは、静的なイメージから離れた動的なイメージ、および時系列およびテキスト分析にますます使用されています。

データセットのトレーニングは、ディープラーニングモデルの重要な部分を形成します。 さらに、バックプロパゲーションは、DLモデルのトレーニングにおける主要なアルゴリズムです。

DLは、複雑な入出力変換を伴う大規模なニューラルネットワークのトレーニングを扱います。

DLの1つの例は、ソーシャルネットワークで行うように、写真を写真に写っている人物の名前にマッピングすることです。また、写真をフレーズで記述することも、DLの最近のアプリケーションです。

DLマッピング

ニューラルネットワークは、x1、x2、x3…のような入力を持つ関数で、z1、z2、z3などの出力に2つ(浅いネットワーク)またはレイヤーとも呼ばれるいくつかの中間操作(深いネットワーク)に変換されます。

重みとバイアスはレイヤーごとに変化します。 「w」と「v」は、ニューラルネットワークのレイヤーの重みまたはシナプスです。

ディープラーニングの最適なユースケースは、教師あり学習の問題です。ここでは、目的の出力セットを持つ大量のデータ入力セットがあります。

バックプロパゲーションアルゴリズム

ここでは、正しい出力予測を得るために逆伝播アルゴリズムを適用します。

ディープラーニングの最も基本的なデータセットは、手書き数字のデータセットであるMNISTです。

このデータセットから手書き数字の画像を分類するために、Kerasで畳み込みニューラルネットワークを深くトレーニングできます。

ニューラルネット分類子の起動またはアクティブ化により、スコアが生成されます。 たとえば、患者を病気で健康なものとして分類するために、身長、体重、体温、血圧などのパラメーターを考慮します。

高得点は患者が病気であることを意味し、低得点は患者が健康であることを意味します。

出力層と非表示層の各ノードには、独自の分類子があります。 入力層は入力を受け取り、そのスコアを次の非表示層に渡し、さらにアクティブ化します。これは出力に達するまで続きます。

入力から出力へのこの進行を左から右へ順方向に進行することを*前方伝播*と呼びます。

ニューラルネットワークのクレジット割り当てパス(CAP)は、入力から出力への一連の変換です。 CAPは、入力と出力の間の考えられる因果関係を詳しく説明します。

与えられたフィードフォワードニューラルネットワークのCAPの深さ、またはCAPの深さは、出力層が含まれているため、隠れ層の数に1を加えたものです。 信号が層を数回伝播する可能性のあるリカレントニューラルネットワークの場合、CAPの深さは無限に広がる可能性があります。

ディープネットとシャローネット

浅い学習と深い学習を分ける明確な深さのしきい値はありません。ただし、複数の非線形層を持つディープラーニングでは、CAPを2より大きくする必要があるという点でほぼ一致しています。

ニューラルネットの基本ノードは、生物学的ニューラルネットワークのニューロンを模倣した知覚です。 次に、多層の知覚またはMLPがあります。 入力の各セットは、重みとバイアスのセットによって変更されます。各エッジには一意の重みがあり、各ノードには一意のバイアスがあります。

ニューラルネットの予測精度は、その重みとバイアスに依存します。

ニューラルネットワークの精度を向上させるプロセスは「トレーニング」と呼ばれます。フォワードプロップネットからの出力は、正しいことがわかっている値と比較されます。

  • コスト関数または損失関数*は、生成された出力と実際の出力の差です。

トレーニングのポイントは、数百万のトレーニング例にわたってトレーニングのコストを可能な限り小さくすることです。これを行うために、ネットワークは、予測が正しい出力に一致するまで重みとバイアスを調整します。

よく訓練されると、ニューラルネットは毎回正確な予測を行う可能性があります。

パターンが複雑になり、コンピューターに認識させるには、ニューラルネットワークを使用する必要があります。このような複雑なパターンのシナリオでは、ニューラルネットワークは他のすべての競合アルゴリズムよりも優れています。

現在、GPUを使用して、これまで以上に高速にトレーニングできます。 ディープニューラルネットワークはすでにAIの分野に革命をもたらしています

コンピューターは繰り返し計算を実行し、詳細な指示に従うことは得意であることが証明されていますが、複雑なパターンを認識することはそれほど得意ではありません。

単純なパターンの認識に問題がある場合は、サポートベクターマシン(svm)またはロジスティック回帰分類器がうまく機能しますが、パターンの複雑さが増すにつれて、ディープニューラルネットワークに進むしかありません。

したがって、人間の顔のような複雑なパターンの場合、浅いニューラルネットワークは失敗し、より多くの層を持つ深いニューラルネットワークを使用する以外に選択肢がありません。 ディープネットは、複雑なパターンをより単純なパターンに分解することで、仕事をすることができます。 たとえば、人間の顔。 adeep netは、エッジを使用して唇、鼻、目、耳などの部分を検出し、これらを再結合して人間の顔を形成します

正しい予測の精度は非常に正確になったため、最近のGoogleパターン認識チャレンジでは、ディープネットが人間を打ち負かしました。

層状パーセプトロンのウェブというこの考えは、しばらく前から存在しています。この領域では、ディープネットは人間の脳を模倣しています。 しかし、これの欠点の1つは、トレーニングに時間がかかることです。これはハードウェアの制約です

しかし、最近の高性能GPUは、このようなディープネットを1週間未満でトレーニングできました。一方、高速CPUは同じことをするのに数週間またはおそらく数ヶ月かかる可能性があります。

ディープネットの選択

ディープネットの選び方 分類器を構築するのか、データのパターンを見つけようとするのか、および教師なし学習を使用するのかを決定する必要があります。 ラベルのないデータのセットからパターンを抽出するには、制限付きボルツマンマシンまたは自動エンコーダーを使用します。

ディープネットを選択しながら、次の点を考慮してください-

  • テキスト処理、センチメント分析、解析、および名前エンティティの認識には、リカレントネットまたは再帰ニューラルテンソルネットワークまたはRNTNを使用します。
  • 文字レベルで動作する言語モデルでは、リカレントネットを使用します。
  • 画像認識には、深い信念ネットワークDBNまたは畳み込みネットワークを使用します。
  • オブジェクトの認識には、RNTNまたは畳み込みネットワークを使用します。
  • 音声認識には、リカレントネットを使用します。

一般に、深い信念ネットワークと整流線形ユニットまたはRELUを備えた多層パーセプトロンはどちらも分類に適しています。

時系列分析では、リカレントネットを使用することを常にお勧めします。

ニューラルネットは50年以上前から使用されています。しかし、今や彼らは目立つようになった。 その理由は、トレーニングが難しいからです。バックプロパゲーションと呼ばれる方法でそれらをトレーニングしようとすると、勾配の消失または爆発と呼ばれる問題が発生します。それが発生すると、トレーニングに時間がかかり、精度に後部座席がかかります。 データセットをトレーニングするとき、ラベル付きトレーニングデータのセットからの予測出力と実際の出力の差であるコスト関数を絶えず計算しています。次に、最小値まで重みとバイアス値を調整することにより、コスト関数を最小化します。取得されます。 トレーニングプロセスは勾配を使用します。勾配とは、重みまたはバイアス値の変化に対してコストが変化する割合です。

制限付きボルツマンネットワークまたはオートエンコーダー-RBN

2006年には、勾配の消失の問題に取り組み、ブレークスルーが達成されました。 Geoff Hintonは、 Restricted Boltzman Machine-RBM (浅い2層ネット)の開発につながる新しい戦略を考案しました。

最初のレイヤーは*可視*レイヤーで、2番目のレイヤーは*非表示*レイヤーです。 可視レイヤーの各ノードは、非表示レイヤーのすべてのノードに接続されています。 ネットワークは、同じレイヤー内の2つのレイヤーが接続の共有を許可されていないため、制限付きとして知られています。

オートエンコーダーは、入力データをベクトルとしてエンコードするネットワークです。 それらは、生データの隠された、または圧縮された表現を作成します。 ベクトルは次元の削減に役立ちます。ベクトルは、生データをより少ない数の必須次元に圧縮します。 オートエンコーダーはデコーダーとペアになっているため、非表示の表現に基づいて入力データを再構築できます。

RBMは、双方向トランスレーターと数学的に同等です。 フォワードパスは入力を受け取り、入力をエンコードする一連の数値に変換します。 一方、バックワードパスはこの数値セットを取得し、再構成された入力に変換します。 よく訓練されたネットは、高精度でバックプロップを実行します。

どちらの手順でも、重みとバイアスは重要な役割を果たします。 RBMが入力間の相互関係をデコードし、どの入力がパターンの検出に不可欠であるかを決定するのに役立ちます。 フォワードパスとバックワードパスにより、RBMは、入力と再構築ができるだけ近くなるまで、異なる重みとバイアスで入力を再構築するようにトレーニングされます。 RBMの興味深い側面は、データにラベルを付ける必要がないことです。 これは、写真、ビデオ、音声、センサーデータなどの実世界のデータセットにとって非常に重要であることがわかりました。これらはすべてラベル付けされていない傾向があります。 人間が手動でデータにラベルを付ける代わりに、RBMはデータを自動的にソートします。重みとバイアスを適切に調整することにより、RBMは重要な特徴を抽出し、入力を再構築できます。 RBMは、データの固有のパターンを認識するように設計された特徴抽出ニューラルネットのファミリの一部です。 これらは、独自の構造をエンコードする必要があるため、自動エンコーダとも呼ばれます。

RBM構造

深い信念ネットワーク-DBN

深い信念ネットワーク(DBN)は、RBMを組み合わせて巧妙なトレーニング方法を導入することで形成されます。 勾配の消失の問題を最終的に解決する新しいモデルがあります。 Geoff Hintonは、逆伝播の代替手段としてRBMとDeep Belief Netを発明しました。

DBNの構造はMLP(多層パーセプトロン)に似ていますが、トレーニングに関しては非常に異なります。 DBNが浅いカウンターパートよりも優れているのを可能にするのはトレーニングです

DBNは、1つのRBMの隠れ層がその上のRBMの可視層であるRBMのスタックとして視覚化できます。 最初のRBMは、入力を可能な限り正確に再構築するようにトレーニングされます。

最初のRBMの隠れ層は2番目のRBMの可視層と見なされ、2番目のRBMは最初のRBMからの出力を使用してトレーニングされます。 このプロセスは、ネットワーク内のすべてのレイヤーがトレーニングされるまで繰り返されます。

DBNでは、各RBMは入力全体を学習します。 DBNは、カメラレンズがゆっくりと画像に焦点を合わせているようにモデルがゆっくりと改善されるため、入力全体を連続して微調整することでグローバルに機能します。 多層パーセプトロンMLPが単一のパーセプトロンよりも優れているため、RBMのスタックは単一のRBMよりも優れています。

この段階で、RBMはデータに固有のパターンを検出しましたが、名前やラベルはありません。 DBNのトレーニングを終了するには、ラベルをパターンに導入し、教師付き学習でネットを微調整する必要があります。

機能とパターンを名前に関連付けることができるように、非常に小さなラベル付きサンプルのセットが必要です。 この小さなラベルのデータセットは、トレーニングに使用されます。 このラベル付きデータのセットは、元のデータセットと比較すると非常に小さい場合があります。

重みとバイアスはわずかに変更されるため、パターンのネットの認識にわずかな変化が生じ、多くの場合、全体の精度がわずかに向上します。

トレーニングは、浅いネットと比較して非常に正確な結果を与えるGPUを使用することにより、妥当な時間で完了することができ、勾配の消失問題に対する解決策も見られます。

生成的敵対ネットワーク-GAN

生成的敵対ネットワークは、2つのネットで構成されるディープニューラルネットであり、一方が他方に対してピットインしているため、「敵対的な」名前です。

GANは2014年にモントリオール大学の研究者が発表した論文で紹介されました。 FacebookのAI専門家Yann LeCunは、GANについて言及し、敵対者トレーニングを「MLの過去10年間で最も興味深いアイデア」と呼びました。

ネットワークスキャンはデータの分布を模倣することを学習するため、GANの可能性は非常に大きいです。 GANは、画像、音楽、スピーチ、散文など、あらゆる分野で私たちの世界と驚くほど類似した並行世界を作成するように教えることができます。 彼らはある意味でロボットアーティストであり、彼らの成果は非常に印象的です。

GANでは、ジェネレーターと呼ばれる1つのニューラルネットワークが新しいデータインスタンスを生成し、もう1つの判別器が真正性を評価します。

実世界から取得したMNISTデータセットにあるような手書きの数字を生成しようとしているとしましょう。 識別者の仕事は、真のMNISTデータセットからのインスタンスを表示するときに、それらを本物として認識することです。

次に、GANの次の手順を検討します-

  • ジェネレーターネットワークは、乱数の形式で入力を受け取り、画像を返します。
  • この生成された画像は、実際のデータセットから取得された画像のストリームとともに、識別器ネットワークへの入力として与えられます。
  • 弁別器は、実際の画像と偽の画像の両方を受け取り、0〜1の数値を返します。1は真正性の予測を表し、0は偽を表します。
  • したがって、二重のフィードバックループがあります-
  • 弁別器は、画像のグラウンドトゥルースを含むフィードバックループ内にあります。
  • ジェネレーターは、弁別器とのフィードバックループ内にあります。

リカレントニューラルネットワーク-RNN

  • RNN *データが任意の方向に流れることができるニューラルネットワークです。 これらのネットワークは、言語モデリングや自然言語処理(NLP)などのアプリケーションに使用されます。

RNNの基礎となる基本概念は、シーケンシャル情報を利用することです。 通常のニューラルネットワークでは、すべての入力と出力が互いに独立していると想定されています。 文の次の単語を予測したい場合、どの単語がその前に来たかを知る必要があります。

RNNは、シーケンスのすべての要素に対して同じタスクを繰り返し、以前の計算に基づいて出力されるため、再帰と呼ばれます。 したがって、RNNには、以前に計算されたものに関する情報を取得する「メモリ」があると言えます。 理論的には、RNNは非常に長いシーケンスで情報を使用できますが、実際には数ステップしか振り返ることができません。

リカレントニューラルネットワーク

長期短期メモリネットワーク(LSTM)は、最も一般的に使用されるRNNです。

畳み込みニューラルネットワークと一緒に、RNNはモデルの一部として使用され、ラベルのない画像の説明を生成します。 これがうまく機能しているように見えるのは非常に驚くべきことです。

畳み込みディープニューラルネットワーク-CNN

ニューラルネットワークの層の数を増やしてネットワークを深くすると、ネットワークの複雑さが増し、より複雑な関数をモデル化できるようになります。 ただし、重みとバイアスの数は指数関数的に増加します。 実際、このような難しい問題を学習することは、通常のニューラルネットワークでは不可能になる可能性があります。 これは、畳み込みニューラルネットワークというソリューションにつながります。

CNNはコンピュータービジョンで広く使用されています。自動音声認識の音響モデリングにも適用されています。

畳み込みニューラルネットワークの背後にある考え方は、画像を通過する「移動フィルタ」の考え方です。 この移動フィルタ、または畳み込みは、ノードの特定の近傍に適用されます。ノードは、たとえばピクセルである場合があり、適用されるフィルタはノード値の0.5 xです-

著名な研究者Yann LeCunは、畳み込みニューラルネットワークの先駆者です。 Facebookは顔認識ソフトウェアとしてこれらのネットを使用しています。 CNNは、マシンビジョンプロジェクトのソリューションを提供しています。 畳み込みネットワークには多くの層があります。 Imagenetチャレンジでは、2015年のマシンはオブジェクト認識で人間を打ち負かすことができました。

一言で言えば、畳み込みニューラルネットワーク(CNN)は多層ニューラルネットワークです。 レイヤーは17個以上になることがあり、入力データが画像であると想定します。

畳み込みニューラルネットワーク

CNNは、調整が必要なパラメーターの数を大幅に削減します。 そのため、CNNは生画像の高次元性を効率的に処理します。

Pythonディープラーニング-基礎

この章では、Pythonディープラーニングの基礎について説明します。

深層学習モデル/アルゴリズム

さまざまなディープラーニングモデル/アルゴリズムについて学びましょう。

ディープラーニング内の人気モデルのいくつかは次のとおりです-

  • 畳み込みニューラルネットワーク
  • リカレントニューラルネットワーク
  • 深い信念のネットワーク
  • 生成的敵対ネットワーク
  • オートエンコーダーなど

入力と出力は、ベクトルまたはテンソルとして表されます。 たとえば、ニューラルネットワークには、画像内の個々のピクセルRGB値がベクトルとして表される入力がある場合があります。

入力層と出力層の間にあるニューロンの層は、隠れ層と呼ばれます。 これは、ニューラルネットが問題を解決しようとするときにほとんどの作業が発生する場所です。 非表示のレイヤーを詳しく見ると、ネットワークがデータから抽出することを学習した機能について多くを明らかにすることができます。

次のレイヤーの他のニューロンに接続するニューロンを選択することにより、ニューラルネットワークのさまざまなアーキテクチャが形成されます。

出力を計算するための擬似コード

以下は Forward-propagating Neural Network の出力を計算するための擬似コードです-

  • #node []:=トポロジー的にソートされたノードの配列
  • #aからbへのエッジは、aがbの左側にあることを意味します
  • #ニューラルネットワークにR入力とS出力がある場合、
  • #最初のRノードは入力ノードで、最後のSノードは出力ノードです。
  • #incoming [x]:=ノードxに接続されたノード
  • #weight [x]:= xへの着信エッジの重み

各ニューロンxについて、左から右へ-

  • x ⇐ Rの場合:何もしない#入力ノード
  • 入力[x] = [incoming [x]]のiの[output [i]
  • weighted_sum = dot_product(weights [x]、inputs [x])
  • output [x] = Activation_function(weighted_sum)

ニューラルネットワークのトレーニング

ここで、ニューラルネットワークをトレーニングする方法を学習します。 また、Python Deep Learningで逆伝播アルゴリズムと後方パスを学習します。

目的の出力を得るには、ニューラルネットワークの重みの最適値を見つける必要があります。 ニューラルネットワークをトレーニングするには、反復勾配降下法を使用します。 まず、重みのランダムな初期化から始めます。 ランダムな初期化の後、前方伝播プロセスでデータの一部のサブセットを予測し、対応するコスト関数Cを計算し、dC/dwに比例する量で各重みwを更新します。つまり、コスト関数w.r.tの導関数です。 重さ。 比例定数は、学習率として知られています。

勾配は、逆伝播アルゴリズムを使用して効率的に計算できます。 後方伝播または後方プロップの重要な観察は、微分の連鎖規則のために、ニューラルネットワークの各ニューロンの勾配は、ニューロンの勾配を使用して計算でき、出力エッジがあることです。 したがって、勾配を逆方向に計算します。つまり、最初に出力レイヤーの勾配を計算し、次に最上位の非表示レイヤー、続いて前の非表示レイヤーなどを入力レイヤーで終了します。

逆伝播アルゴリズムは、主に計算グラフの概念を使用して実装されます。各ニューロンは計算グラフ内の多くのノードに展開され、加算、乗算などの単純な数学演算を実行します。 計算グラフのエッジには重みがありません。すべての重みがノードに割り当てられるため、重みは独自のノードになります。 その後、後方伝搬アルゴリズムが計算グラフで実行されます。 計算が完了すると、更新には重みノードの勾配のみが必要になります。 残りのグラデーションは破棄できます。

勾配降下最適化手法

発生したエラーに応じて重みを調整する一般的に使用される最適化関数の1つは、「勾配降下」と呼ばれます。

勾配は勾配の別の名前であり、x-yグラフの勾配は、2つの変数が互いにどのように関係しているかを表します:実行中の上昇、時間の変化に伴う距離の変化など。 この場合、勾配はネットワークのエラーと単一の重みの比率です。つまり、重量が変化するとエラーはどのように変化しますか。

より正確に言えば、どの重みが最小の誤差を生じるかを見つけたいです。 入力データに含まれる信号を正しく表し、それらを正しい分類に変換する重みを見つけたいです。

ニューラルネットワークが学習すると、信号を意味に正しくマッピングできるように、多くの重みをゆっくり調整します。 ネットワークエラーとそれらの各重みの比率は、重みのわずかな変化が誤差のわずかな変化を引き起こす程度を計算する導関数dE/dwです。

各重みは、多くの変換を伴うディープネットワークの1つの要素にすぎません。重みの信号はアクティベーションを通過し、複数のレイヤーで合計されるため、計算のチェーンルールを使用してネットワークのアクティベーションと出力を処理します。これにより、問題の重みと全体的なエラーとの関係が導き出されます。

エラーと重みの2つの変数は、重みが渡される3番目の変数 activation によって仲介されます。 重量の変化がエラーの変化にどのように影響するかを計算するには、まずアクティベーションの変化がエラーの変化にどのように影響し、重量の変化がアクティベーションの変化にどのように影響するかを計算します。

ディープラーニングの基本的な考え方は、それ以上のものではありません。エラーを減らすことができなくなるまで、モデルが生成するエラーに応じてモデルの重みを調整することです。

勾配値が小さい場合、ディープネットはゆっくりとトレインし、値が高い場合は高速でトレインします。 トレーニングに不正確があると、出力が不正確になります。 出力から入力に戻るネットをトレーニングするプロセスは、逆伝播または逆プロップと呼ばれます。 順伝播は入力から始まり、順方向に進むことを知っています。 バックプロップは、右から左への勾配を逆方向/逆方向に計算します。

勾配を計算するたびに、その時点までの以前の勾配をすべて使用します。

出力レイヤーのノードから始めましょう。 エッジはそのノードでグラデーションを使用します。 隠れ層に戻ると、より複雑になります。 0と1の間の2つの数値の積は、より小さな数値になります。 勾配値は小さくなり続け、その結果、バックプロップはトレーニングに時間がかかり、精度が低下します。

深層学習アルゴリズムの課題

浅いニューラルネットワークと深いニューラルネットワークの両方には、過適合や計算時間などの特定の課題があります。 DNNは、トレーニングデータ内のまれな依存関係をモデル化できる抽象レイヤーを追加するため、過剰適合の影響を受けます。

トレーニング中にドロップアウト、早期停止、データ増強、転送学習などの*正規化*メソッドが適用され、過剰適合に対処します。 正規化をドロップアウトすると、トレーニング中に非表示のレイヤーからユニットがランダムに除外され、まれな依存関係を回避できます。 DNNは、サイズなどのいくつかのトレーニングパラメーター、つまり、レイヤー数とレイヤーあたりのユニット数、学習率、初期重みを考慮します。 時間と計算リソースのコストが高いため、最適なパラメーターを見つけることは常に実用的ではありません。 バッチ処理などのいくつかのハックは、計算を高速化できます。 必要なマトリックスとベクトルの計算はGPUで十分に実行されるため、GPUの大きな処理能力はトレーニングプロセスを大幅に支援しました。

脱落

ドロップアウトは、ニューラルネットワークの一般的な正則化手法です。 ディープニューラルネットワークは、特に過剰適合の傾向があります。

ドロップアウトとは何か、どのように機能するかを見てみましょう。

ディープラーニングの先駆者の1人であるGeoffrey Hintonの言葉を借りると、「ディープニューラルネットがあり、それが過剰に適合していない場合、おそらくより大きなネットを使用してドロップアウトを使用する必要があります」。

ドロップアウトは、勾配降下の各反復中に、ランダムに選択されたノードのセットをドロップする手法です。 これは、いくつかのノードが存在しないかのようにランダムに無視することを意味します。

各ニューロンはqの確率で保持され、確率1-qでランダムにドロップされます。 値qは、ニューラルネットワークの各層で異なる場合があります。 非表示レイヤーの値を0.5、入力レイヤーの値を0にすると、さまざまなタスクで適切に機能します。

評価と予測の間、ドロップアウトは使用されません。 各ニューロンの出力はqで乗算されるため、次の層への入力は同じ期待値を持ちます。

ドロップアウトの背後にある考え方は次のとおりです。ドロップアウトの正則化のないニューラルネットワークでは、ニューロンは相互適合性を発達させ、過剰適合につながります。

実装のトリック

ドロップアウトは、ランダムに選択されたニューロンの出力を0のままにして、TensorFlowやPytorchなどのライブラリに実装されます。 つまり、ニューロンは存在しますが、その出力は0として上書きされます。

早期停止

勾配降下法と呼ばれる反復アルゴリズムを使用してニューラルネットワークをトレーニングします。

早期停止の背後にある考え方は直感的です。エラーが増加し始めたらトレーニングを停止します。 ここで、エラーとは、検証データで測定されたエラーを意味します。これは、ハイパーパラメーターの調整に使用されるトレーニングデータの一部です。 この場合、ハイパーパラメーターは停止基準です。

データ増強

既存のデータを使用し、そのデータにいくつかの変換を適用することで、保有するデータの量を増やすか、それを増強するプロセス。 使用される正確な変換は、達成する予定のタスクによって異なります。 さらに、ニューラルネットを支援する変換は、そのアーキテクチャに依存します。

たとえば、オブジェクト分類などの多くのコンピュータービジョンタスクでは、効果的なデータ拡張手法は、元のデータのトリミングまたは変換されたバージョンである新しいデータポイントを追加します。

コンピューターがイメージを入力として受け入れると、ピクセル値の配列を受け取ります。 画像全体が15ピクセル左にシフトしたとしましょう。 さまざまな方向にさまざまなシフトを適用し、元のデータセットの数倍のサイズのデータ​​セットを拡張します。

転移学習

事前にトレーニングされたモデルを取得し、独自のデータセットでモデルを「微調整」するプロセスは、転移学習と呼ばれます。 これを行うにはいくつかの方法があります。いくつかの方法を以下に説明します-

  • 大規模なデータセットで事前に訓練されたモデルを訓練します。 次に、ネットワークの最後のレイヤーを削除し、ランダムな重みを持つ新しいレイヤーに置き換えます。
  • 次に、他のすべてのレイヤーの重みをフリーズし、ネットワークを通常どおりトレーニングします。 ここで、レイヤーの凍結は、勾配降下または最適化中に重みを変更しません。

この背後にある概念は、事前に訓練されたモデルが特徴抽出として機能し、最後のレイヤーのみが現在のタスクで訓練されるということです。

計算グラフ

バックプロパゲーションは、計算グラフを使用して、Tensorflow、Torch、Theanoなどの深層学習フレームワークに実装されます。 さらに重要なことは、計算グラフの逆伝播を理解するために、いくつかの異なるアルゴリズムと、backprop through timeやbackprop with share weightなどのバリエーションを組み合わせることです。 すべてが計算グラフに変換されても、それらは同じアルゴリズムであり、計算グラフの逆伝播にすぎません。

計算グラフとは

計算グラフは、ノードが数学的操作に対応する有向グラフとして定義されます。 計算グラフは、数式を表現および評価する方法です。

たとえば、ここに簡単な数学の方程式があります-

p = x + y

上記の方程式の計算グラフを次のように描くことができます。

計算グラフ方程式1

上記の計算グラフには、2つの入力変数xおよびyと1つの出力qを持つ追加ノード(「+」記号のあるノード)があります。

もう少し複雑な例を見てみましょう。 次の方程式があります。

g = \ left(x + y \ right)\ ast z

上記の方程式は、次の計算グラフで表されます。

計算グラフ式2

計算グラフと逆伝播

計算グラフと逆伝播は、どちらもニューラルネットワークをトレーニングするための深層学習における重要なコアコンセプトです。

フォワードパス

フォワードパスは、計算グラフで表される数式の値を評価する手順です。 フォワードパスを行うということは、変数の値を出力のある左(入力)から右へ順方向に渡すことを意味します。

すべての入力に何らかの値を与えることで例を考えてみましょう。 次の値がすべての入力に与えられていると仮定します。

x = 1、y = 3、z = −3

これらの値を入力に渡すことで、フォワードパスを実行し、各ノードの出力に対して次の値を取得できます。

最初に、x = 1およびy = 3の値を使用して、p = 4を取得します。

フォワードパス

次に、p = 4およびz = -3を使用して、g = -12を取得します。 私たちは左から右へ、前に進みます。

前方通過方程式

バックワードパスの目的

バックワードパスでは、最終出力に対する各入力の勾配を計算します。 これらの勾配は、勾配降下を使用してニューラルネットワークをトレーニングするために不可欠です。

たとえば、次の勾配が必要です。

望ましい勾配

\ frac \ {\ partial x} \ {\ partial f}、\ frac \ {\ partial y} \ {\ partial f}、\ frac \ {\ partial z} \ {\ partial f}

バックワードパス(backpropagation)

最終出力(それ自体)に対する最終出力の導関数を見つけることにより、逆方向パスを開始します。 したがって、ID派生になり、値は1に等しくなります。

\ frac \ {\ partial g} \ {\ partial g} = 1

計算グラフは次のようになります-

バックワードパス

次に、「*」操作を逆方向にパスします。 pとzで勾配を計算します。 g = p * zなので、次のことがわかります-

\ frac \ {\ partial g} \ {\ partial z} = p

\ frac \ {\ partial g} \ {\ partial p} = z

フォワードパスからzとpの値を既に知っています。 したがって、我々は得る-

\ frac \ {\ partial g} \ {\ partial z} = p = 4

and

\ frac \ {\ partial g} \ {\ partial p} = z = -3

私たちはxとyで勾配を計算したい-

\ frac \ {\ partial g} \ {\ partial x}、\ frac \ {\ partial g} \ {\ partial y}

ただし、これを効率的に行う必要があります(xとgはこのグラフでは2ホップしか離れていませんが、それらが互いに本当に離れていると想像してください)。 これらの値を効率的に計算するには、微分の連鎖規則を使用します。 チェーンルールから、私たちは持っています-

\ frac \ {\ partial g} \ {\ partial x} = \ frac \ {\ partial g} \ {\ partial p} \ ast \ frac \ {\ partial p} \ {\ partial x}

\ frac \ {\ partial g} \ {\ partial y} = \ frac \ {\ partial g} \ {\ partial p} \ ast \ frac \ {\ partial p} \ {\ partial y}

しかし、pはxとyに直接依存するため、dg/dp = -3、dp/dx、およびdp/dyは簡単です。 私たちが持っています-

p = x + y \ Rightarrow \ frac \ {\ partial x} \ {\ partial p} = 1、\ frac \ {\ partial y} \ {\ partial p} = 1

したがって、我々は得る-

\ frac \ {\ partial g} \ {\ partial f} = \ frac \ {\ partial g} \ {\ partial p} \ ast \ frac \ {\ partial p} \ {\ partial x} = \ left (-3 \ right).1 = -3

さらに、入力y-

\ frac \ {\ partial g} \ {\ partial y} = \ frac \ {\ partial g} \ {\ partial p} \ ast \ frac \ {\ partial p} \ {\ partial y} = \ left (-3 \ right).1 = -3

これを逆方向に行う主な理由は、xで勾配を計算しなければならなかったときに、すでに計算された値とdq/dx(同じノードの入力に対するノード出力の導関数)のみを使用したためです。 ローカル情報を使用して、グローバル値を計算しました。

ニューラルネットワークをトレーニングする手順

ニューラルネットワークをトレーニングするには、次の手順に従います-

  • データセットのデータポイントxに対して、xを入力としてフォワードパスを実行し、出力としてコストcを計算します。
  • cから開始して逆方向パスを行い、グラフ内のすべてのノードの勾配を計算します。 これには、ニューラルネットワークの重みを表すノードが含まれます。
  • 次に、W = W-学習率*勾配を実行して重みを更新します。
  • 停止条件が満たされるまで、このプロセスを繰り返します。

Pythonディープラーニング-アプリケーション

ディープラーニングは、コンピュータービジョン、言語翻訳、画像キャプション、音声転写、分子生物学、音声認識、自然言語処理、自動運転車、脳腫瘍検出、リアルタイム音声翻訳、音楽などのいくつかのアプリケーションで優れた結果を生み出しています作曲、自動ゲームプレイなど。

ディープラーニングは、より高度な実装による機械学習の次の大きな飛躍です。 現在、それは未加工の非構造化データを処理する際にゲームチェンジャーになるという強力な約束をもたらす業界標準になることを目指しています。

ディープラーニングは現在、さまざまな現実世界の問題に対する最良のソリューションプロバイダーの1つです。 開発者は、以前に与えられたルールを使用する代わりに、複雑なタスクを解決するための例から学ぶAIプログラムを構築しています。 多くのデータサイエンティストがディープラーニングを使用しているため、より深いニューラルネットワークがより正確な結果を提供しています。

アイデアは、各ネットワークのトレーニングレイヤーの数を増やすことにより、ディープニューラルネットワークを開発することです。マシンは、可能な限り正確になるまで、データについてさらに学習します。 開発者は、ディープラーニング技術を使用して複雑な機械学習タスクを実装し、AIネットワークをトレーニングして高レベルの知覚認識を持たせることができます。

ディープラーニングは、コンピュータービジョンで人気があります。 ここで達成されるタスクの1つは、与えられた入力画像が猫、犬などに分類される画像分類です。 または、画像を最もよく説明するクラスまたはラベルとして。 私たち人間は、人生の早い段階でこのタスクを行う方法を学び、パターンをすばやく認識し、事前の知識から一般化し、さまざまな画像環境に適応するこれらのスキルを持っています。

ライブラリとフレームワーク

この章では、ディープラーニングをさまざまなライブラリとフレームワークに関連付けます。

深層学習とテアノ

ディープニューラルネットワークのコーディングを開始する場合は、Theano、TensorFlow、Keras、PyTorchなどのさまざまなフレームワークがどのように機能するかを把握することをお勧めします。

Theanoは、マシン上ですばやくトレーニングするディープネットを構築するための一連の関数を提供するpythonライブラリです。

Theanoは、深いネットの先駆者であるYoshua Bengioのリーダーシップの下、カナダのモントリオール大学で開発されました。

Theanoを使用すると、数値の長方形配列であるベクトルと行列を使用して数式を定義および評価できます。

技術的に言えば、ニューラルネットと入力データの両方を行列として表現し、すべての標準的なネット操作を行列操作として再定義できます。 コンピューターは行列演算を非常に迅速に実行できるため、これは重要です。

複数の行列値を並列処理できます。この基本構造でニューラルネットを構築する場合、GPUを備えた単一のマシンを使用して、妥当な時間枠で巨大なネットをトレーニングできます。

ただし、Theanoを使用する場合は、徹底的にディープネットを構築する必要があります。 ライブラリは、特定のタイプのディープネットを作成するための完全な機能を提供しません。

代わりに、モデル、レイヤー、アクティベーション、トレーニング方法、過剰適合を防ぐための特別な方法など、ディープネットのあらゆる側面をコーディングする必要があります。

ただし、Theanoを使用すると、ベクトル化された関数の上に実装を構築できるため、高度に最適化されたソリューションが提供されます。

Theanoの機能を拡張するライブラリは他にもたくさんあります。 TensorFlowとKerasは、Theanoをバックエンドとして使用できます。

TensorFlowを使用した深層学習

Googles TensorFlowはPythonライブラリです。 このライブラリは、商用グレードの深層学習アプリケーションの構築に最適です。

TensorFlowは、Google Brain Projectの一部であった別のライブラリDistBelief V2から生まれました。 このライブラリは、研究モデルを商用グレードのアプリケーションに適用できるように、機械学習の移植性を拡張することを目的としています。

Theanoライブラリと同様に、TensorFlowは計算グラフに基づいており、ノードは永続的なデータまたは数学演算を表し、エッジはノード間のデータのフローを表します。これは多次元配列またはテンソルです。したがって、TensorFlowという名前

操作または操作のセットからの出力は、次への入力として供給されます。

TensorFlowはニューラルネットワーク用に設計されていますが、計算をデータフローグラフとしてモデル化できる他のネットでもうまく機能します。

TensorFlowは、共通および部分式の除去、自動微分、共有変数およびシンボリック変数など、Theanoのいくつかの機能も使用します。

たたみ込みネット、オートエンコーダー、RNTN、RNN、RBM、DBM/MLPなどのような、さまざまなタイプのディープネットをTensorFlowを使用して構築できます。

ただし、TensorFlowのハイパーパラメーター構成はサポートされていません。この機能には、Kerasを使用できます。

ディープラーニングとKeras

Kerasは、ディープラーニングモデルを開発および評価するための強力で使いやすいPythonライブラリです。

レイヤーごとにネットを構築できるミニマルなデザインです。それを訓練し、実行します。

効率的な数値計算ライブラリTheanoとTensorFlowをラップし、数行の短いコードでニューラルネットワークモデルを定義およびトレーニングできます。

これは、高度なニューラルネットワークAPIであり、ディープラーニングと人工知能を幅広く活用するのに役立ちます。 TensorFlow、Theanoなどを含む多数の低レベルライブラリの上で実行されます。 Kerasコードは移植可能です。コードを変更することなく、TheanoまたはTensorFlowをバックエンドとして使用して、Kerasにニューラルネットワークを実装できます。

Pythonディープラーニング-実装

ディープラーニングのこの実装の目的は、特定の銀行の顧客の減少または変動データを予測することです。顧客はこの銀行サービスを離れる可能性があります。 使用されるデータセットは比較的小さく、14列の10000行が含まれています。 Anacondaディストリビューションと、Theano、TensorFlow、Kerasなどのフレームワークを使用しています。 Kerasはバックエンドとして機能するTensorflowとTheanoの上に構築されています。

# Artificial Neural Network
# Installing Theano
pip install --upgrade theano

# Installing Tensorflow
pip install –upgrade tensorflow

# Installing Keras
pip install --upgrade keras

ステップ1:データの前処理

In[]:

# Importing the libraries
   import numpy as np
   import matplotlib.pyplot as plt
   import pandas as pd

# Importing the database
   dataset = pd.read_csv('Churn_Modelling.csv')

ステップ2

データセットの特徴とターゲット変数のマトリックスを作成します。これは、列14に「Exited」というラベルが付けられています。

データの初期外観は以下のとおりです-

In[]:
X = dataset.iloc[:, 3:13].values
Y = dataset.iloc[:, 13].values
X

出力

ステップ出力

ステップ3

Y

出力

array([1, 0, 1, ..., 1, 1, 0], dtype = int64)

ステップ4

文字列変数をエンコードすることにより、分析をより簡単にします。 ScikitLearn関数「LabelEncoder」を使用して、0〜n_classes-1の値を持つ列のさまざまなラベルを自動的にエンコードします。

from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder_X_1 = LabelEncoder()
X[:,1] = labelencoder_X_1.fit_transform(X[:,1])
labelencoder_X_2 = LabelEncoder()
X[:, 2] = labelencoder_X_2.fit_transform(X[:, 2])
X

出力

Step4 Output

上記の出力では、国名は0、1、および2に置き換えられています。一方、男性と女性は0と1に置き換えられます。

ステップ5

エンコードされたデータのラベル付け

同じ ScikitLearn ライブラリと OneHotEncoder と呼ばれる別の関数を使用して、ダミー変数を作成する列番号を渡すだけです。

onehotencoder = OneHotEncoder(categorical features = [1])
X = onehotencoder.fit_transform(X).toarray()
X = X[:, 1:]
X

現在、最初の2列は国を表し、4列目は性別を表しています。

出力

Step5 Output

データは常にトレーニングとテストの部分に分けられます。トレーニングデータでモデルをトレーニングし、テストデータでモデルの精度をチェックします。これは、モデルの効率を評価するのに役立ちます。

ステップ6

ScikitLearnの train_test_split 関数を使用して、データをトレーニングセットとテストセットに分割しています。 トレインとテストのスプリット比は80:20のままです。

#Splitting the dataset into the Training set and the Test Set
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2)

一部の変数には数千の値があり、一部の変数には数十または1の値があります。 データがより代表的であるようにスケーリングします。

ステップ7

このコードでは、 StandardScaler 関数を使用してトレーニングデータを近似および変換しています。 テストデータの変換/スケーリングに同じ近似方法を使用するようにスケーリングを標準化します。

# Feature Scaling
fromsklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

出力

step7 output

これで、データが適切にスケーリングされました。 最後に、データの前処理が完了しました。 次に、モデルから始めます。

ステップ8

ここで必要なモジュールをインポートします。 ニューラルネットワークを初期化するシーケンシャルモジュールと、隠れ層を追加する高密度モジュールが必要です。

# Importing the Keras libraries and packages
import keras
from keras.models import Sequential
from keras.layers import Dense

ステップ9

顧客の解約を分類することを目的としているため、モデルを分類子と名付けます。 次に、初期化にSequentialモジュールを使用します。

#Initializing Neural Network
classifier = Sequential()

ステップ10

dense関数を使用して、隠れ層を1つずつ追加します。 以下のコードでは、多くの引数が表示されます。

最初のパラメーターは output_dim です。 これは、このレイヤーに追加するノードの数です。 init は、確率的勾配降下の初期化です。 ニューラルネットワークでは、各ノードに重みを割り当てます。 初期化時、重みはゼロに近いはずであり、均一関数を使用してランダムに重みを初期化します。 input_dim パラメーターは、モデルが入力変数の数を知らないため、最初のレイヤーにのみ必要です。 ここで、入力変数の総数は11です。 2番目の層では、モデルは最初の非表示層からの入力変数の数を自動的に認識します。

次のコード行を実行して、入力レイヤーと最初の非表示レイヤーを追加します-

classifier.add(Dense(units = 6, kernel_initializer = 'uniform',
activation = 'relu', input_dim = 11))

次のコード行を実行して、2番目の隠れ層を追加します-

classifier.add(Dense(units = 6, kernel_initializer = 'uniform',
activation = 'relu'))

出力層を追加するには、次のコード行を実行します-

classifier.add(Dense(units = 1, kernel_initializer = 'uniform',
activation = 'sigmoid'))

手順11

  • ANNのコンパイル *

これまで、分類器に複数のレイヤーを追加しました。* compile *メソッドを使用してそれらをコンパイルします。 最終的なコンパイル制御で追加された引数により、ニューラルネットワークが完成します。そのため、このステップでは注意が必要です。

以下に、引数の簡単な説明を示します。

最初の引数は Optimizer です。これは、最適な重みのセットを見つけるために使用されるアルゴリズムです。 このアルゴリズムは、確率的勾配降下(SGD)*と呼ばれます。 ここでは、「アダムオプティマイザー」と呼ばれるいくつかのタイプの1つを使用しています。 SGDは損失に依存するため、2番目のパラメーターは損失です。 従属変数がバイナリの場合、 *'binary_crossentropy' と呼ばれる対数損失関数を使用し、従属変数の出力に3つ以上のカテゴリがある場合、 'categorical_crossentropy' を使用します。 *精度*に基づいてニューラルネットワークのパフォーマンスを改善したいので、精度として*メトリック*を追加します。

# Compiling Neural Network
classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])

手順12

このステップでは、多くのコードを実行する必要があります。

ANNをトレーニングセットに適合させる

次に、トレーニングデータでモデルをトレーニングします。 fit メソッドを使用してモデルを近似します。 また、モデルの効率を改善するために重みを最適化します。 このためには、重みを更新する必要があります。 バッチサイズ*は、重みを更新した後の観測数です。 *Epoch は反復の合計数です。 バッチサイズとエポックの値は、試行錯誤法によって選択されます。

classifier.fit(X_train, y_train, batch_size = 10, epochs = 50)

予測とモデルの評価

# Predicting the Test set results
y_pred = classifier.predict(X_test)
y_pred = (y_pred > 0.5)

単一の新しい観測の予測

# Predicting a single new observation
"""Our goal is to predict if the customer with the following data will leave the bank:
Geography: Spain
Credit Score: 500
Gender: Female
Age: 40
Tenure: 3
Balance: 50000
Number of Products: 2
Has Credit Card: Yes
Is Active Member: Yes

ステップ13

テストセットの結果の予測

予測結果は、顧客が会社を去る確率を提供します。 その確率をバイナリの0と1に変換します。

# Predicting the Test set results
y_pred = classifier.predict(X_test)
y_pred = (y_pred > 0.5)
new_prediction = classifier.predict(sc.transform
(np.array([[new_prediction = (new_prediction > 0.5)

ステップ14

これは、モデルのパフォーマンスを評価する最後のステップです。 すでに元の結果が得られているため、混同マトリックスを作成して、モデルの精度を確認できます。

混同マトリックスの作成

from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
print (cm)

出力

loss: 0.3384 acc: 0.8605
[ [1541 54]
[230 175] ]

混同マトリックスから、モデルの精度は次のように計算できます-

Accuracy = 1541+175/2000=0.858
  • 85.8%の精度*を達成しました。これは良いことです。

前方伝播アルゴリズム

このセクションでは、単純なニューラルネットワークの前方伝播(予測)を行うためのコードの記述方法を学習します-

前方伝播アルゴリズム

各データポイントは顧客です。 最初の入力は彼らが持っているアカウントの数であり、2番目の入力は彼らが持っている子供の数です。 モデルは、ユーザーが翌年に行うトランザクションの数を予測します。

入力データは入力データとしてプリロードされ、重みは重みと呼ばれる辞書にあります。 隠れ層の最初のノードの重みの配列は重み['node_0']にあり、隠れ層の2番目のノードの重みの配列はそれぞれweights ['node_1']にあります。

出力ノードに供給される重みは、重みで利用できます。

整流線形活性化関数

「アクティベーション機能」は、各ノードで機能する機能です。 ノードの入力を何らかの出力に変換します。

修正された線形活性化関数(_ReLU_と呼ばれる)は、非常に高性能なネットワークで広く使用されています。 この関数は、入力として単一の数値を取り、入力が負の場合は0を返し、入力が正の場合は出力として入力します。

ここにいくつかの例があります-

  • relu(4)= 4
  • relu(-2)= 0

relu()関数の定義に記入します

  • max()関数を使用して、relu()の出力の値を計算します。
  • relu()関数をnode_0_inputに適用して、node_0_outputを計算します。 *relu()関数をnode_1_inputに適用して、node_1_outputを計算します。
import numpy as np
input_data = np.array([-1, 2])
weights = {
   'node_0': np.array([3, 3]),
   'node_1': np.array([1, 5]),
   'output': np.array([2, -1])
}
node_0_input = (input_data* weights['node_0']).sum()
node_0_output = np.tanh(node_0_input)
node_1_input = (input_data *weights['node_1']).sum()
node_1_output = np.tanh(node_1_input)
hidden_layer_output = np.array(node_0_output, node_1_output)
output =(hidden_layer_output* weights['output']).sum()
print(output)

def relu(input):
   '''Define your relu activation function here'''
   # Calculate the value for the output of the relu function: output
   output = max(input,0)
      # Return the value just calculated
   return(output)
# Calculate node 0 value: node_0_output
node_0_input = (input_data *weights['node_0']).sum()
node_0_output = relu(node_0_input)

# Calculate node 1 value: node_1_output
node_1_input = (input_data* weights['node_1']).sum()
node_1_output = relu(node_1_input)

# Put node values into array: hidden_layer_outputs
hidden_layer_outputs = np.array([node_0_output, node_1_output])

# Calculate model output (do not apply relu)
odel_output = (hidden_layer_outputs *weights['output']).sum()
print(model_output)# Print model output

出力

0.9950547536867305
-3

多くの観測/データ行にネットワークを適用する

このセクションでは、predict_with_network()という関数を定義する方法を学びます。 この関数は、input_dataとして取得した上記のネットワークから取得した複数のデータ観測値の予測を生成します。 上記のネットワークで指定された重みが使用されています。 relu()関数の定義も使用されています。

2つの引数input_data_rowとweightsを受け入れ、出力としてネットワークから予測を返すpredict_with_network()という関数を定義してみましょう。

各ノードの入力値と出力値を計算し、node_0_input、node_0_output、node_1_input、node_1_outputとして保存します。

ノードの入力値を計算するには、関連する配列を乗算し、それらの合計を計算します。

ノードの出力値を計算するには、ノードの入力値にrelu()関数を適用します。 input_dataを反復処理するために「forループ」を使用します-

また、predict_with_network()を使用して、input_data-input_data_rowの各行の予測を生成します。 また、各予測を結果に追加します。

# Define predict_with_network()
def predict_with_network(input_data_row, weights):
   # Calculate node 0 value
   node_0_input = (input_data_row* weights['node_0']).sum()
   node_0_output = relu(node_0_input)

   # Calculate node 1 value
   node_1_input = (input_data_row * weights['node_1']).sum()
   node_1_output = relu(node_1_input)

   # Put node values into array: hidden_layer_outputs
   hidden_layer_outputs = np.array([node_0_output, node_1_output])

   # Calculate model output
   input_to_final_layer = (hidden_layer_outputs*weights['output']).sum()
   model_output = relu(input_to_final_layer)
# Return model output
   return(model_output)

# Create empty list to store prediction results
results = []
for input_data_row in input_data:
   # Append prediction to results
   results.append(predict_with_network(input_data_row, weights))
print(results)# Print results

出力

[0, 12]

ここでは、relu(26)= 26およびrelu(-13)= 0などのrelu関数を使用しました。

深い多層ニューラルネットワーク

ここでは、2つの隠れ層を持つニューラルネットワークの前方伝播を行うコードを記述しています。 各非表示レイヤーには2つのノードがあります。 入力データは input_data としてプリロードされています。 最初の非表示層のノードは、node_0_0およびnode_0_1と呼ばれます。

それらの重みは、それぞれweights ['node_0_0']およびweights ['node_0_1']として事前にロードされます。

2番目の非表示層のノードは、 node_1_0およびnode_1_1 と呼ばれます。 それらの重みは、それぞれ weights ['node_1_0'] および weights ['node_1_1'] としてプリロードされています。

次に、 weights ['output'] として事前にロードされた重みを使用して、非表示ノードからモデル出力を作成します。

Deep Multi Layer

その重みweights ['node_0_0']と与えられたinput_dataを使用してnode_0_0_inputを計算します。 次に、relu()関数を適用してnode_0_0_outputを取得します。

node_0_1_inputに対して上記と同じことを行い、node_0_1_outputを取得します。

その重みweights ['node_1_0']と最初の非表示層からの出力hidden_​​0_outputsを使用してnode_1_0_inputを計算します。 次に、relu()関数を適用してnode_1_0_outputを取得します。

node_1_1_inputに対して上記と同じことを行い、node_1_1_outputを取得します。

weights ['output']と2番目のhidden層hidden_​​1_outputs配列からの出力を使用して、model_outputを計算します。 この出力にはrelu()関数を適用しません。

マルチ隠しレイヤー

import numpy as np
input_data = np.array([3, 5])
weights = {
   'node_0_0': np.array([2, 4]),
   'node_0_1': np.array([4, -5]),
   'node_1_0': np.array([-1, 1]),
   'node_1_1': np.array([2, 2]),
   'output': np.array([2, 7])
}
def predict_with_network(input_data):
   # Calculate node 0 in the first hidden layer
   node_0_0_input = (input_data * weights['node_0_0']).sum()
   node_0_0_output = relu(node_0_0_input)

   # Calculate node 1 in the first hidden layer
   node_0_1_input = (input_data*weights['node_0_1']).sum()
   node_0_1_output = relu(node_0_1_input)

   # Put node values into array: hidden_0_outputs
   hidden_0_outputs = np.array([node_0_0_output, node_0_1_output])

   # Calculate node 0 in the second hidden layer
   node_1_0_input = (hidden_0_outputs*weights['node_1_0']).sum()
   node_1_0_output = relu(node_1_0_input)

   # Calculate node 1 in the second hidden layer
   node_1_1_input = (hidden_0_outputs*weights['node_1_1']).sum()
   node_1_1_output = relu(node_1_1_input)

   # Put node values into array: hidden_1_outputs
   hidden_1_outputs = np.array([node_1_0_output, node_1_1_output])

   # Calculate model output: model_output
   model_output = (hidden_1_outputs*weights['output']).sum()
      # Return model_output
   return(model_output)
output = predict_with_network(input_data)
print(output)

出力

364