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

吴恩达第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是一个字典,储存了W,b  
  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以及v,s  
  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. ‘‘‘  

原文地址:https://www.cnblogs.com/sytt3/p/9363326.html

时间: 2024-10-01 03:17:50

吴恩达第二课第二周编程实例的相关文章

吴恩达第一课第三周随笔

2.1 双层神经网络 图 1 图 2 图1是一个双层网络模型,实际上有三层,但是通常把输入层给忽略掉 称为输入层 注意层了,图1层有4个节点,图2只要1个, 所以图1 应该是一个(4,3)的矩阵,图2的是一个(1,3)的矩阵 ps:坚持将前一层的特征的权重做成一列放入矩阵中,所以每一个都是(3,1)的列向量 以前一直都是使用,np.dot(.T,X),这里也同样也沿用这个设定 所以,所以 是一个(4,3)矩阵 ,b是一个[4,1]的列向量,要生成矩阵节点在前 图1的正向传播算法: A,Z的横向表

Coursera-AndrewNg(吴恩达)机器学习笔记——第一周

一.初识机器学习 何为机器学习?A computer program is said to learn from experience E with respect to some task T and some performance measure P, if its performance on T, as measured by P, improves with experience E.理解:通过实验E,完成某一项任务T,利用评价标准P对实验结果进行迭代优化! 机器学习主要包括监督学习

吴恩达机器学习第5周Neural Networks(Cost Function and Backpropagation)

5.1 Cost Function 假设训练样本为:{(x1),y(1)),(x(2),y(2)),...(x(m),y(m))} L  = total no.of layers in network sL= no,of units(not counting bias unit) in layer L K = number of output units/classes 如图所示的神经网络,L = 4,s1 = 3,s2 = 5,s3 = 5, s4 = 4 逻辑回归的代价函数: 神经网络的代价

吴恩达 Deep learning 第一周 深度学习概论

知识点 1. Relu(Rectified Liner Uints 整流线性单元)激活函数:max(0,z) 神经网络中常用ReLU激活函数,与机器学习课程里面提到的sigmoid激活函数相比有以下优点: 1.simoid激活函数具有饱和性,通常不适用simoid作为激活函数 2.ReLU的收敛速度更快 2.常见监督学习应用场景 3.结构化数据与非结构化数据 结构化数据,结构化的数据是指可以使用关系型数据库表示和存储,表现为二维形式的数据.一般特点是:数据以行为单位,一行数据表示一个实体的信息,

【C++探索之旅】第一部分第二课:C++编程的必要软件

 内容简介 1.第一部分第二课:C++编程的必要软件 2.第一部分第三课预告:第一个C++程序 C++编程的必要软件 经过上一课之后,大家是不是摩拳擦掌,准备大干一场了呢. 这一课我们来做一些C++开发前的准备工作. 编程的必要工具 依你看,什么软件对编程来说是必要的呢?如果你认真学了上一课,那你至少可以说出一种吧. 对了,就是编译器.这个重要的程序可以把你的源代码(用高级语言如C语言写的指令)转换成电脑可以理解的二进制码(只包含0和1的,类似 01100110001111011101010.

吴恩达《深度学习》第一门课(1)深度学习引言

1.1欢迎 主要讲了五门课的内容: 第一门课:神经网络基础,构建网络等: 第二门课:神经网络的训练技巧: 第三门课:构建机器学习系统的一些策略,下一步该怎么走(吴恩达老师新书<Machine Learning Yearning>就是针对这个以及上一课): 第四门课:卷积神经网络相关: 第五门课:循环神经网络相关. 1.2什么是神经网络 (1)常说的深度学习指的就是训练神经网络,或者也指特别大规模的神经网络. (2)每一个神经元都代表着从输入到输出的函数映射,如下的房价预测: (3)激活函数Re

【吴恩达课后测验】Course 1 - 神经网络和深度学习 - 第一周测验【中英】

[吴恩达课后测验]Course 1 - 神经网络和深度学习 - 第一周测验[中英] 第一周测验 - 深度学习简介 和"AI是新电力"相类似的说法是什么? [ ?]AI为我们的家庭和办公室的个人设备供电,类似于电力. [ ?]通过"智能电网",AI提供新的电能. [?]AI在计算机上运行,??并由电力驱动,但是它正在让以前的计算机不能做的事情变为可能. [★]就像100年前产生电能一样,AI正在改变很多的行业. 请注意: 吴恩达在视频中表达了同样的观点. 哪些是深度学

吴恩达《深度学习》-课后测验-第一门课 (Neural Networks and Deep Learning)-Week 4 - Key concepts on Deep Neural Networks(第四周 测验 – 深层神经网络)

Week 4 Quiz - Key concepts on Deep Neural Networks(第四周 测验 – 深层神经网络) \1. What is the "cache" used for in our implementation of forward propagation and backward propagation?(在实现前向传播和反向传播中使用的"cache"是什么?) [ ]It is used to cache the interme

吴恩达2014机器学习教程笔记目录

17年开始,网上的机器学习教程逐渐增多,国内我所了解的就有网易云课堂.七月.小象学院和北风.他们的课程侧重点各有不同,有些侧重理论,有些侧重实践,结合起来学习事半功倍.但是论经典,还是首推吴恩达的机器学习课程. 吴大大14年在coursera的课程通俗易懂.短小精悍,在讲解知识点的同时,还会穿插相关领域的最新动态,并向你推荐相关论文.课程10周共18节课,每个课程都有PPT和课后习题,当然,也有中文字幕. 百度网盘(视频 + 英文字幕 + 中文字幕 + 练习 + PPT): 链接:https:/