深度学习14:反向传播5:神经网络实现(反向传播)

发布时间:2026/10/26 18:11:31
深度学习14:反向传播5:神经网络实现(反向传播) 目录标题一、代码实现(基于之前封装好的算法和代码)二、测试代码(反向传播找最后参数贼快)差分数值梯度下降 blog: 深度学习9:神经网络学习6:神经网络类实现和使用核心就是使用误差的反向传播法来计算梯度而不是使用差分数值计算这将大大提升学习的效率一、代码实现(基于之前封装好的算法和代码)对于二层网络 TwoLayerNet隐藏层由一个 Affine 层和一个 ReLU 层组成输出层则由一个 Affine 层和一个 Softmax-with-Loss 层组成引入sigmoid在blog: 深度学习1:基本概念感知机激活函数(阶跃sigmoid,Tanh函数)引入softmax在blog: 深度学习2:激活函数ReLU,softmax和恒等函数及激活函数的最终选择引入交叉熵在 blog 深度学习4:神经网络学习1:损失函数,交叉熵误差引用梯度方法在blog: 深度学习5:神经网络学习2:数值微分偏导梯度引用关于层的引入: 深度学习11:反向传播2:激活层的反向传播和实现ReLU和Sigmoid深度学习12:反向传播3:仿射层实现(Affine)引入输出层: 深度学习13:反向传播4:输出层Softmax-with-Lossimportnumpyasnpfromcommon.functionsimportsoftmax,sigmoid,cross_entropyfromcommon.gradientimportnumerical_gradientfromcommon.layersimport*# 引入神经网络的层fromcollectionsimportOrderedDict# 有序字典用来保存结构classTwoLayerNet:# 初始化def__init__(self,input_size,hidden_size,output_size,weight_init_std0.01):self.params{}self.params[W1]weight_init_std*np.random.randn(input_size,hidden_size)self.params[b1]np.zeros(hidden_size)self.params[W2]weight_init_std*np.random.randn(hidden_size,output_size)self.params[b2]np.zeros(output_size)self.params[b2]np.zeros(output_size)# 定义层结构(forward时候直接遍历整个结构backward也是遍历很方便*)self.layersOrderedDict()self.layers[Affine1]Affine(self.params[W1],self.params[b1])self.layers[ReLU1]Relu()self.layers[Affine2]Affine(self.params[W2],self.params[b2])# 单独定义最后一层SoftmaxWithLossself.lastLayerSoftmaxWithLoss()# 前向传播预测defforward(self,X):# 对于神经网络中的每一层依次调用forward方法# 不需要最后一层lastLayer这算出损失值了forlayerinself.layers.values():Xlayer.forward(X)returnX# 计算损失defloss(self,x,t):yself.forward(x)loss_valueself.lastLayer.forward(y,t)returnloss_value# 计算准确度defaccuracy(self,x,t):y_predself.forward(x)# 预测分类数值# 根据最大概率得到预测的分类号ynp.argmax(y_pred,axis1)# 与正确解标签对比得到准确率accuracynp.sum(yt)/x.shape[0]returnaccuracy# 计算梯度使用数值微分方法defnumerical_gradient(self,x,t):# 定义目标函数loss_flambdaw:self.loss(x,t)# 对每个参数使用数值微分方法计算梯度grads{}# 数值微分每一次权重更新grads[W1]numerical_gradient(loss_f,self.params[W1])grads[b1]numerical_gradient(loss_f,self.params[b1])grads[W2]numerical_gradient(loss_f,self.params[W2])grads[b2]numerical_gradient(loss_f,self.params[b2])returngrads# 计算梯度使用反向传播法(一次前向一次反向就算出梯度)defgradient(self,x,t):# 前向传播直到计算损失(算出反向)#参考blog 知道执行一次前向传播的目的: 深度学习10-反向传播插曲疑问:为啥先执行一次前向传播# 在仿射层对输入数据X做保存方便反向传播计算梯度存到各自仿射层的实例属性中了self.loss(x,t)# 反向传播dy1dyself.lastLayer.backward(dy)# 将神经网络中的所有层翻转处理layerslist(self.layers.values())layers.reverse()#这个list反转是原地反转forlayerinlayers:dylayer.backward(dy)# 提取各层参数的梯度(反向传播时候每层的梯度都保存在各自实例的属性中了可以直接拿到了)grads{}grads[W1],grads[b1]self.layers[Affine1].dW,self.layers[Affine1].db grads[W2],grads[b2]self.layers[Affine2].dW,self.layers[Affine2].dbreturngrads二、测试代码(反向传播找最后参数贼快)importnumpyasnpimportmatplotlib.pyplotaspltfromcommon.load_dataimportget_datafromtwo_layer_netimportTwoLayerNet# 1.加载数据x_train,x_test,t_train,t_testget_data()#2.创建模型networkTwoLayerNet(input_size784,hidden_size50,output_size10)# 整个数据集29400,每个100数据作为小批次训练量# 3.设置超参数learning_rate0.1batch_size100num_epochs10# 就是29400整个数据集重复训练10次train_sizex_train.shape[0]iter_per_epochnp.ceil(train_size/batch_size)#294次iters_numint(num_epochs*iter_per_epoch)# 总循环小批次 294*10#设置一些容器存储数据train_loss_list[]train_acc_list[]test_acc_list[]# 4.循环迭代,用梯度下降法训练模型foriinrange(iters_num):# 4.1 随机选取批量数据batch_masknp.random.choice(train_size,batch_size)x_batchx_train[batch_mask]t_batcht_train[batch_mask]# 4.2计算梯度# grad network.numerical_gradient(x_batch, t_batch)gradnetwork.gradient(x_batch,t_batch)# 4.3更新参数forkeyin(W1,W2,b1,b2):network.params[key]-learning_rate*grad[key]# 4.4 计算并保存当前的训练损失lossnetwork.loss(x_batch,t_batch)train_loss_list.append(loss)# 4.5 每完成一个epoch的迭代就计算并保存训练和测试准确率ifi%iter_per_epoch0:train_accnetwork.accuracy(x_train,t_train)test_accnetwork.accuracy(x_test,t_test)train_acc_list.append(train_acc)test_acc_list.append(test_acc)print(Epoch: {}, Loss: {}, Train Acc: {}, Test Acc: {}.format(i//iter_per_epoch1,loss,train_acc,test_acc))# 5. 画图xnp.arange(len(train_acc_list))plt.plot(x,train_acc_list,labelTrain Acc)plt.plot(x,test_acc_list,labelTest Acc,linestyle--)plt.legend(locbest)# plt.show()plt.savefig(gradient_descent_nn_train_bp_result.png)

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询