わずか60行のコードでディープニューラルネットワークを実装する

わずか60行のコードでディープニューラルネットワークを実装する

01

データセットの準備

使用されるデータセットは、30 次元の特徴と 569 個のサンプルを含む、sklearn の乳がんデータセットです。トレーニングの前に、[0,1]間隔にスケーリングするためにMinMax正規化が実行されます。データセットは、75/25 の比率でトレーニング セットと検証セットに分割されます。

  1. # データセットを取得する
  2. numpyをnpとしてインポートする
  3. pandasをpdとしてインポートする
  4. sklearnからデータセットをインポートする
  5. sklearnインポート前処理から
  6. sklearn.model_selection からtrain_test_splitをインポートします
  7. 乳房 = datasets.load_breast_cancer()
  8. スケーラー = preprocessing.MinMaxScaler()
  9. データ = scaler.fit_transform(breast[ 'data' ])
  10. ターゲット = 乳房[ 'ターゲット' ]
  11. X_train、X_test、y_train、y_test = train_test_split(データ、ターゲット)

02

モデル構造図

03

順方向および逆方向の伝播式

04

NN実装コード

  1. numpyをnpとしてインポートする
  2. pandasをpdとしてインポートする
  3. #活性化関数を定義する
  4. ReLu = ラムダ z:np.maximum( 0.0 ,z)
  5. d_ReLu = lambda z:np.where(z< 0 , 0 , 1 )
  6. LeakyReLu = ラムダ z:np.maximum( 0.01 *z,z)
  7. d_LeakyReLu = lambda z:np.where(z< 0 , 0.01 , 1 )
  8. シグモイド = ラムダ z: 1 /( 1 +np.exp(-z))
  9. d_Sigmoid = ラムダ z: Sigmoid(z)*( 1- Sigmoid(z)) #d_Sigmoid = a( 1 -a)
  10. 正接 = np.tanh
  11. d_Tanh = ラムダ z: 1 - Tanh(z)** 2 #d_Tanh = 1 - a** 2  
  12. クラスNNClassifier(オブジェクト):
  13. def __init__(self,n = [np.nan, 5 , 5 , 1 ],alpha = 0.1 ,ITERNUM = 50000 , gfunc = 'ReLu' ):
  14. self.n = n #各層のノード数
  15. self.gfunc = gfunc #隠れ層の活性化関数
  16. self.alpha,self.ITERNUM = alpha,ITERNUM
  17. self.dfJ = pd.DataFrame(データ = np.zeros((ITERNUM, 1 )), 列 = [ 'J' ])
  18. 自己.W、自己.b = np.nan、np.nan
  19. # 各層の活性化関数を決定する
  20. self.g = [eval(self.gfunc) for i in range(len(n))];
  21. self.g[- 1 ] = シグモイド; self.g[ 0 ] = np.nan
  22. # 隠れ層の活性化関数の導関数を決定する
  23. self.d_gfunc = eval( 'd_' + self.gfunc)を実行します。
  24. def fit(self,X_train,y_train):
  25. X、Y = X_train.T、y_train.reshape( 1 、- 1 )
  26. m = X.shape[ 1 ] #サンプル数
  27. n = self.n; n[ 0 ] = X.shape[ 0 ] # 各層のノード数
  28. # ノード値とパラメータの初期化
  29. A = [np.zeros((ni,m)) for ni in n]; A[ 0 ] = X # 各層ノードの出力値を初期化する
  30. Z = [np.zeros((ni,m)) for ni in n]; Z[ 0 ] = np.nan # 各層ノードの中間値を初期化する
  31. W = [np.nan] + [np.random.randn(n[i],n[i- 1 ]) * 0.01   for i in range( 1 ,len(n))] # 各層の係数パラメータ
  32. b = [np.zeros((ni, 1 )) for ni in n]; b[ 0 ] = np.nan #n 各層のバイアスパラメータ
  33. # 導関数を初期化する
  34. dA = [np.zeros(Ai.shape) AiがAにある場合]
  35. dZ = [np.zeros(Ai.shape) A 内の Aiの場合]
  36. dW = [np.zeros(Wi.shape)、 isinstance(Wi,np.ndarray)、そうでない場合はnp.nan 、Wiが W の場合]
  37. db = [np.zeros(bi.shape)、 isinstance(bi、np.ndarray)、そうでない場合は、bib 内にある場合np.nan ]
  38. k が範囲内にある場合(self.ITERNUM):
  39. # ---------前方伝播----------
  40. iが範囲( 1 ,len(n))内にある場合:
  41. Z[i] = np.dot(W[i],A[i- 1 ]) + b[i]
  42. A[i] = 自己.g[i](Z[i])
  43. J = ( 1 /m) * np.sum(- Y*np.log(A[len(n)- 1 ]) -( 1 -Y)*np.log( 1 -A[len(n)- 1 ]))
  44. self.dfJ.loc[k][ 'J' ] = J
  45. # ----------後方伝播---------
  46. hmax = 長さ(n) - 1  
  47. dA[hmax] = 1 /m*(-Y/A[hmax] + ( 1 -Y)/( 1 -A[hmax]))
  48. dZ[hmax] = 1 /m*(A[hmax]-Y)
  49. dW[hmax] = np.dot(dZ[hmax],A[hmax- 1 ].T)
  50. db[hmax] = np.dot(dZ[hmax],np.ones((m, 1 )))
  51. i範囲(len(n)-2,0 , -1 )ある場合:
  52. dA[i] = np.dot(W[i+ 1 ].T,dZ[i+ 1 ])
  53. dZ[i] = dA[i]* self.d_gfunc(Z[i])
  54. dW[i] = np.dot(dZ[i],A[i- 1 ].T) です。
  55. db[i] = np.dot(dZ[i],np.ones((m, 1 )))
  56. #-----------勾配降下法---------
  57. iが範囲( 1 ,len(n))内にある場合:
  58. W[i] = W[i] - 自己.alpha*dW[i]
  59. b[i] = b[i] - self.alpha*db[i]
  60. # 進行状況を表示
  61. (k+ 1 )% 1000 == 0の場合:
  62. print( '進捗率: {}/{}' .format(k+ 1 ,self.ITERNUM),end = '\r' )
  63. 自己.W,自己.b = W,b
  64. def predict_prob(self, X_test):
  65. # ---------前方伝播----------
  66. W,b = 自分.W,自分.b
  67. Ai = X_test.T
  68. i が範囲( 1 、len(self.n))内にある場合:
  69. Zi = np.dot(W[i],Ai) + b[i]
  70. Ai = 自己.g[i](Zi)
  71. 戻り値(Ai.reshape(- 1 ))
  72. def predict(self,X_test):
  73. Y_prob = 自己予測確率(X_test)
  74. Y_テスト = Y_prob.copy()
  75. Y_テスト[Y_確率>= 0.5 ] = 1  
  76. Y_テスト[Y_確率< 0.5 ] = 0  
  77. 戻り値(Y_test)

05

単一隠れ層ニューラルネットワーク

隠し層を 1 に設定し、隠し層ノードの数は 5 で、隠し層はシグモイド活性化関数を使用します。

  1. # シグモイド活性化関数を使用する
  2. NN = NNClassifier(n = [np.nan, 5 , 1 ], アルファ = 0.02 ,
  3. ITERNUM = 200000 、gfunc = 'シグモイド' )
  4. NN.fit(X_train,y_train)
  5. # 目的関数の反復曲線を描く
  6. %matplotlib インライン
  7. NN.dfJ.plot(図のサイズ = ( 12 , 8 ))
  8. # 検証セットでAUCスコアをテストする
  9. sklearn.metricsからroc_auc_scoreをインポートします
  10. Y_確率 = NN.予測確率(X_テスト)
  11. roc_auc_score(リスト(y_test),リスト(Y_prob))

隠れ層は Tanh 活性化関数を使用します。

  1. # Tanh活性化関数の使用
  2. NN = NNClassifier(n = [np.nan, 5 , 1 ], アルファ = 0.02 ,
  3. ITERNUM = 200000 、 gfunc = 'Tanh' )
  4. NN.fit(X_train,y_train)
  5. # 目的関数の反復曲線を描く
  6. %matplotlib インライン
  7. NN.dfJ.plot(図のサイズ = ( 12 , 8 ))
  8. # 検証セットでAUCスコアをテストする
  9. sklearn.metricsからroc_auc_scoreをインポートします
  10. Y_確率 = NN.予測確率(X_テスト)
  11. roc_auc_score(リスト(y_test),リスト(Y_prob))

隠し層は ReLu 活性化関数を使用します。

  1. # ReLu活性化関数を使用する
  2. NN = NNClassifier(n = [np.nan, 5 , 1 ], アルファ = 0.02 ,
  3. ITERNUM = 200000 、gfunc = 'ReLu' )
  4. NN.fit(X_train,y_train)
  5. # 目的関数の反復曲線を描く
  6. %matplotlib インライン
  7. NN.dfJ.plot(図のサイズ = ( 12 , 8 ))
  8. # 検証セットでAUCスコアをテストする
  9. sklearn.metricsからroc_auc_scoreをインポートします
  10. Y_確率 = NN.予測確率(X_テスト)
  11. roc_auc_score(リスト(y_test),リスト(Y_prob))

隠し層は LeakyReLu 活性化関数を使用します。

  1. # LeakyReLu活性化関数を使用する
  2. NN = NNClassifier(n = [np.nan, 5 , 1 ], アルファ = 0.02 ,
  3. ITERNUM = 200000 、gfunc = 'LeakyReLu' )
  4. NN.fit(X_train,y_train)
  5. # 目的関数の反復曲線を描く
  6. %matplotlib インライン
  7. NN.dfJ.plot(図のサイズ = ( 12 , 8 ))
  8. # 検証セットでAUCスコアをテストする
  9. sklearn.metricsからroc_auc_scoreをインポートします
  10. Y_確率 = NN.予測確率(X_テスト)
  11. roc_auc_score(リスト(y_test),リスト(Y_prob))

上記の実験は、現在のデータセットでは、隠し層に ReLu 活性化関数を使用するのが最良の選択であり、最高の AUC スコアが 0.99958 であることを示しているようです。

06

二重隠れ層ニューラルネットワーク

隠し層を 2 つ設定し、隠し層ノードの数は 5 で、隠し層は ReLu 活性化関数を使用します。

  1. # 2つの隠し層を設定し、ReLu活性化関数を使用する
  2. NN = NNClassifier(n = [np.nan, 5 , 5 , 1 ],アルファ = 0.02 ,
  3. ITERNUM = 200000 、gfunc = 'ReLu' )
  4. NN.fit(X_train,y_train)
  5. # 目的関数の反復曲線を描く
  6. %matplotlib インライン
  7. NN.dfJ.plot(図のサイズ = ( 12 , 8 ))
  8. # 検証セットでAUCスコアをテストする
  9. sklearn.metricsからroc_auc_scoreをインポートします
  10. Y_確率 = NN.予測確率(X_テスト)
  11. roc_auc_score(リスト(y_test),リスト(Y_prob))

AUC スコア 0.99874 は、単一の隠し層を使用した場合の最適スコア 0.99958 よりも低くなっています。これは、モデルの複雑さが高すぎることが原因である可能性があります。モデルの複雑さを軽減するために、隠し層ノードの数を 3 に減らすことを試みます。

  1. # 二重隠し層、隠し層ノードの数は3  
  2. NN = NNClassifier(n = [np.nan, 3 , 3 , 1 ],アルファ = 0.02 ,
  3. ITERNUM = 200000 、gfunc = 'ReLu' )
  4. NN.fit(X_train,y_train)
  5. # 目的関数の反復曲線を描く
  6. %matplotlib インライン
  7. NN.dfJ.plot(図のサイズ = ( 12 , 8 ))
  8. # 検証セットでAUCスコアをテストする
  9. sklearn.metricsからroc_auc_scoreをインポートします
  10. Y_確率 = NN.予測確率(X_テスト)
  11. roc_auc_score(リスト(y_test),リスト(Y_prob))

AUC スコアは 0.99979 となり、改善が見られます。

sklearn に付属するニューラル ネットワーク分類器と比較します。

  1. # sklearnのモデルと比較する
  2. sklearn.neural_network からMLPClassifierをインポートします
  3. # 最初の隠れ層のニューロンの数は3、2 番目の隠れ層のニューロンの数は3です。  
  4. MLPClf = MLPClassifier(隠しレイヤーのサイズ=( 3 , 3 ),max_iter= 200000 ,アクティベーション= 'relu' )
  5. MLPClf.fit(X_train、y_train) 関数
  6. # 目的関数の反復曲線を描く
  7. dfJ = pd.DataFrame(データ = np.array(MLPClf.loss_curve_)、列 = [ 'J' ])
  8. dfJ.plot(図のサイズ = ( 12 , 8 ))
  9. # 検証セットでAUCスコアをテストする
  10. sklearn.metricsからroc_auc_scoreをインポートします
  11. Y_prob = MLPClf.predict_proba(X_test)[:, 1 ]
  12. roc_auc_score(リスト(y_test),リスト(Y_prob))

上記の実験から、現在のデータ セットでは、ReLu 活性化関数を選択し、二重の隠し層を使用し、各隠し層のノード数を 3 に設定することが適切な選択であり、AUC スコアは 0.99979 であることが示されています。このスコアは、CV クロス検証を使用してハイパーパラメータを最適化した後のロジスティック回帰モデルの AUC スコア 0.99897 よりも高くなります。

<<:  心理測定?犯罪の予感? AIは京都の痛みを軽減できるか?

>>:  分散型AIで製造業を強化

ブログ    
ブログ    
ブログ    

推薦する

毎日のアルゴリズム: 有効な三角形の数

[[429712]]この記事はWeChatの公開アカウント「3分でフロントエンドを学ぶ」から転載した...

顔認識技術の応用における認知的誤解

[[286435]]カメラはどこにでもあり、顔認識は生活のほぼあらゆる場面で使用されています。どのよ...

フランスのヒューマノイド ロボット Reachy は、オープン ソース + モジュール式で、最も複雑な Raspberry Pi ロボットの 1 つです。

Raspberry Pi は、小さなおもちゃの車から産業用ロボットアームに至るまで、あらゆるものに...

...

5分で様々な人工知能技術を紹介

人工知能は、コンピューターが人間と同様のレベルの知能を発揮できるようにするさまざまな技術を網羅する幅...

マイクロソフトが Project Brainwave リアルタイム AI プラットフォームの詳細を公開

Project Brainwave は、主にリアルタイムの人工知能アプリケーションを対象とした Mi...

0 コーパスで「ラベル付け」してより良い多言語翻訳結果を得る方法

[[409976]]今日の多言語翻訳モデルのほとんどは、英語中心のデータセットで統合モデルをトレーニ...

人工知能が私たちの生活に及ぼす8つの影響

[[226485]]マイクロソフト アジア社長のラルフ ハウプター氏によると、AI が概念から現実の...

知湖橋プラットフォームにおける大型モデルの応用と実践

1. 事業の状況及び背景まずはブリッジプラットフォームを紹介します。 Bridge は、Zhihu ...

MLタスクを効率的、迅速、正確に完了するにはどうすればよいでしょうか? 4つのAutoMLライブラリについて学びましょう

自動機械学習 (AutoML) は、データをモデル化するための機械学習モデルの構築プロセスを自動化す...

CMU と ETH が画期的な成果を達成: 敏捷性が最大限に高められたロボット犬は、スピードと安全性を兼ね備え、超高速で障害物を乗り越えることができます。

高速ロボット動作の分野では、速度と安全性の両立が常に大きな課題となっています。しかし今、カーネギーメ...

...

...

スマートホームにはスマートロボットが必要ですか?

スマートホームの人気が高まっていることは間違いありません。テクノロジーに精通した早期導入者から一般の...

プログラマーがマスターになるためのプログラミングアルゴリズムトップ10

アルゴリズム1: クイックソートアルゴリズムクイックソートは、Tony Hall によって開発された...