找回密码
 立即注册
查看: 89|回复: 0

神经网络基础常识(mini_batch梯度下降,指数加权平均、动量梯度下降、RMSPROP算法、Adam优化算法、学习率衰减)

[复制链接]
发表于 2024-7-15 18:54 | 显示全部楼层 |阅读模式
mini_batch梯度下降算法

在训练网络时,如果训练数据非常复杂,那么把所有训练数据都输入一次神经网络需要非常长的时间,此外,这些数据可能底子无法一次性装入内存。为了加快训练速度
batch梯度下降:每次迭代都需要遍历整个训练集,可以预期每次迭代损掉城市下降。
随机梯度下降:每次迭代中,只会使用1个样本。当训练集较大时,随机梯度下降可以更快,但是参数会向最小值摆动,而不是平稳的收敛。
mini_batch:把大的训练集分成多个小的子集(mini_batch),每次迭代就取一个子集(mini_batch),所以每次迭代都是在训练分歧的样本((mini_batch),其损掉会有震荡,但是总体趋势是下降的。
数据量斗劲小的化(小于2000),一般采用batch梯度下降。
样本量斗劲大的情况,一般采用mini_batch ,mini_batch一般设置为2的n次方,一般是2的6次方到2的9次方之间。
指数加权平均值

具体参考:
优化算法之指数加权平均详解_修炼之路的博客-CSDN博客
以气温为例
局部平均值:
V_{t}=\beta*V_{t-1} +(1-\beta)*\theta_{t}  
\theta 暗示当天的温度,V暗示局部平均值, V_{t} 暗示第t天的局部平均温度, \theta_{t} 暗示第t天的温度。当 \beta =0.9时, V_{t} 可看作是1/(1- \beta )=10天的平均温度。
如果你想要计算10天局部温度的平均值,你需要保留比来10天的温度,此刻,在计算局部平均值的时候,你只需要保留前一个的加权平均值,相对于直接计算平均值,精确度没有那么高。
修正偏差
通过 V_{t}=1/(1-\beta_{t}) 来修正指数加权平均的误差,随着t的增大,1- \beta_{t} 会趋近于1, \beta_{t} 趋近于0,所以偏差修正对于后期的指数加权平均没有影响。
注意:如果你对前期的局部的平均值的精度没有要求,可以使用偏差修正,偏差修正主要修正的是前期的局部平均值的误差。
动量梯度下降

普通的梯度下降法:
w=w-\alpha *dw
采用动量梯度下降之后
V_{dw}=\beta dw +(1-\beta)dw
更新参数时:
w=w-\alpha V_{dw}
颠末实践证明:
\beta 取0.9时成果斗劲好
RMSPROP算法

RMSPROP 算法,全称 root mean square prop。为了进一步优化损掉函数在更新中的存在摆动幅度更大的问题,而且进一步加快函数的收敛速度。RMSPROP算法对权重w和偏置b的梯度使用微分平方和加权平均数。
在第t轮的迭代中
dw的平方和是 dw^{2} ,db的平方是 db^{2} ,如果严谨些,防止分母为0,在分数下加一个非常小的值 \varepsilon ,凡是取为 10^{-8}
S_{dw}=\beta* S_{dw}+(1-\beta)dw^{2}
S_{db}=\beta* S_{db}+(1-\beta)db^{2}
w=w-\alpha\frac{dw}{\sqrt{\sqrt{S_{dw}}}+\varepsilon}
b=b-\alpha\frac{db}{\sqrt{\sqrt{S_{db}}}+\varepsilon}
这样的作法 有利于消除摆动幅度大的标的目的,用来修正摆动幅度,是的各个维度的摆动幅度都斗劲小,另一方面也使得网络函数的收敛速度更快,比如dw和db有一个值斗劲大的时候,那么我们更新权重或者偏置的时候,除以之前累积的梯度的平方根,这样就使得更新的幅度更小。
Adam优化算法:结合了Momentum和RMSprop算法
V_{dw}=0         S_{dw}=0 V_{db}=0      S_{db}=0
compute dw,db using  min_batch
     V_{dw}=\beta_{1}*V_{dw} + (1-\beta_{1})dw
     V_{db}=\beta_{1}*V_{db} + (1-\beta_{1})db
     S_{dw}=\beta_{2}*V_{dw} + (1-\beta_{2})dw^{2}
     S_{db}=\beta_{2}*V_{db} + (1-\beta_{2})db^{2}
V_{dw}^{corrected}=\frac{V_{dw}}{(1-\beta_{1}^{t})}
V_{db}^{corrected}=\frac{V_{db}}{(1-\beta_{1}^{t})}
S_{dw}^{corrected}=\frac{S_{dw}}{(1-\beta_{2}^{t})}
S_{db}^{corrected}=\frac{S_{db}}{(1-\beta_{2}^{t})}
w=w-\alpha*\frac{V_{dw}^{corrected}}{\sqrt{S_{dw}^{corrected}+\varepsilon}}
b=b-\alpha*\frac{V_{db}^{corrected}}{\sqrt{S_{db}^{corrected}+\varepsilon}}
\alpha 为学习
\beta_{1}  为0.9  dw
\beta_{2} 为0.999   dw^{2}
\varepsilon 为 10^{-8}
学习率衰减

慢慢减少 \alpha 的本质在于,在学习初期,你能承受较大的法式,当开始收敛时,小一些的学习率能让 法式小一些。
方式1: \alpha=\frac{1}{(1+decayrate+epochnum)}*\alpha_{0}
此中,decayrate是衰减率,epochnum是迭代次数, \alpha_{0} 是初始学习率
方式2: \alpha=0.95^{epochnum}\alpha_{0}
方式3: \alpha=\frac{k}{epochnum}*\alpha_{0} 或 \frac{k}{\sqrt{t}}    t为mini_batch
方式4:离散学习率,某个法式某个学习率,一会之后学习率减半,然后再减半。
方式5:手动调。
代码来自:【中文】【吴恩达课后编程作业】Course 2 - 改善深层神经网络 - 第二周作业_何宽的博客-CSDN博客
  1. import numpy as  np
  2. import matplotlib.pyplot as plt
  3. import scipy.io
  4. import math
  5. import sklearn
  6. import sklearn.datasets
  7. import opt_utils
  8. import testCase
  9. plt.rcParams['figure.figsize']=(7.0,4.0)
  10. plt.rcParams[”image.interpolation”]='nearest'
  11. plt.rcParams['image.cmap']='gray'
  12. #梯度下降
  13. def update_parameters_with_gd(parameters,grads,learning_rate):
  14.     ”””
  15.     使用梯度下降更新参数
  16.     参数
  17.     :param parameters: 字典,包含了要更新的参数
  18.     parameter['W'+str(l)]=Wl
  19.     parameter['b'+str(l)]=bl
  20.     grads -字典,包含了每一个梯度值用以更新参数
  21.     :param grads:
  22.     grads['dw'+str(l)]=dwl
  23.     grads['db'+str(l)]=dbl
  24.     :param learning_rate: 学习率
  25.     :return:
  26.     返回值:
  27.     :parameter-字典,包含了更新后的参数
  28.     ”””
  29.     L=len(parameters)//2 #神经网络的层数
  30.     #更新每个参数
  31.     for l in range(L):
  32.         parameters[”W”+str(l+1)]=parameters[”W”+str(l+1)]-learning_rate*grads[”dW”+str(l+1)]
  33.         parameters[”b”+str(l+1)]=parameters[”b”+str(l+1)]-learning_rate*grads[”db”+str(l+1)]
  34.     return parameters
  35. # #测试
  36. # print(”------------------------------------测试update_parameters_with_gd-------------------------------”)
  37. # parameters,grads,learning_rate=testCase.update_parameters_with_gd_test_case()
  38. # parameters=update_parameters_with_gd(parameters,grads,learning_rate)
  39. #
  40. # print(”W1=”+str(parameters[”W1”]))
  41. # print(”b1=”+str(parameters[”b1”]))
  42. # print(”W2=”+str(parameters[”W2”]))
  43. # print(”b2=”+str(parameters[”b2”]))
  44. # #随机梯度下降
  45. # X=data_input
  46. # Y=labels
  47. # parameters=initialize_parameters(layers_dims)
  48. # for i in range(0,num_iterations):
  49. #     #前向传布
  50. #     A,cache=forward_propagation(X,parameters)
  51. #     #计算损掉
  52. #     cost=copmute_cost(A,Y)
  53. #     #反向传布
  54. #     grads=backward_propagation(X,Y,cache)
  55. #     #更新参数
  56. #     parameters=update_parameters(parameters,grads)
  57. #
  58. # #随机梯度下降
  59. # X=data_input
  60. # Y=labels
  61. # parameters=initialize_parameters(layers_dims)
  62. # for i in (0,num_iteration):
  63. #     for j in  m:
  64. #         #前向传布
  65. #          A,cache=forward_propagation(X,parameters)
  66. #         #计算成本
  67. #          cost=compute_cost(A,Y)
  68. #         #后向传布
  69. #     grads=backward_propagation(X,Y,cache)
  70. #     #更新参数
  71. #     parameters=update_parameters(parameters,grads)
  72. #mini_batch
  73. # #第一个mini_batch
  74. # first_mini_batch_X=shuffled_X[:,0:mini_batch_size]
  75. # #第二个mini-batch
  76. # second_mini_batch_X=shuffled_X[:,mini_batch_size:2*mini_batch_size]
  77. def random_mini_batches(X,Y,mini_batch_size=64,seed=0):
  78.     ”””
  79.     从(X,Y)中创建一个随机的mini_batch列表
  80.     :param X: 输入数据,维度为(输入节点数,样本的数量)
  81.     :param Y: 对应的是X的标签,[1|0](蓝,红),样本的数量
  82.     :param mini_batch_size: 每个mini-batch的样本数量
  83.     :return:
  84.     mini-batchs-一个同步列表,维度为(mini_batch_X,mini_batch_Y)
  85.     ”””
  86.     np.random.seed(seed) #指定随机种子
  87.     m=X.shape[1]
  88.     mini_batchs=[]
  89.     #第一步打乱挨次
  90.     permutation=list(np.random.permutation(m)) #它会返回一个长为m的随机数,且里面的数是从0到m-1
  91.     shuffled_X=X[:,permutation] #将每一列的数据按permutation的挨次从头摆列
  92.     shuffled_Y=Y[:,permutation].reshape((1,m))
  93.     #第二步,分割
  94.     num_complete_minibatches=math.floor(m/mini_batch_size) #把你的训练集分割成多少份,如果是99.99,则返回值是99,剩下的0.99会被舍弃
  95.     for k in range(0,num_complete_minibatches+1):
  96.         mini_batch_X=shuffled_X[:,k*mini_batch_size:(k+1)*mini_batch_size]
  97.         mini_batch_Y=shuffled_Y[:,k*mini_batch_size:(k+1)*mini_batch_size]
  98.         # print(”mini_batch_X.shape[1]”,mini_batch_X.shape[1])
  99.         mini_batch = (mini_batch_X, mini_batch_Y)
  100.         mini_batchs.append(mini_batch)
  101.         #如果训练集的大小刚好是mini_batch_size的整数倍,那么这里已经措置完。
  102.         #如果训练集的大小不是mini_batch_size的整数倍,那么最后必定会剩下一些。
  103.     if m % mini_batch_size!=0:
  104.         #获取最后残剩的部门
  105.         mini_batch_X=shuffled_X[:,mini_batch_size*num_complete_minibatches:]
  106.         mini_batch_Y=shuffled_Y[:,mini_batch_size*num_complete_minibatches:]
  107.         mini_batch=(mini_batch_X,mini_batch_Y)
  108.         mini_batchs.append(mini_batch)
  109.     return mini_batchs
  110. # print(”-------------测试random_mini_batches------------------------------------------------”)
  111. # X_aasess,Y_assess,mini_batch_size=testCase.random_mini_batches_test_case()
  112. # print(X_aasess.shape[1])
  113. # print(mini_batch_size)
  114. # mini_batchs=random_mini_batches(X_aasess,Y_assess,mini_batch_size)
  115. #
  116. # print(”第1个mini_batch_X的维度为:”,mini_batchs[0][0].shape)
  117. # print(”第1个min_batch_Y的维度为”,mini_batchs[0][1].shape)
  118. # print(”第2个mini_batch_X的维度为:”, mini_batchs[1][0].shape)
  119. # print(”第2个min_batch_Y的维度为”, mini_batchs[1][1].shape)
  120. # print(”第3个mini_batch_X的维度为:”, mini_batchs[2][0].shape)
  121. # print(”第3个min_batch_Y的维度为”, mini_batchs[2][1].shape)
  122. #包含动量的梯度下降
  123. def initialze_velocity(parameters):
  124.     ”””
  125.     初始化速度,velocity 是一个字典
  126.     -keys:”dw1”,”db1”,....,”dWL”,”dbL”
  127.     -values:与相应的梯度/参数维度不异的值为0的矩阵
  128.     参数:
  129.     :parameters -一个字典,包含了以下参数
  130.         :parameter[”W”+str(1)]=W1
  131.         :parameter[”b”+str(1)]=b1
  132.     返回:
  133.     v- 一个字典变量,包含了 以下参数
  134.       v[”dw”+str(1)]=dw1的速度
  135.       v[”db”+str(1)]=db1的速度
  136.     ”””
  137.     L=len(parameters)//2
  138.     v={}
  139.     for l in range(L):
  140.         v[”dW”+str(l+1)]=np.zeros_like(parameters[”W”+str(l+1)])
  141.         v[”db”+str(l+1)]=np.zeros_like(parameters[”b”+str(l+1)])
  142.     return v
  143. #测试一下
  144. #
  145. # print(”------------------测试initialize_velocity---------------------------”)
  146. # parameters=testCase.initialize_velocity_test_case()
  147. # v=initialze_velocity(parameters)
  148. #
  149. # print('v[”dW1”]=' +str(v[”dW1”]))
  150. # print('v[”db1”]=' +str(v[”db1”]))
  151. # print('v[”dW2”]=' +str(v[”dW2”]))
  152. # print('v[”db2”]='  +str(v[”db2”]))
  153. def update_parameters_with_momentun(parameters,grads,v,beta,learning_rate):
  154.     ”””
  155.     使用动量更新参数
  156.     :param parameters: 一个字典的变量,包含了 以下字段:
  157.         :parameter[”W”+str(1)]=W1
  158.         parameter[”b”+str(1)]=b1
  159.     :param grads: 一个包含梯度值的字典变量,具有以下字段
  160.         grads[”dW”+str(l)]=dW1
  161.         grads[”db”+str(l)]=db1
  162.     :param v: 包含当前速度的字典变量,具有以下字段:
  163.            v[”dW”+str(l)]=...
  164.            v[”db”+str(l)]=
  165.     :param beta: 超参数,动量,实数
  166.     :param learning_rate: 学习率,实数
  167.     :return:
  168.         :parameter 更新后的参数字典
  169.         v-包含了更新后的速度变量
  170.     ”””
  171.     L=len(parameters)//2
  172.     for l in  range(L):
  173.         #计算速度
  174.         v[”dW”+str(l+1)]=beta*v[”dW”+str(l+1)]+(1-beta)*grads[”dW”+str(l+1)]
  175.         v[”db” + str(l + 1)] = beta * v[”db” + str(l + 1)] + (1 - beta) * grads[”db” + str(l + 1)]
  176.         #更新参数
  177.         parameters[”W”+str(l+1)]=parameters[”W”+str(l+1)]-learning_rate*v['dW'+str(l+1)]
  178.         parameters[”b” + str(l + 1)] = parameters[”b” + str(l + 1)] - learning_rate * v['db' + str(l + 1)]
  179.     return  parameters,v
  180. #测试
  181. # print(”------------------测试update_parametes_with_momentun-------------------------”)
  182. # parameters,grads,v=testCase.update_parameters_with_momentum_test_case()
  183. # update_parameters_with_momentun(parameters,grads,v,beta=0.9,learning_rate=0.01)
  184. # print(”W1=”+str(parameters[”W1”]))
  185. # print(”b1=”+str(parameters[”b1”]))
  186. #
  187. # print(”W2=”+str(parameters[”W2”]))
  188. # print(”b2=”+str(parameters[”b2”]))
  189. #
  190. # print('v[”dW1”]='+str(v[”dW1”]))
  191. # print('v[”db1”]='+str(v[”db1”]))
  192. #
  193. # print('v[”dW2”]='+str(v[”dW2”]))
  194. # print('v[”db2”]='+str(v[”db2”]))
  195. #Adam算法
  196. def initialize_adam(parameters):
  197.     ”””
  198.     初始化v和s,它们都是字典类型的变量,都包含了以下字段
  199.     -keys:”dW1”,”db1“,...,”dWL”,”dbL”
  200.     :param paramters: 包含了以下参数的字典变量
  201.        :parameter[”W”+str(l)]=Wl
  202.         :parameter[”b”+str(l)]=bl
  203.     :return:
  204.     v -包含梯度的指数加权平均值,字段如下
  205.      V[”dW”+str(l)]=
  206.      v[”db”+str(l)]=
  207.     s- 包含平方梯度的指数加权平均值,字段如下
  208.        s[”dW”+str(l)]=
  209.        s[”db”+str(l)]=
  210.     ”””
  211.     L=len(parameters)//2
  212.     v={}
  213.     s={}
  214.     for l in  range(L):
  215.         v[”dW”+str(l+1)]=np.zeros_like(parameters[”W”+str(l+1)])
  216.         v[”db” + str(l + 1)] = np.zeros_like(parameters[”b” + str(l + 1)])
  217.         s[”dW” + str(l + 1)] = np.zeros_like(parameters[”W” + str(l + 1)])
  218.         s[”db” + str(l + 1)] = np.zeros_like(parameters[”b” + str(l + 1)])
  219.     return (v,s)
  220. # print(”--------------------------测试initalize_adam-----------------------------------”)
  221. # parameters=testCase.initialize_adam_test_case()
  222. # v,s=initialize_adam(parameters)
  223. # print('v[”dW1”]='+str(v[”dW1”]))
  224. # print('v[”db1”]='+str(v[”db1”]))
  225. # print('v[”dW2”]='+str(v[”dW2”]))
  226. # print('v[”db2”]='+str(v[”db2”]))
  227. #
  228. # print('s[”dW1”]='+str(s[”dW1”]))
  229. # print('s[”db1”]='+str(s[”db1”]))
  230. # print('s[”dW2”]='+str(s[”dW2”]))
  231. # print('s[”db2”]='+str(s[”db2”]))
  232. def upadate_parameters_with_adam(parameters,grads,v,s,t,learning_rate=0.01,beta1=0.9,beta2=0.999,epsilon=1e-8):
  233.     ”””
  234.     使用Adam更新参数
  235.     :param parameters:
  236.           :parameter['W'+str(l)]=Wl
  237.           :parameter['B'+str(l)]=b1
  238.     :param grads: 包含了梯度值的字典,有以下key值
  239.           grads['dW'+str(l)]=dW1
  240.           grads['db'+str(l)]=db1
  241.     :param v: Adam变量,第一个梯度的移动平均值,是一个字典类型的变量
  242.     :param s: Adam变量,平方梯度的移动平均值,是一个字典类型的变量
  243.     :param t: 当前迭代的次数
  244.     :param learning_rate: 学习率
  245.     :param beta1: 动量,超参数,用于第一阶段,使用的曲线Y值不从0开始
  246.     :param beta2: RMSprop的一个参数,超参数
  247.     :param epsilon: 防止除0操作(分母为0)
  248.     :return:
  249.     :parameters-更新后的参数
  250.     v 第一个梯度的移动平均值,是一个字典类型的变量
  251.     s 平均梯度的移动平均值,是一个字典类型的变量
  252.     ”””
  253.     L=len(parameters)//2
  254.     v_corrected={}
  255.     s_corrected={}
  256.     for l in range(L):
  257.         #梯度的移动平均值,输入v,grads,beta1,输出:”V“
  258.         v[”dW” + str(l+1)]=beta1 * v[”dW”+ str(l+1)]+(1-beta1)* grads[”dW”+str(l+1)]
  259.         v[”db”+str(l+1)] = beta1 * v[”db”+str(l+1)] +(1-beta1)*grads[”db”+str(l + 1)]
  260.         #计算第一阶段的偏差修成后的估计值,输入”v,beta1,t”,输出:”v_corrected”
  261.         v_corrected[”dW”+str(l+1)]=v[”dW”+str(l+1)]/(1-np.power(beta1,t))
  262.         v_corrected[”db” + str(l + 1)] = v[”db” + str(l + 1)] / (1 - np.power(beta1, t))
  263.         #计算平方梯度的移动平均值,输入:”s,grads,beta2“,输出”s“
  264.         s[”dW”+str(l+1)]=beta2*s[”dW”+str(l+1)]+(1-beta2)*np.square(grads[”dW”+str(l+1)])
  265.         s[”db” + str(l + 1)] = beta2 * s[”db” + str(l + 1)] + (1 - beta2) * np.square(grads[”db” + str(l + 1)])
  266.         #计算第二极端的偏差修正后的估计值,输入:”s,grads,beta2,t”,输出s_corrected
  267.         s_corrected[”dW”+str(l+1)]=s[”dW”+str(l+1)]/(1-np.power(beta2,t))
  268.         s_corrected[”db” + str(l + 1)] = s[”db” + str(l + 1)] / (1 - np.power(beta2, t))
  269.         #更新参数,输入”parameters,learning_rate,v_corrected,s_corrected,eplsion”,输出“parameters”
  270.         parameters[”W”+str(l+1)]=parameters[”W”+str(l+1)]-learning_rate*(v_corrected[”dW”+str(l+1)]/np.sqrt(s_corrected[”dW”+str(l+1)]+epsilon))
  271.         parameters[”W” + str(l + 1)] = parameters[”W” + str(l + 1)] - learning_rate * (
  272.                     v_corrected[”dW” + str(l + 1)] / np.sqrt(s_corrected[”dW” + str(l + 1)] + epsilon))
  273.     return (parameters,v,s)
  274. # #测试一下
  275. # print(”---------------------------------------测试update_with_parameters_with_adam----------------------------------------”)
  276. # parameters,grads,v,s=testCase.update_parameters_with_adam_test_case()
  277. # upadate_parameters_with_adam(parameters,grads,v,s,t=2)
  278. # print(”W1=”+str(parameters[”W1”]))
  279. # print(”b1=”+str(parameters[”b1”]))
  280. #
  281. # print(”W2=”+str(parameters[”W2”]))
  282. # print(”b2=”+str(parameters[”b2”]))
  283. #
  284. # print('v[”dW1”]='+str(v[”dW1”]))
  285. # print('v[”db1”]='+str(v[”db1”]))
  286. # print('v[”dW2”]='+str(v[”dW2”]))
  287. # print('v[”db2”]='+str(v[”db2”]))
  288. #
  289. # print('s[”dW1”]='+str(s[”dW1”]))
  290. # print('s[”db1”]='+str(s[”db1”]))
  291. # print('s[”dW2”]='+str(s[”dW2”]))
  292. # print('s[”db2”]='+str(s[”db2”]))
  293. #
  294. 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,num_epochs=10000,print_cost=True,is_plot=True):
  295.     ”””
  296.     可以运行在分歧优化器模式下的3层神经网络
  297.     参数
  298.     :param X: 输入数据,维度为(2,输入的数据集里面样本数量)
  299.     :param Y: 与X对应的标签
  300.     :param layers_dims: 包含层数和节点数量的列表
  301.     :param optimizer: 字符串类型的参数,用于选择优化类型,[”gd”|”momentum”|”adam”]
  302.     :param learning_rate: 学习率
  303.     :param mini_batch_size: 每个小批量数据集的大小
  304.     :param beta: 用于动量优化的一个超参数
  305.     :param beta1: 用于计算梯度后的指数衰减的估计的超参数
  306.     :param beta2: 用于计算梯度后的指数衰减的估计的超参数
  307.     :param epsilon: 用于Adam中避免除0的超参数,一般不更改
  308.     :param num_epochs:整个训练集的遍历次数
  309.     :param print_cost:是否打印误差值,每遍历1000次数据集打印一次,但是每100次记录一个误差值,又称每1000次代打印一次
  310.     :param is_plot:是否绘制出曲线图
  311.     :return:
  312.     :parameters -包含了学习后的参数
  313.     ”””
  314.     L=len(layers_dims)
  315.     costs=[]
  316.     t=0 #每学习完一个mini_batch就增加1
  317.     seed=10 #随机种子
  318.     #初始化参数
  319.     parameters=opt_utils.initialize_parameters(layers_dims)
  320.     #选择优化器
  321.     if optimizer=='gd':
  322.         pass
  323.     elif optimizer==”momentum”:
  324.         v=initialze_velocity(parameters) #使用动量
  325.     elif optimizer ==”adam”:
  326.         v,s=initialize_adam(parameters) #使用Adam优化
  327.     else:
  328.         print(”optimizer 参数错误,法式退出”)
  329.         exit(1)
  330.     #开始学习
  331.     for i in range(num_epochs):
  332.         #定义随机minibatches,我们在每次遍历数据集之后增加种子以从头摆列数据集
  333.         seed=seed+1
  334.         minibatches=random_mini_batches(X,Y,mini_batch_size,seed)
  335.         for minibatch in minibatches:
  336.             #选择一个minibatch
  337.             (minibatch_X,minibatch_Y)=minibatch
  338.             #前向传布
  339.             A3,cache=opt_utils.forward_propagation(minibatch_X,parameters)
  340.             #计算误差
  341.             cost=opt_utils.compute_cost(A3,minibatch_Y)
  342.             #反向传布
  343.             grads=opt_utils.backward_propagation(minibatch_X,minibatch_Y,cache)
  344.             #更新参数
  345.             if optimizer ==”gd”:
  346.                 parameters=update_parameters_with_gd(parameters,grads,learning_rate)
  347.             elif optimizer==”momentum”:
  348.                 parameters,v=update_parameters_with_momentun(parameters,grads,v,beta,learning_rate)
  349.             elif optimizer==”adam”:
  350.                 t=t+1
  351.                 parameters,v,s=upadate_parameters_with_adam(parameters,grads,v,s,t,learning_rate,beta1,beta2,epsilon)
  352.             #记录误差值
  353.         if i % 100 == 0:
  354.             costs.append(cost)
  355.             #是否打印误差值
  356.         if print_cost and i % 1000 == 0:
  357.             # print(i)
  358.             print(”第”+str(i)+”次遍历整个数据集,当前误差值:”+str(cost))
  359.             #是否绘制曲线图
  360.     if is_plot:
  361.         plt.plot(costs)
  362.         plt.ylabel('cost')
  363.         plt.xlabel('epochs(per 100)')
  364.         plt.title(”Learning rate=”+str(learning_rate))
  365.         plt.show()
  366.     return parameters
  367. train_X,train_Y=opt_utils.load_dataset(is_plot=False)
  368. #梯度下降测试
  369. # layers_dims=[train_X.shape[0],5,2,1]
  370. # parameters=model(train_X,train_Y,layers_dims,optimizer=”gd”,is_plot=True)
  371. # #
  372. # #我们来绘制分类情况
  373. # #预测
  374. # predictions=opt_utils.predict(train_X,train_Y,parameters)
  375. # # print(predictions)
  376. # plt.title(”Model with Gradient Decent optimization”)
  377. # axes=plt.gca()
  378. # axes.set_xlim([-1.5,2.5])
  379. # axes.set_ylim([-1,1.5])
  380. # opt_utils.plot_decision_boundary(lambda x:opt_utils.predict_dec(parameters,x.T),train_X,train_Y)
  381. #使用动量梯度下降
  382. # layers_dims=[train_X.shape[0],5,2,1]
  383. # parameters=model(train_X,train_Y,layers_dims,optimizer=”momentum”,is_plot=True)
  384. #
  385. # #我们来绘制分类情况
  386. #预测
  387. # predictions=opt_utils.predict(train_X,train_Y,parameters)
  388. # # print(predictions)
  389. # plt.title(”Model with Gradient Decent optimization”)
  390. # axes=plt.gca()
  391. # axes.set_xlim([-1.5,2.5])
  392. # axes.set_ylim([-1,1.5])
  393. # opt_utils.plot_decision_boundary(lambda x:opt_utils.predict_dec(parameters,x.T),train_X,train_Y)
  394. #Adam优化后的梯度下降
  395. layers_dims=[train_X.shape[0],5,2,1]
  396. parameters=model(train_X,train_Y,layers_dims,optimizer=”adam”,is_plot=True)
复制代码
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-8 09:32 , Processed in 0.121527 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表