手写数字识别的神经网络 2层神经网络的类 代码详解
源代码和图解来自鱼书
目录
2层神经网络的类
源代码:
详解:
1. 类的初始化 (__init__)
2. 前向传播 (predict)
3. 损失函数 (loss)
4. 准确率计算 (accuracy)
5. 数值梯度计算 (numerical_gradient)
6. 反向传播计算梯度 (gradient)
总结:
2层神经网络的类
源代码:
# coding: utf-8
import sys, os
sys.path.append(os.pardir) # 为了导入父目录的文件而进行的设定
from common.functions import *
from common.gradient import numerical_gradientclass 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)def predict(self, x):W1, W2 = self.params['W1'], self.params['W2']b1, b2 = self.params['b1'], self.params['b2']a1 = np.dot(x, W1) + b1z1 = sigmoid(a1)a2 = np.dot(z1, W2) + b2y = softmax(a2)return y# x:输入数据, t:监督数据def loss(self, x, t):y = self.predict(x)return cross_entropy_error(y, t)def accuracy(self, x, t):y = self.predict(x)y = np.argmax(y, axis=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 gradsdef gradient(self, x, t):W1, W2 = self.params['W1'], self.params['W2']b1, b2 = self.params['b1'], self.params['b2']grads = {}batch_num = x.shape[0]# forwarda1 = np.dot(x, W1) + b1z1 = sigmoid(a1)a2 = np.dot(z1, W2) + b2y = softmax(a2)# backwarddy = (y - t) / batch_numgrads['W2'] = np.dot(z1.T, dy)grads['b2'] = np.sum(dy, axis=0)da1 = np.dot(dy, W2.T)dz1 = sigmoid_grad(a1) * da1grads['W1'] = np.dot(x.T, dz1)grads['b1'] = np.sum(dz1, axis=0)return grads

详解:
这段代码实现了一个两层神经网络 TwoLayerNet,并包含了前向传播、损失计算、准确率计算、梯度计算等功能。我们逐步解释每个部分:
1. 类的初始化 (__init__)
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)
input_size、hidden_size和output_size分别是输入层、隐藏层和输出层的神经元数目。- 权重
W1和W2是从正态分布中随机初始化的(通过np.random.randn),偏置b1和b2被初始化为零。 weight_init_std是一个可选的参数,用于控制权重的初始化标准差。
2. 前向传播 (predict)
def predict(self, x):W1, W2 = self.params['W1'], self.params['W2']b1, b2 = self.params['b1'], self.params['b2']a1 = np.dot(x, W1) + b1z1 = sigmoid(a1)a2 = np.dot(z1, W2) + b2y = softmax(a2)return y
- 通过
x(输入数据),计算网络的输出:a1 = np.dot(x, W1) + b1:将输入数据与第一个权重矩阵相乘并加上偏置。z1 = sigmoid(a1):对a1进行 Sigmoid 激活。a2 = np.dot(z1, W2) + b2:将隐藏层的输出z1乘以第二层的权重矩阵并加上偏置。y = softmax(a2):对第二层的结果应用 Softmax 激活,得到最终的输出概率分布。
3. 损失函数 (loss)
def loss(self, x, t):y = self.predict(x)return cross_entropy_error(y, t)
- 使用
predict方法计算网络的输出y,然后计算输出与真实标签t之间的交叉熵损失。交叉熵损失用于评估模型预测的概率分布与实际标签之间的差异。
4. 准确率计算 (accuracy)
def accuracy(self, x, t):y = self.predict(x)y = np.argmax(y, axis=1)t = np.argmax(t, axis=1)accuracy = np.sum(y == t) / float(x.shape[0])return accuracy
y = np.argmax(y, axis=1):将每个样本的输出概率向量转化为类别标签(选择概率最大的位置作为预测类别)。t = np.argmax(t, axis=1):将真实标签t也转化为类别标签。- 计算预测正确的样本比例,即准确率。
5. 数值梯度计算 (numerical_gradient)
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
- 通过数值梯度法(
numerical_gradient)计算各个参数(权重和偏置)的梯度。 loss_W是由lambda定义的一个匿名函数,计算在给定输入x和标签t下,损失函数的值。numerical_gradient用于计算每个参数的梯度,返回一个字典grads,包含了所有权重和偏置的梯度。在反向传播过程中,numerical_gradient(loss_W, self.params['W1'])会通过数值方法(有限差分法)计算出loss(W)对W1的梯度。
6. 反向传播计算梯度 (gradient)
def gradient(self, x, t):W1, W2 = self.params['W1'], self.params['W2']b1, b2 = self.params['b1'], self.params['b2']grads = {}batch_num = x.shape[0]# forwarda1 = np.dot(x, W1) + b1z1 = sigmoid(a1)a2 = np.dot(z1, W2) + b2y = softmax(a2)# backwarddy = (y - t) / batch_numgrads['W2'] = np.dot(z1.T, dy)grads['b2'] = np.sum(dy, axis=0)da1 = np.dot(dy, W2.T)dz1 = sigmoid_grad(a1) * da1grads['W1'] = np.dot(x.T, dz1)grads['b1'] = np.sum(dz1, axis=0)return grads
- 前向传播:
predict函数中计算出神经网络的输出y的步骤。 - 反向传播:
- 计算损失对输出层的梯度:
dy = (y - t) / batch_num,这是 Softmax 层和交叉熵损失的导数。 - 更新
W2和b2:通过矩阵乘法np.dot(z1.T, dy)计算梯度。 - 计算隐藏层的梯度:
da1 = np.dot(dy, W2.T),然后通过sigmoid_grad对a1的梯度进行修正。 - 更新
W1和b1:使用反向传播的链式法则进行计算。
- 计算损失对输出层的梯度:
总结:
- 前向传播 计算神经网络的输出。
- 损失函数 计算网络预测与实际标签之间的误差。
- 准确率 计算模型的预测准确性。
- 数值梯度 通过数值方法估算参数的梯度。
- 反向传播 计算每一层的梯度,利用链式法则更新权重和偏置。
相关文章:
手写数字识别的神经网络 2层神经网络的类 代码详解
源代码和图解来自鱼书 目录 2层神经网络的类 源代码: 详解: 1. 类的初始化 (__init__) 2. 前向传播 (predict) 3. 损失函数 (loss) 4. 准确率计算 (accuracy) 5. 数值梯度计算 (numerical_gradient) 6. 反向传播计算梯度 (gradient) 总结&#…...
【项目】基于STM32F103C8T6的四足爬行机器人设计与实现(源码工程)
👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。 【项目】基于STM32F103C8T6的四足爬行机器人设计与…...
[代码调试]安装Text2Image(stable diffusion)模型环境的踩坑记录
文章目录 一、xFormers版本问题1、先确认下自己torch版本所对应的cuda版本2.安装对应版本(1) 到对应官网下载包本地安装(2)代码安装 二、attn_mask尺寸错误三、diffusers四、Huggingface 配置基于stable diffusion预训练模型的环境,记录踩坑记录 一、xFormers版本问…...
使用DeepSeek+本地知识库,尝试从0到1搭建高度定制化工作流(自动化篇)
7.5. 配图生成 目的:由于小红书发布文章要求图文格式,因此在生成文案的基础上,我们还需要生成图文搭配文案进行发布。 原实现思路: 起初我打算使用deepseek的文生图模型Janus进行本地部署生成,参考博客:De…...
理解三种哈希算法:MD5、CRC、SHA256
0、背景 哈希算法是一类重要的算法,用于将任意长度的数据映射为固定长度的哈希值。哈希算法广泛应用于数据完整性校验、密码学、数字签名等领域。本文将详细介绍三种常见的哈希算法:MD5、CRC 和 SHA256,并探讨它们的原理、特点及应用场景。 …...
机器学习基本篇
文章目录 1 基本概念2 基本流程2.0 数据获取2.1 预处理2.1.0 认识数据认识问题2.1.1 不平衡标签的处理a.随机过采样方法 ROS,random over-samplingb. SMOTE synthetic minority Over-Sampling Technique2.2 缺失值处理2.3 数据清洗2.3.0离散特征编码2.3.1 连续特征处理归一化标…...
#渗透测试#批量漏洞挖掘#Apache Log4j反序列化命令执行漏洞
免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 目录 Apache Log4j反序列化命令执行漏洞 一、…...
python常用库整理
Python常用库众多,涵盖了数据分析、科学计算、机器学习、Web开发、游戏开发、自然语言处理、图像处理、自动化测试等多个领域。以下是一些常用的Python库及其主要用途: 数据分析与科学计算 NumPy:用于科学计算的基础库,支持大型…...
SQL数据处理函数全解析
1. 引言 1.1 SQL简介 SQL(Structured Query Language)是用于管理和操作关系型数据库的标准语言。它允许用户查询、插入、更新和删除数据库中的数据。SQL的强大之处在于其内置的函数库,这些函数可以帮助我们更高效地处理数据。 1.2 数据处理函数的重要性 数据处理函数在S…...
Python解决“反应物浓度”问题
Python解决“反应物浓度”问题 问题描述测试样例解题思路代码 问题描述 在一个神秘的实验室里,科学家小Z正在研究一种特殊的化学反应。她有一个名为 reactant 的初始物质,其起始值为 0。为了推动实验进展,小Z设计了一系列操作,这…...
HTTP FTP SMTP TELNET 应用协议
1. 标准和非标准的应用协议 标准应用协议: 由标准化组织(如 IETF,Internet Engineering Task Force)制定和维护,具有广泛的通用性和互操作性。这些协议遵循严格的规范和标准,不同的实现之间可以很好地进行…...
百度搜索全面接入DeepSeek-R1满血版:AI与搜索的全新融合
不等了,就是现在!百度搜索全量接入DeepSeek-R1满血版 百度搜索已正式全量接入DeepSeek-R1满血版,在宣布“将接入”仅过了24小时后。 就在宣布“将接入”仅24小时后,百度搜索 已正式全量接入 DeepSeek-R1满血版!得益于…...
《DeepSeek技术:开启工业互联网低成本开发新时代》
在工业互联网蓬勃发展的当下,企业数字化转型的需求日益迫切。然而,高昂的应用开发成本却如同拦路虎,阻碍着众多企业的前进步伐。此时,DeepSeek技术的出现,为工业互联网应用开发带来了新曙光,凭借其独特优势…...
深入浅出TypedArray:网络数据处理、WebGPU与加密实战
JavaScript的TypedArray是现代Web开发中处理二进制数据的利器。本文将结合网络数据传输、WebGPU编程和简单加密算法三个实战场景,带你领略TypedArray的强大能力。 一、TypedArray基础认知 TypedArray家族包括Int8Array、Uint16Array、Float32Array等11种视图类型&a…...
nordic(nrf52832、nrf52840)如何使用SES(SEGGER Embedded Studio)编辑编译工程?
nordic官方例程中一般都会给出好几个不同的编译环境供用户选择,一般是 keil工程、armgcc工程、IAR工程、ses工程等。 一、segger embedded studio如何添加工程.h头文件? 1)首先打开options 2)下拉选中common 3)找到common下的Pre…...
LabVIEW利用CANopen的Batch SDO写入
本示例展示了如何通过CANopen协议向设备写入Batch SDO(批量服务数据对象)。Batch SDO允许用户在一次操作中配置多个参数,适用于设备的批量配置和参数设置。此方法能够简化多个参数的写入过程,提高设备管理效率。 主要步骤…...
P11071 「QMSOI R1」 Distorted Fate Solution
Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1,a2,⋯,an),有 m m m 个操作分两种: modify ( l , r , x ) \operatorname{modify}(l,r,x) modify(l,r,x):对每个 i ∈ [ l , r ] i \in [l,r] i∈…...
WebSocket在分布式环境中的局限性及解决方案
WebSocket 在分布式环境中存在一些局限性,特别是当系统需要扩展多个服务实例时,单个 WebSocket 连接的管理和消息推送就变得比较复杂。因此,必须采取一些额外的措施来确保 WebSocket 能在多个服务实例之间正确工作。 WebSocket 在分布式环境…...
Flutter 跳转后不允许返回
如果在 Flutter 中使用 Navigator.pushNamed(context, /),默认情况下它会将新的页面压入栈中,这样用户可以按返回键返回上一页。但如果你不想让用户返回,而是直接跳转到 / 并清除导航栈,可以使用 pushReplacementNamed 或 pushNam…...
spconv 安装测试
pip install spconv 报错: File "/usr/local/lib/python3.10/dist-packages/torch/nn/modules/module.py", line 1736, in _wrapped_call_impl return self._call_impl(*args, **kwargs) File "/usr/local/lib/python3.10/dist-packages/torch/nn/modules/mod…...
关于es6-module的语法
ES6(ECMAScript 2015)引入了模块化的概念,旨在使 JavaScript 更加模块化、可维护和可重用。ES6 模块允许我们在不同的文件中组织和管理代码,使得不同模块之间的依赖关系更加清晰。 1. 导出(Export) 1.1 命…...
python旅游推荐系统+爬虫+可视化(协同过滤算法)
✅️基于用户的协同过滤算法 ✅️有后台管理 ✅️2w多数据集 这个旅游数据分析推荐系统采用了Python语言、Django框架、MySQL数据库、requests库进行网络爬虫开发、机器学习中的协同过滤算法、ECharts数据可视化技术,以实现从网站抓取旅游数据、个性化推荐和直观展…...
【弹性计算】IaaS 和 PaaS 类计算产品
《弹性计算产品》系列,共包含以下文章: 云服务器:实例、存储、网络、镜像、快照容器、裸金属云上运维IaaS 和 PaaS 类计算产品 😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀…...
视频转序列帧
视频转序列帧 介绍操作总结 介绍 这篇文章不是单独讲视频转序列帧所有的方法,这里是针对我后面要做序列帧动画优化的一个工具篇幅。这里我用的premiere Pro 2020下面会讲方法简称pr。 操作 打开pr点击新建项目 输入名称点击确认 将需要转换的视频导入到媒体浏览…...
大模型应用怎么学习,在哪里实现开发:Dify、AnyThingLLM、LangFlow
大模型应用怎么学习,在哪里实现开发 目录 大模型应用怎么学习,在哪里实现开发Dify、AnyThingLLM、LangFlow的官网地址及使用方法DifyAnyThingLLMLangFlowDify、AnyThingLLM、LangFlow是什么怎么使用DifyAnyThingLLMLangFlowDify、AnyThingLLM、LangFlow名字的含义Dify、AnyTh…...
LLM有哪些可控超参数
LLM有哪些可控超参数 目录 LLM有哪些可控超参数生成控制类采样相关类推理优化类惩罚类其他类计算资源与批量处理类上下文与Token相关类内存相关类生成控制类 以流式返回对话响应:指模型在生成回复时,是否以逐字或逐句的流式方式返回给用户,而不是等全部生成完再返回,能提升…...
C++共享指针实战
需求: 有三个类,分别是A,B, R。在B类里new 了一个R的智能指针, 这个R的生命周期和B相同。同时A类也存了一个B中存放关于R的智能指针。B销毁同时A指向R的指针也失效,并调用R的析构函数,如何实现 #include <iostream…...
算法分析—— 《归并排序》
《排序数组》 题目描述: 给你一个整数数组 nums,请你将该数组升序排列。 你必须在 不使用任何内置函数 的情况下解决问题,时间复杂度为 O(nlog(n)),并且空间复杂度尽可能小。 示例 1: 输入:nums [5,2…...
SpringBoot启动时报错:cannot use an unresolved DNS server address: I:53
报错如下: 2025-02-17 13:59:41.374 [main] ERROR org.springframework.boot.SpringApplication:835 - Application run failed org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name mySwaggerResourceProvider def…...
AI进展不止于基准:深度解析Grok 3的局限
基准测试长期以来一直是AI评估的基石,但任何认真的AI科学家都知道它们是可以被“游戏化”的。 我曾经详细写过这个问题,甚至LMsys也不得不调整其盲测格式——将Grok 3用不同的标签代替,而不仅仅是隐藏品牌——以减少品牌偏见。 高能力AI,尤其是像GPT-4级别的模型,或那些依…...
