本文主要介绍随机梯度下降SGD在python中的实现。本文中的示例代码非常详细,具有一定的参考价值。感兴趣的朋友可以参考一下。
利用神经网络进行样本训练,需要实现随机梯度下降算法。在此,根据小麦所彭亮老师给出的解释,我总结如下(神经网络的结构已在另一篇博客中定义):
def SGD(self,training_data,epochs,mini_batch_size,eta,test_data=None):
如果测试数据:
N_test=len(test_data)#有多少个测试集?
n=len(training_data)
对于xrange中的j(历元):
random.shuffle(训练数据)
mini_batches=[
training _ data[k:k mini _ batch _ size]
对于xrange(0,n,mini_batch_size)中的k]
对于迷你批处理中的迷你批处理:
self . update _ mini _ batch(mini _ batch,eta)
如果测试数据:
打印“纪元{0}: {1}/{2}”。格式(j,自我评估(测试数据),n _测试)
否则:
打印“纪元{0}完成”。格式(j)
Training_data是训练集,由很多元组组成。每个元组(x,y)代表一个实例,x是图像的矢量表示,y是图像的类别。
时代意味着多少轮训练。
Mini_batch_size表示每个培训会话中的实例数量。
Eta表示学习速度。
Test_data表示测试集。
更重要的函数是self.update_mini_batch,这是更新权重和偏移量的关键函数。接下来,定义这个函数。
def update_mini_batch(self,mini_batch,eta):
nab la _ b=[自偏差中b的NP . zeros(b . shape)]
nab la _ w=[自重中w的NP . zeros(w . shape)]
对于mini_batch中的x,y:
Delta _ nabla _ b,delta _ nable _ w=self。Backprop (x,y) #目标函数对b和w的偏导数
nabla_b=[nb dnb for nb,dnb in zip(nabla_b,delta_nabla_b)]
Nabla _ w=[nwdnw for nw,dnw in zip (nabla _ w,delta _ nabla _ w)] #累加b和w
#最终更新权重为
self . weights=[w-(eta/len(mini _ batch))* NW for w,nw in zip(self.weights,nabla_w)]
self . baises=[b-(eta/len(mini _ batch))* nb for b,nb in zip(self.baises,nabla_b)]
这个update_mini_batch函数根据你传入的一些数据来更新神经网络的权值和偏置。
这就是本文的全部内容。希望对大家的学习有帮助,支持我们。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。