加入收藏 | 设为首页 | 会员中心 | 我要投稿 好传媒网 (https://www.haochuanmei.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 建站资源 > 经验 > 正文

60行代码徒手实现深度神经网络

发布时间:2019-07-25 20:23:52 所属栏目:经验 来源:佚名
导读:01 准备数据集 采用的数据集是sklearn中的breast cancer数据集,30维特征,569个样本。训练前进行MinMax标准化缩放至[0,1]区间。按照75/25比例划分成训练集和验证集。 #获取数据集 importnumpyasnp importpandasaspd fromsklearnimportdatasets fromsklear
副标题[/!--empirenews.page--]

01

准备数据集

采用的数据集是sklearn中的breast cancer数据集,30维特征,569个样本。训练前进行MinMax标准化缩放至[0,1]区间。按照75/25比例划分成训练集和验证集。

  1. # 获取数据集 
  2. import numpy as np 
  3. import pandas as pd 
  4. from sklearn import datasets 
  5. from sklearn import preprocessing 
  6. from sklearn.model_selection import train_test_split 
  7. breast = datasets.load_breast_cancer() 
  8. scaler = preprocessing.MinMaxScaler() 
  9. data = scaler.fit_transform(breast['data']) 
  10. target = breast['target'] 
  11. X_train,X_test,y_train,y_test = train_test_split(data,target) 

02

模型结构图

60行代码徒手实现深度神经网络

03

正反传播公式

60行代码徒手实现深度神经网络

04

NN实现代码

  1. import numpy as np 
  2. import pandas as pd 
  3. #定义激活函数 
  4. ReLu = lambda z:np.maximum(0.0,z) 
  5. d_ReLu = lambda z:np.where(z<0,0,1) 
  6. LeakyReLu = lambda z:np.maximum(0.01*z,z) 
  7. d_LeakyReLu = lambda z:np.where(z<0,0.01,1) 
  8. Sigmoid = lambda z:1/(1+np.exp(-z)) 
  9. d_Sigmoid = lambda z: Sigmoid(z)*(1-Sigmoid(z)) #d_Sigmoid = a(1-a) 
  10. Tanh = np.tanh 
  11. d_Tanh = lambda z:1 - Tanh(z)**2 #d_Tanh = 1 - a**2 
  12. class NNClassifier(object): 
  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(data = np.zeros((ITERNUM,1)),columns = ['J']) 
  18.  self.W,self.b = np.nan,np.nan 
  19.  # 确定各层激活函数 
  20.  self.g = [eval(self.gfunc) for i in range(len(n))]; 
  21.  self.g[-1] = Sigmoid;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) for Ai in A] 
  35.  dZ = [np.zeros(Ai.shape) for Ai in A] 
  36.  dW = [np.zeros(Wi.shape) if isinstance(Wi,np.ndarray) else np.nan for Wi in W]  
  37.  db = [np.zeros(bi.shape) if isinstance(bi,np.ndarray) else np.nan for bi in b]  
  38.  for k in range(self.ITERNUM): 
  39.  # ---------正向传播 ---------- 
  40.  for i in range(1,len(n)): 
  41.  Z[i] = np.dot(W[i],A[i-1]) + b[i] 
  42.  A[i] = self.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 = len(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.  for i in range(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.  for i in range(1,len(n)): 
  58.  W[i] = W[i] - self.alpha*dW[i]  
  59.  b[i] = b[i] - self.alpha*db[i] 
  60.  # 显示进度 
  61.  if (k+1)%1000 == 0: 
  62.  print('progress rate:{}/{}'.format(k+1,self.ITERNUM),end = 'r') 
  63.  self.W,self.b = W,b 
  64.  def predict_prob(self,X_test): 
  65.  # ---------正向传播 ---------- 
  66.  W,b = self.W,self.b 
  67.  Ai = X_test.T 
  68.  for i in range(1,len(self.n)): 
  69.  Zi = np.dot(W[i],Ai) + b[i] 
  70.  Ai = self.g[i](Zi) 
  71.  return(Ai.reshape(-1)) 
  72.  def predict(self,X_test): 
  73.  Y_prob = self.predict_prob(X_test) 
  74.  Y_test = Y_prob.copy() 
  75.  Y_test[Y_prob>=0.5] = 1 
  76.  Y_test[Y_prob< 0.5] = 0 
  77.  return(Y_test)  

05

单隐层神经网络

(编辑:好传媒网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读