news 2026/6/10 14:49:18

pytorch深度学习笔记13

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
pytorch深度学习笔记13

目录

摘要

反向传播代码实现


摘要

本篇文章继续学习尚硅谷深度学习教程,学习内容是反向传播代码实现

反向传播代码实现

在之前手写数字识别案例的基础上,对SGD的计算过程进行优化。核心就是使用误差的反向传播法来计算梯度,而不是使用差分数值计算;这将大大提升学习的效率。

对于二层网络TwoLayerNet,隐藏层由一个Affine层和一个ReLU层组成,输出层则由一个Affine层和一个Softmax-with-Loss层组成。由于之前已经实现了各层的类,现在只要用“搭积木”的方式将它们拼接在一起就可以了。

将TwoLayerNet类的代码实现改进如下:

import numpy as np from common.layers import * from common.gradient import numerical_gradient from collections import OrderedDict class TwoLayerNet: def __init__(self, input_size, hidden_size, output_size, weight_init_std = 0.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.layers = OrderedDict() self.layers['Affine1'] = Affine(self.params['W1'], self.params['b1']) self.layers['Relu1'] = Relu() self.layers['Affine2'] = Affine(self.params['W2'], self.params['b2']) self.lastLayer = SoftmaxWithLoss() def predict(self, x): for layer in self.layers.values(): x = layer.forward(x) return x # x:输入数据, t:监督数据 def loss(self, x, t): y = self.predict(x) return self.lastLayer.forward(y, t) def accuracy(self, x, t): y = self.predict(x) y = np.argmax(y, axis=1) if t.ndim != 1 : t = np.argmax(t, axis=1) accuracy = np.sum(y == t) / float(x.shape[0]) return accuracy # x:输入数据, t:监督数据 def numerical_gradient(self, x, t): loss_W = lambda W: self.loss(x, t) grads = {} grads['W1'] = numerical_gradient(loss_W, self.params['W1']) grads['b1'] = numerical_gradient(loss_W, self.params['b1']) grads['W2'] = numerical_gradient(loss_W, self.params['W2']) grads['b2'] = numerical_gradient(loss_W, self.params['b2']) return grads def gradient(self, x, t): # forward self.loss(x, t) # backward dout = 1 dout = self.lastLayer.backward(dout) layers = list(self.layers.values()) layers.reverse() for layer in layers: dout = layer.backward(dout) # 设定 grads = {} grads['W1'], grads['b1'] = self.layers['Affine1'].dW, self.layers['Affine1'].db grads['W2'], grads['b2'] = self.layers['Affine2'].dW, self.layers['Affine2'].db return grads
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 14:34:14

emwin抗锯齿功能底层驱动支持

emWin抗锯齿驱动深度实践:从原理到性能优化的完整指南你有没有遇到过这样的情况?在STM32上跑emWin,画个斜线像“楼梯”,小字体边缘毛刺严重,波形图一动起来就抖——明明代码没错,UI却怎么看怎么别扭。问题很…

作者头像 李华
网站建设 2026/6/10 1:06:52

51单片机串口通信实验:零基础实现数据收发

51单片机串口通信实战:从点亮“Hello World”到全双工收发你有没有过这样的经历?写好一段代码,烧录进单片机,然后……盯着几个LED灯猜:“它到底运行到哪一步了?”没有反馈的开发,就像在黑暗中走…

作者头像 李华
网站建设 2026/6/10 2:01:35

从零实现Keil正确配置toolkit路径

如何一劳永逸解决 Keil 的c9511e编译器路径错误?——深入剖析 ARM 工具链配置的本质你有没有在打开一个旧项目、换了一台新电脑,或者刚装完 Keil 后,点击“编译”按钮却只看到这样一行红字:error: c9511e: unable to determine th…

作者头像 李华
网站建设 2026/6/10 14:33:32

基于STM32CubeMX的PLC开发完整指南

从零构建软PLC:基于STM32CubeMX的工业控制开发实战 你有没有遇到过这样的场景?客户要一个小型自动化控制器,功能不复杂,但商用PLC太贵、体积太大、还不能定制逻辑。这时候,如果能用一颗STM32芯片自己“造”一个PLC&…

作者头像 李华
网站建设 2026/6/9 22:26:47

嵌入式环境下堆溢出导致crash的系统学习

堆溢出为何让嵌入式系统“猝死”?一次 HardFault 背后的真相你有没有遇到过这样的场景:设备在实验室跑得好好的,一到现场却隔三差五重启;调试器抓到的调用栈停在free()里,但代码里明明没写错;翻遍逻辑也找不…

作者头像 李华
网站建设 2026/5/31 11:51:26

强化学习算法

摘要:强化学习算法是一类通过环境交互优化决策的机器学习方法,分为基于模型和无模型两种类型。基于模型算法(如动态规划、蒙特卡洛树搜索)先构建环境模型进行预测,具有较高样本效率但计算复杂;无模型算法&a…

作者头像 李华