吴恩达第二课第二周编程实例

吴恩达第2课第2周编程习题

目标:使用mini—batch来加快学习速度;比较梯度下降,momentum,adam的效果

核心:指数加权平均值得计算及其意义,它是momentum,RMSProp,Adam算法的基石

不足:本例程没有使用学习率衰减的步骤,同时本例程只适于3层的二分法的神经网络

常记点:

1. 偏差修正时是除以,此处是-,t从1开始;

2. L=len(parameters) //2 ,这个L不等于网络层数,range(1,L+1)=range(1,len(layers_dims))

3. Adam算法求s时,需要平方(np.square),便于后面分母除根号(np.sqrt)

4. np.random.permutation(m),把range(m)重排列,用于把样本打乱,每一代都要打乱一次

5. arr[:,:]:逗号前面表示行的选取,后面表示列的选取

  1. ''''' 
  2. 本例程需要做几个优化对比 
  3. 不写出整个深度学习网络了 
  4. 1.不做任何优化 
  5. 2.mini-batch 
  6. 3.momentum 
  7. 4.Adam 
  8. '''  
  9. import numpy as np  
  10. import matplotlib.pyplot as plt  
  11. import scipy.io  
  12. import math  
  13. import sklearn  
  14. import sklearn.datasets  
  15.     
  16. import opt_utils  
  17. import testCases  
  18.     
  19. plt.rcParams['figure.figsize']=(7.0,4.0)  
  20. plt.rcParams['image.interpolation']='nearest'  
  21. plt.rcParams['image.cmap']='gray'  
  22.     
  23. #不适用任何优化,梯度下降更新参数  
  24.     
  25. def update_parameters_gd(parameters,grads,learning_rate):  
  26.     L=len(parameters)//2  #parameters是一个字典,储存了Wb  
  27.     for l in range(1,L+1):#L要加1是因为这个L并不指的是层数了  
  28.         parameters['W'+str(l)]=parameters['W'+str(l)]-learning_rate*grads['dW'+str(l)]  
  29.         parameters['b'+str(l)]=parameters['b'+str(l)]-learning_rate*grads['db'+str(l)]  
  30.     
  31.     return parameters  
  32. ''''' 
  33. mini-batch 
  34. '''  
  35. 把样本随机,然后分割  
  36. def mini_batches(X,Y,mini_batch_size=64,seed=0):  
  37.     np.random.seed(seed)  
  38.     m=X.shape[1]  
  39.     mini_batches=[]  
  40.     indexs=np.random.permutation(m)  
  41.     X_random=X[:,indexs]  
  42.     Y_random=Y[:,indexs].reshape(1,m)  
  43.     T=m // mini_batch_size  
  44.     for k in range(T):  
  45.         X_mini=X_random[:,k*mini_batch_size:(k+1)*mini_batch_size]  
  46.         Y_mini=Y_random[:,k*mini_batch_size:(k+1)*mini_batch_size]  
  47.     
  48.         mini_batch=(X_mini,Y_mini)  
  49.         mini_batches.append(mini_batch)  
  50.     #如果没有整除掉,那么还会剩余一次,但数据大小不会是mini_batch_size  
  51.     if m % mini_batch_size:  
  52.         X_mini=X_random[:,T*mini_batch_size:]  
  53.         Y_mini=Y_random[:,T*mini_batch_size:]  
  54.         mini_batch=(X_mini,Y_mini)  
  55.         mini_batches.append(mini_batch)  
  56.     return mini_batches  
  57.     
  58. ''''' 
  59. 使用momentum 
  60. '''  
  61. #初始化v  
  62. def initialize_v(parameters):  
  63.     v={}  
  64.     L=len(parameters) //2  
  65.     for l in range(1,L+1):  
  66.         v['dW'+str(l)]=np.zeros_like(parameters['W'+str(l)])  
  67.         v['db'+str(l)]=np.zeros_like(parameters['b'+str(l)])  
  68.     return v  
  69.     
  70. #更新参数  
  71. def update_parameters_momentum(parameters,grads,v,beta,learning_rate):  
  72.     L=len(parameters) //2      
  73.     for l in range(1,L+1):  
  74.         v['dW'+str(l)]=beta*v['dW'+str(l)]+(1-beta)*grads['dW'+str(l)]  
  75.         v['db'+str(l)]=beta*v['db'+str(l)]+(1-beta)*grads['db'+str(l)]  
  76.             
  77.         parameters['W'+str(l)]=parameters['W'+str(l)]-learning_rate*v['dW'+str(l)]  
  78.         parameters['b'+str(l)]=parameters['b'+str(l)]-learning_rate*v['db'+str(l)]  
  79.     
  80.     return parameters ,v  
  81.     
  82. ''''' 
  83. Adam算法 
  84. '''  
  85. #初始化v以及s  
  86. def initialize_adam(parameters):  
  87.     L=len(parameters) //2  
  88.     v,s={},{}  
  89.     for l in range(1,L+1):  
  90.         v['dW'+str(l)]=np.zeros_like(parameters['W'+str(l)])  
  91.         v['db'+str(l)]=np.zeros_like(parameters['b'+str(l)])  
  92.     
  93.         s['dW'+str(l)]=np.zeros_like(parameters['W'+str(l)])  
  94.         s['db'+str(l)]=np.zeros_like(parameters['b'+str(l)])  
  95.     return v,s  
  96.     
  97. #更新参数  
  98. def update_parameters_adam(parameters,grads,v,s,t,learning_rate=0.01,beta1=0.9,beta2=0.999,epsilon=1e-8):  
  99.     #t,遍历数据集的次数  
  100.     L=len(parameters) //2  
  101.     v_corrected,s_corrected={},{}  
  102.     for l in range(1,L+1):  
  103. #梯度指数加权平均         
  104.         v['dW'+str(l)]=beta1*v['dW'+str(l)]+(1-beta1)*grads['dW'+str(l)]  
  105.         v['db'+str(l)]=beta1*v['db'+str(l)]+(1-beta1)*grads['db'+str(l)]  
  106. #偏差修正  
  107.         v_corrected['dW'+str(l)]=v['dW'+str(l)]/(1-np.power(beta1,t))  
  108.         v_corrected['db'+str(l)]=v['db'+str(l)]/(1-np.power(beta1,t))  
  109. #梯度指数加权平均  
  110.             
  111.         s['dW'+str(l)]=beta2*s['dW'+str(l)]+(1-beta2)*np.square(grads['dW'+str(l)])  
  112.         s['db'+str(l)]=beta2*s['db'+str(l)]+(1-beta2)*np.square(grads['db'+str(l)])  
  113. #偏差修正  
  114.         s_corrected['dW'+str(l)]=s['dW'+str(l)]/(1-np.power(beta2,t))  
  115.         s_corrected['db'+str(l)]=s['db'+str(l)]/(1-np.power(beta2,t))  
  116.     
  117.         parameters['W'+str(l)]=parameters['W'+str(l)]-learning_rate*(v_corrected['dW'+str(l)]/np.sqrt(s_corrected['dW'+str(l)]+epsilon))  
  118.         parameters['b'+str(l)]=parameters['b'+str(l)]-learning_rate*(v_corrected['db'+str(l)]/np.sqrt(s_corrected['db'+str(l)]+epsilon))  
  119.         #分子用v,分母用s,以防s=0,所以s加上epsilon  
  120.     return parameters,v,s  
  121.     
  122. ''''' 
  123. 测试 
  124. '''  
  125. train_X, train_Y = opt_utils.load_dataset()  
  126.     
  127. def model(X,Y,layers_dims,optimizer,learning_rate=0.0007,mini_batch_size=64,beta=0.9,beta1=0.9,beta2=0.999,epsilon=1e-8,  
  128.           num_epochs=10000,print_cost=True,is_plot=True):  
  129.         
  130.     L=len(layers_dims)  
  131.     costs=[]  
  132.     t=0  
  133.     seed=10  
  134.     #初始化param以及vs  
  135.     parameters=opt_utils.initialize_parameters(layers_dims)  
  136.     if optimizer=='gd':  
  137.         pass  
  138.     elif optimizer=='momentum':  
  139.         v=initialize_v(parameters)  
  140.     elif optimizer=='adam':  
  141.         v,s=initialize_adam(parameters)  
  142.     else:  
  143.         print('optimizer is error')  
  144.         exit(1)  
  145.     #迭代学习  
  146.     for i in range(num_epochs):  
  147.         seed=seed+1  
  148.         minibatches=mini_batches(X,Y,mini_batch_size,seed)  
  149.         #注意此处不能使用mini_batches,如果使用,会造成全局变量使用错误  
  150.         for minibatch in minibatches:  
  151.             mini_batch_X,mini_batch_Y=minibatch #取出mini_batch中储存的X,Y  
  152.             #前向传播  
  153.             A3,cache=opt_utils.forward_propagation(mini_batch_X,parameters)  
  154.     
  155.             #损失函数计算  
  156.             cost=opt_utils.compute_cost(A3,mini_batch_Y)  
  157.     
  158.             #反向传播  
  159.             grads=opt_utils.backward_propagation(mini_batch_X,mini_batch_Y,cache)  
  160.     
  161.             #更新参数  
  162.             if optimizer=='gd':  
  163.                 parameters=update_parameters_gd(parameters,grads,learning_rate)  
  164.             elif optimizer=='momentum':  
  165.                 parameters,v=update_parameters_momentum(parameters,grads,v,beta,learning_rate)  
  166.             elif  optimizer=='adam':  
  167.                 t=t+1  
  168.                 parameters,v,s=update_parameters_adam(parameters,grads,v,s,t,learning_rate,beta1,beta2,epsilon)  
  169.     
  170.         if i%100==0:  
  171.             costs.append(cost)  
  172.             if print_cost and i%1000==0:      
  173.                 print('after iterations of '+str(i)+':'+str(cost))  
  174.     if is_plot:  
  175.         plt.plot(costs)  
  176.         plt.ylabel('cost')  
  177.         plt.xlabel('epoch')  
  178.         plt.title('learning rate:'+str(learning_rate))  
  179.         plt.show()  
  180.     return parameters  
  181.                 
  182. ''''' 
  183. 运行代码 
  184. '''  
  185. layers_dims = [train_X.shape[0],5,2,1]  
  186. parameters = model(train_X, train_Y, layers_dims, optimizer="gd",is_plot=True)  
  187. parameters = model(train_X, train_Y, layers_dims, beta=0.9,optimizer="momentum",is_plot=True)  
  188. parameters = model(train_X, train_Y, layers_dims, optimizer="adam",is_plot=True)  
  189. ''''' 
  190. 综合比较 
  191. adam大法好,准确率比另两种高很多 
  192. '''  

猜你喜欢

转载自www.cnblogs.com/sytt3/p/9363326.html