深度学习入门(二):从感知机到神经网络
文章目录
- 前言
- 一个神经网络的例子
- 激活函数登场
- 3层神经网络的实现
- 矩阵运算
- 3层神经网络示意图
- 符号定义
- 第一层信号传递
- 第二层信号传递
- 第三层信号传递
- 代码实现
- 实践:手写数字识别
- 参考资料
前言
上一篇文章我们学习了感知机,因为它和神经网络有很多共同点,所以这一篇正式进入神经网络一定也会很顺畅。
一个神经网络的例子
通过下面的神经网络图形,我们学习几个基础的术语:
- 输入层:最左边的一列,每个神经元代表一个输入特征,负责接收外部数据;
- 隐藏层/中间层:中间的一列,负责数据的特征提取、模式识别和非线性变换,它是神经网络能学习复杂关系的关键部分;每个神经元都进行计算,并使用激活函数引入非线性;
- 输出层:最后一列,复杂将隐藏层提取的特征转换为最终的预测结果;
- 神经元层数:下图有3层;
- 权重层数:下图有2层;
- 网络层数:我们用权重层数来表示,因此是2层。

激活函数登场
上面在介绍隐藏层的时候提到了激活函数,下图明确展示了激活函数的计算过程。首先输入通过权重和偏置计算得到 a = w 1 x 1 + w 2 x 2 + b a = w_1x_1+w_2x_2+b a=w1x1+w2x2+b, h h h函数就是激活函数,将 a a a激活转换成 y y y,即 y = h ( x ) y=h(x) y=h(x)。

激活函数的常见形式包括:

图像如下:

一般朴素感知机是指激活函数使用了阶跃函数的模型,而神经网络则是激活函数使用了sigmoid等平滑函数的多层网络。
3层神经网络的实现
矩阵运算
回忆一个矩阵计算的规则:矩阵A的第一维元素个数(列数)必须等于矩阵B的第0维元素的个数(行数)。

实现神经网络时,要特别注意x的维度和w的维度是否一致

3层神经网络示意图

符号定义

第一层信号传递
以 a 1 ( 1 ) a_{1}^{(1)} a1(1)的计算为例:
a 1 ( 1 ) = w 11 ( 1 ) x 1 + w 12 ( 1 ) x 2 + b 1 ( 1 ) a_{1}^{(1)}=w_{11}^{(1)}x_1+w_{12}^{(1)}x_2+b_{1}^{(1)}\\ a1(1)=w11(1)x1+w12(1)x2+b1(1)

用矩阵的运算符号可以将第一层的计算表示为:
A ( 1 ) = X W ( 1 ) + B ( 1 ) A^{(1)}=XW^{(1)}+B^{(1)} A(1)=XW(1)+B(1)
其中:
A ( 1 ) = ( a 1 ( 1 ) , a 2 ( 1 ) , a 3 ( 1 ) ) A^{(1)}=(a_{1}^{(1)}, a_{2}^{(1)}, a_{3}^{(1)}) A(1)=(a1(1),a2(1),a3(1))
X = ( x 1 , x 2 ) X=(x_1, x_2) X=(x1,x2)
W ( 1 ) = ( w 11 ( 1 ) w 21 ( 1 ) w 31 ( 1 ) w 12 ( 1 ) w 22 ( 1 ) w 32 ( 1 ) ) \mathbf{W}^{(1)} = \begin{pmatrix} w_{11}^{(1)} & w_{21}^{(1)} & w_{31}^{(1)} \\ w_{12}^{(1)} & w_{22}^{(1)} & w_{32}^{(1)} \end{pmatrix} \ W(1)=(w11(1)w12(1)w21(1)w22(1)w31(1)w32(1))
激活函数的计算示意图如下:
Z 1 = s i g m o i d ( A 1 ) Z_1 = sigmoid(A_1) Z1=sigmoid(A1)

第二层信号传递

第三层信号传递

代码实现
def sigmoid(x):"""计算输入 x 的 Sigmoid 值。:param x: 标量或 NumPy 数组:return: Sigmoid 变换后的值"""return 1 / (1 + np.exp(-x))def identify_function(x):"""恒等函数"""return xdef init_network():"""initialize weight and biases"""network = {}network['W1'] = np.array([[0.1, 0.3, 0.5],[0.2, 0.4, 0.6])network['b1'] = np.array([0.1, 0.2, 0.3])network['W2'] = np.array([[0.1, 0.4],[0.2, 0.5],[0.3, 0.6])network['b2'] = np.array([0.1, 0.2])network['W3'] = np.array([[0.1, 0.3],[0.2, 0.4])network['b3'] = np.array([0.1, 0.2])returndef forward():"""transfer input to output"""W1, W2, W3 = network['W1'], network['W2'], network['W3']b1, b2, b3 = network['b1'], network['b2'], network['b3']a1 = np.dot(x, W1) + b1z1 = sigmoid(a1)a1 = np.dot(z1, W2) + b2z2 = sigmoid(a2)a3 = np.dot(z2, W3) + b3y = identify_function(a3)return y
实践:手写数字识别
上面我们代码里的forward函数也称为神经网络的推理过程或前向传播。完整的机器学习过程分为学习过程和推理过程两部分,神经网络也是如此。接下来我们假设使用数据学习权重和偏置的过程已经结束,现在只需根据学习到的参数,进行推理。
import sys, os
sys.path.append(os.pardir) # 为了导入父目录中的文件而进行的设定
from dataset.mnist import load_mnistdef get_data():(x_train, t_train), (x_test, t_test) = \load_mnist(normalize=True, flatten=True, one_hot_label=False) # normalize将输入归一到0~1之间的数值return x_test, t_testdef init_network():with open("sample_weight.pkl", 'rb') as f:network = pickle.load(f)return networkdef predict(network, x):W1, W2, W3 = network['W1'], network['W2'], network['W3']b1, b2, b3 = network['b1'], network['b2'], network['b3']a1 = np.dot(x, W1) + b1z1 = sigmoid(a1)a2 = np.dot(z1, W2) + b2z2 = sigmoid(a2)a3 = np.dot(z2, W3) + b3y = softmax(a3)return yx, t = get_data()
network = init_network()accuracy_cnt = 0
for i in range(len(x)):y = predict(network, x[i])p = np.argmax(y) # 获取概率最高的元素的索引if p == t[i]:accuracy_cnt += 1print("Accuracy:" + str(float(accuracy_cnt) / len(x)))
通过上面的代码学习几个术语:
- 正规化:将数据限定到某个范围内的处理;
- 预处理:对神经网络的输入进行某种特定的转换;
- 数据白化:将数据整体的分布形状均匀化;
- 批处理:
上例中,拿到一张图片进行推理时,输入层是784(图像大小28*28)个神经元,输出层是10(数字0-9共10个类别)个神经元,数组形状变化如下:

设想如果我们想一次推理100张图片呢?数组形状变化就会变成下图所示:

这种打包式的输入称为“批”。批处理一次性计算大型数组要比分开逐步计算各个小型数组速度更快。批处理的代码如下:
x, t = get_data()
network = init_network()batch_size = 100 # 批数量
accuracy_cnt = 0for i in range(0, len(x), batch_size):x_batch = x[i:i+batch_size]y_batch = predict(network, x_batch)p = np.argmax(y_batch, axis=1)accuracy_cnt += np.sum(p == t[i:i+batch_size])
参考资料
[1] 斋藤康毅. (2018). 深度学习入门:基于Python的理论与实践. 人民邮电出版社.
相关文章:
深度学习入门(二):从感知机到神经网络
文章目录 前言一个神经网络的例子激活函数登场3层神经网络的实现矩阵运算3层神经网络示意图符号定义第一层信号传递第二层信号传递第三层信号传递 代码实现实践:手写数字识别参考资料 前言 上一篇文章我们学习了感知机,因为它和神经网络有很多共同点&am…...
Sentinel 相关知识点
Sentinel 实现原理? Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护等多个维度来帮助开发者保障微服务的稳定性。以下是 Sentinel 的实现原理: 核心概念 资源&…...
AI三大主义 和 深度学习三大主义
在人工智能(AI)研究领域,"三大主义"通常指三种核心方法论或思想流派,它们代表了不同的技术路径和哲学观点。以下是主流的划分方式: 1. 符号主义(Symbolicism) 核心思想:智…...
探索 Vue 中的多语言切换:<lang-radio /> 组件详解!!!
探索 Vue 中的多语言切换:<lang-radio /> 组件详解 🌍 嗨,大家好!👋 今天我们来聊聊如何在 Vue 项目中实现一个优雅的多语言切换功能——<lang-radio /> 组件。这是一个小而美的组件,出现在登…...
安卓的布局方式
一、RelativeLayout 相对布局 特点:每个组件相对其他的某一个组件进行定位。 (一)主要属性 1、设置和父组件的对齐: alignParentTop : 设置为true,代表和父布局顶部对齐。 其他对齐只需要改变后面的Top为 Left、Right 或者Bottom&…...
Kotlin基础知识学习(五)
Lambda表达式 Lambda表达式是一种简洁的方式来定义匿名函数。Kotlin的Lambda表达式非常灵活,常用于函数式编程、集合操作、高阶函数等场景。 无参数的Lambda表达式 格式:{函数体} 调用:{函数体}() val greet { println("Hello, Kotl…...
搭建私人对外git空间
# 创建用户,指定不可登录的 Shell(git-shell 或 /usr/sbin/nologin) sudo adduser --system --shell /usr/bin/git-shell --group git # 验证用户配置 grep git /etc/passwd # 预期输出:git:x:998:998::/home/git:/usr/bin/git-s…...
5种特效融合愚人节搞怪病毒
内容供学习使用,不得转卖,代码复制后请1小时内删除,此代码会危害计算机安全,谨慎操作 并在虚拟机里运行此代码!,病毒带来后果自负! #include <windows.h> #include <cmath> #include <thread> using namespace std; // 屏幕特效函数声明 void In…...
DeepSeek本地部署(linux)
一、下载并安装Ollama 1.下载Ollama Ollama官网:Ollama 点击"Download",会跳转至下载页面。 1.1在线下载安装 可复制此命令到Linux服务器进行在线下载,如下载速度过慢,可选择离线下载安装。 curl -fsSL https://ollama.com/install.sh | sh1.2离线下载安装 …...
MySQL的基础语法1(增删改查、DDL、DML、DQL和DCL)
目录 一、基本介绍 二、SQL通用语法 三、SQL分类(DDL、DML、DQL、DCL) 1.DDL 1.1数据库操作 1.2表操作 1.2.1表操作-查询创建 1.2.2表操作-数据类型 1)数值类型 2)字符串类型 3)日期时间类型编辑 4)表操作-案例 1.2.3…...
Oracle数据库数据编程SQL<3.3 PL/SQL 游标>
游标(Cursor)是Oracle数据库中用于处理查询结果集的重要机制,它允许开发者逐行处理SQL语句返回的数据。 目录 一、游标基本概念 1. 游标定义 2. 游标分类 二、静态游标 (一)显式游标 【一】不带参数,普通的显示游标 1. 显式…...
畅享电脑流畅运行:深度卸载、智能监视与空间释放
软件介绍 在数字化办公与娱乐高度融合的当下,电脑承载着我们诸多重要任务,然而,随着软件的频繁安装与卸载,系统逐渐被各种顽固软件及其残留 “拖垮”,运行速度变慢、磁盘空间告急等问题接踵而至。别愁,今天…...
R --- Error in library(***) : there is no package called ‘***’ (服务器非root用户)
步骤 步骤一:在自己目录下创建R包安装路径步骤二:配置用户本地的R库路径步骤三:安装缺失的包(在终端)步骤四:验证安装 步骤一:在自己目录下创建R包安装路径 mkdir -p ~/R_libs步骤二࿱…...
Visual Studio Code 无法打开源文件解决方法
🌈 个人主页:Zfox_ 🔥 系列专栏:Linux 🔥 系列专栏:C从入门到精通 目录 一:🔥 突发状况 二:🔥 共勉 一:🔥 突发状况 🐬…...
核函数(机器学习深度学习)
一、核函数的基本概念 核函数(Kernel Function) 是机器学习中处理非线性问题的核心工具,通过隐式映射将数据从原始空间转换到高维特征空间,从而在高维空间中实现线性可分或线性建模。其数学本质是计算两个样本在高维空间中的内积…...
【工具】BioPred一个用于精准医疗中生物标志物分析的 R 软件包
介绍 R 语言包 BioPred 提供了一系列用于精准医疗中的亚组分析和生物标志物分析的工具。它借助极端梯度提升(XGBoost)算法,并结合倾向得分加权和 A 学习方法,帮助优化个体化治疗规则,从而简化亚组识别过程。BioPred 还…...
【银河麒麟系统常识】命令:dotnet --list-sdks(列出已安装的 .NET SDK 版本)
命令: dotnet --list-sdks 功能 列出当前系统中所有已安装的 .NET SDK 版本; 返回值规则 # 1. 格式:<版本号>[<安装路径>]; # 2. 排序:按版本号从低到高排序;示例...
【深度学习】不管理论,入门从手写数字识别开始
1. 环境安装 学习深度学习,开发语言是Python。Python开发工具有很多。其中 anaconda vscode的Python开发环境很好用,建议使用这个组合。 编写手写数字识别测试代码,需要在使用Anaconda安装以下4个库: NumpyScipymatplotlibsci…...
3.使用epoll实现单线程并发服务器
目录 1. epoll的概述 2. 多线程与epoll的处理流程 2.1 多线程处理流程 2.2 epoll处理流程 3. epoll与多线程的比较 4. epoll的操作函数 4.1 epoll_create() 4.2 epoll_ctl() 4.3 epoll_wait() 5. 示例代码 6. epoll的工作模式 7. 使用O_NONBLOCK防止阻塞 8.运行代…...
关于JVM和OS中的栈帧的区别和内存浅析
关于JVM和OS中的栈帧的区别和内存浅析 刚看了黑马JVM中的栈帧的讲解,感觉和自己理解的栈帧有一定出入,查询资料研究了一下发现的确有天壤之别,可惜黑马并没有讲。 故写下这篇文章巩固一下, OS的栈帧: OS的栈帧会在调用一个函…...
拥抱健康生活,开启养生之旅
在快节奏的现代生活中,健康养生愈发重要。它不仅能让我们拥有强健体魄,还能提升生活质量。 均衡饮食是养生的基石。多吃蔬菜和水果,它们富含维生素与膳食纤维。比如西兰花,堪称 “蔬菜皇冠”,不仅含有丰富的维生素 …...
测试用例管理工具
一、免费/开源工具 TestLink 适用场景:传统手工测试团队,需基础用例管理与测试计划跟踪。 关键功能:用例分层管理、执行结果记录、基础报告生成。 局限:界面陈旧,自动化集成需插件支持。 Kiwi TCMS 适用场景࿱…...
visual studio 2017配置QT5.9.4环境
前提是已经安装完毕vs 2017以及QT5.9.4,然后再进行下列的操作 一 环境配置 修改成如下所示,然后关闭vs 打开浏览器,搜索网站download.qt.io 如果2.4.1版本出现问题,可以换版本,如2.3.1,2.7.1都比较稳定 …...
基于EFISH-SBC-RK3576的无人机智能飞控与数据存储方案
一、方案背景 民用无人机在电力巡检、农业植保、应急救援等领域快速普及,但传统方案面临多协议设备兼容性差、野外环境数据易丢失、复杂电磁干扰三大痛点。 电鱼智能推出EFISH-SBC-RK3576,可集成双冗余总线接口与工业级加固存储&#x…...
c++的特性——多态
目录 概念 多态实现条件 虚函数 虚函数的重写/覆盖 练习题 析构函数的重写 override和final关键字 重载/隐藏/重载的区别 纯虚函数和抽象类 多态 虚函数表指针 多态的原理 动态绑定与静态绑定 虚函数表总结 前面学习了C的三个特性中的两个特性,今天我们…...
MySQL基础语法DDLDML
目录 #1.创建和删除数据库 #2.如果有lyt就删除,没有则创建一个新的lyt #3.切换到lyt数据库下 #4.创建数据表并设置列及其属性,name是关键词要用name包围 编辑 #5.删除数据表 #5.查看创建的student表 #6.向student表中添加数据,数据要与列名一一对应 #7.查询studen…...
性能测试理论基础-性能指标及jmeter中的指标
1、什么是性能测试 通过一定的手段,在多并发下情况下,获取被测系统的各项性能指标,验证被测系统在高并发下的处理能力、响应能力,稳定性等,能否满足预期。定位性能瓶颈,排查性能隐患,保障系统的质量,提升用户体验。 2、什么样的系统需要做性能测试 用户量大,页面访问…...
Postman CORS 测试完全指南:轻松模拟跨域请求,排查 CORS 相关问题
在使用 Postman 进行 API 测试时,通常不会遇到跨域问题,因为 Postman 是一个独立的客户端应用程序,不同于在浏览器中运行的 JavaScript 代码,它没有同源策略(SOP)的限制。跨域资源共享(CORS&…...
iOS抓包-charles和Stream
简单介绍几种抓包工具 1、Charles Charles是一款流行的跨平台HTTP代理软件,常用于Web调试,它可以帮助你在开发过程中检查、修改或模拟HTTP/HTTPS请求和响应。以下是如何在iOS设备上使用Charles进行抓包的基本步骤: 第一步:安装…...
三个核心文件:src\App.vue文件,index.html文件,src\main.js文件 的关系与运行流程解析(通俗形象)
一、三个文件的角色定位 用生活比喻理解它们的关系: index.html → “空房子” 像一栋毛坯房,只有基本的墙面和预留的插座(空白的HTML结构)。它的作用是提供一个容器,告诉Vue:“请把装修好的房间…...
