わずか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で製造業を強化

ブログ    

推薦する

2021年のAI展望

人工知能は進歩し続け、企業の運営方法や私たち自身の日常の経験を変えています。実際、AI はほぼすべて...

10000000000!マイクロソフトはTransformerを改良し、一度に多くのトークンを記憶できるようにした

Microsoft Research Asia の最新の調査は少々衝撃的だ。彼らは、実際にトークンを...

Jenkins 独自のユーザー データベース暗号化アルゴリズムの簡単な分析

Jenkins のアクセス制御は、セキュリティ ドメイン (認証) と承認戦略に分かれています。その...

AIはIoTベースのDDoS攻撃を阻止できる

研究者らによると、人工知能はインターネットサービスプロバイダー(IPS)がDDoS攻撃に先手を打つの...

人工知能市場は2024年までに5,543億ドルに達する

人工知能(AI)市場は急速に成長し、2024年までに5,543億ドルに達すると予想されています。人工...

AIはスペインの流行において重要な役割を果たし、新規感染者の死亡率を半減させた。

[[361228]]スペインは、感染者数が170万人を超え、欧州で新型コロナウイルスのパンデミック...

NYU の具現化知能における新たな進歩: 視覚的なフィードバックで缶を開ける方法を学習し、タスクの成功率が 135% 向上、LeCun 氏はそれを好意的に評価

ロボットがペンチで簡単にワイヤーを切る様子をご覧ください。あっという間に鉄の箱の蓋が開きました。さら...

2030年までにAI/自動化によって消滅する6つの技術職

翻訳者 | ジン・ヤンレビュー | Chonglou現在、人工知能と自動化は急速な発展段階に入ってお...

FudanNLPチームの最新の成果、RLHFと人間のアラインメントのためのMOSS-RLHFがここにあります

ChatGPT に代表される大規模言語モデル (LLM) がさまざまなタスクで効率的にパフォーマンス...

チャットボットをよりエレガントに設計する方法

AI アルゴリズムの人気により、近年会話型ロボットの人気が高まり、あらゆる分野で推進され、使用されて...

金融ビジネスイノベーションを実現する自社開発グラフデータベースに基づくナレッジグラフ実装

人工知能の急速な発展に伴い、ナレッジグラフの実装と商業化の可能性は継続的に強化され、社内のデータ分析...

...

ChatGPT エッセイの書き方の説明

1. 質問の仕方を理解するChatGPT と対話するときに使用されるプロンプトの主な 4 つのタイプ...

AI を活用することで、銀行は年間 1 兆ドルの追加収益を得ることができる | マッキンゼーの最新調査レポート

AI を活用して財務管理や投資を行いたいと考えていますか? [[351941]]好むと好まざるとにか...