政安晨:示例演绎机器学习中(深度学习)神经网络的数学基础——快速理解核心概念(一){两篇文章讲清楚}

news2025/1/13 10:09:34

进入人工智能领域免不了与算法打交道,算法依托数学基础,很多小伙伴可能新生畏惧,不用怕,算法没那么难,也没那么玄乎,未来人工智能时代说不得人人都要了解算法、应用算法。

本文试图以一篇文章,用程序演绎的方式给大家把这里面的数学基础先讲清楚,以便于咱们未来深入,呵呵。

第一次接触机器学习的小伙伴,环境搭建参考我的这篇文章(只参考这个里面关于环境搭建的部分就可以):

政安晨的机器学习笔记——跟着演练快速理解TensorFlow(适合新手入门)icon-default.png?t=N7T8https://blog.csdn.net/snowdenkeke/article/details/135950931

环境准备好之后,我们开始!

导入目标

机器学习中,那些“机器”学习的是什么?——数据。学习到的是什么?——模式和规律(或者说是可以解决实际问题的模型)。

详细点说,就是这样:

这些模式和规律可以用来预测未来的数据,做出决策或识别新的数据。

具体来说,智能程序通过分析大量的输入数据,并根据这些数据中的模式和趋势来训练模型。这些模型可以用来解决各种问题,如图像识别、语音识别、自然语言处理等。通过训练模型,智能程序能够自动从数据中提取特征、学习规律,并根据这些规律做出相应的预测或判断。

from tensorflow.keras.datasets import mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

咱们导入这个数据集,目标是训练一个神经网络,解决的问题是:将手写数字的灰度图像(28像素×28像素)划分到10个类别中(从0到9)。

我们将使用MNIST数据集,它是机器学习领域的一个经典数据集,其历史几乎和这个领域一样长,而且已被人们深入研究。这个数据集包含60 000张训练图像和10 000张测试图像,由美国国家标准与技术研究院(National Institute of Standards and Technology,即MNIST中的NIST)在20世纪80年代收集而成。

你可以将“解决”MNIST问题看作深度学习的“Hello World”,用来验证你的算法正在按预期运行。

导入数据集之后,用下面截图中的几行代码看一下这个数据集的形状(shape),确定数据集是OK 的。

这个数据存储在多维NumPy数组中,也叫作张量(tensor)。一般来说,目前所有机器学习系统都使用张量作为基本数据结构。张量对这个领域非常重要,重要到TensorFlow都以它来命名。

张量这一概念的核心在于,它是数据容器。

它包含的数据通常是数值数据,因此它是一个数字容器。你可能对矩阵很熟悉,它是2阶张量。张量是矩阵向任意维度的推广[注意,张量的维度通常叫作轴(axis)]。

标量(0阶张量)

仅包含一个数字的张量叫作标量(scalar),也叫标量张量、0阶张量或0维张量。在NumPy中,一个float32类型或float64类型的数字就是一个标量张量(或标量数组)。可以用ndim属性来查看NumPy张量的轴的个数。标量张量有0个轴(ndim == 0)。张量轴的个数也叫作阶(rank)。下面是一个NumPy标量。

向量(1阶张量)

数字组成的数组叫作向量(vector),也叫1阶张量或1维张量。1阶张量只有一个轴。下面是一个NumPy向量。

这个向量包含9个元素,所以叫作9维向量。不要把9维向量和9维张量混为一谈!9维向量只有一个轴,沿着这个轴有9个维度,而9维张量有9个轴(沿着每个轴可能有任意个维度)。

维度(dimensionality)既可以表示沿着某个轴上的元素个数(比如9维向量),也可以表示张量的轴的个数(比如9维张量),这有时会令人困惑。对于后一种情况,更准确的术语是9阶张量(张量的阶数即轴的个数),但9维张量这种模糊的说法很常见。

矩阵(2阶张量)

向量组成的数组叫作矩阵(matrix),也叫2阶张量或2维张量。矩阵有2个轴(通常叫作行和列)。你可以将矩阵直观地理解为矩形的数字网格。下面是一个NumPy矩阵。

第一个轴上的元素叫作行(row),第二个轴上的元素叫作列(column)。

在上面的例子中,[5, 78, 2, 34, 0]是x的第一行,[5, 6, 7]是第一列。

3阶张量与更高阶的张量

将多个矩阵打包成一个新的数组就可以得到一个3阶张量(或称为3维张量),你可以将其直观地理解为数字组成的立方体。下面是一个3阶NumPy张量。

将多个3阶张量打包成一个数组,就可以创建一个4阶张量,以此类推。深度学习处理的一般是0到4阶的张量,但处理视频数据时可能会遇到5阶张量。

关键属性

张量是由以下3个关键属性来定义的。

轴的个数(阶数)。举例来说,3阶张量有3个轴,矩阵有2个轴。这在NumPy或TensorFlow等Python库中也叫张量的ndim。形状。这是一个整数元组,表示张量沿每个轴的维度大小(元素个数)。举例来说,前面的矩阵示例的形状为(3, 5),3阶张量示例的形状为(3, 3, 5)。向量的形状只包含一个元素,比如(5,),而标量的形状为空,即()。

数据类型(在Python库中通常叫作dtype)。这是张量中所包含数据的类型。举例来说,张量的类型可以是float16、float32、float64、uint8等。在TensorFlow中,你还可能会遇到string类型的张量。

现在还是回头看一下文章开头,咱们刚刚导入的数据集,下面给出张量train_images的轴的个数,即ndim属性

咱们再来看看这个“训练图像数据集”的形状:

下面给出它的数据类型,即dtype属性:

可见,train_images是一个由8位整数组成的3阶张量

更确切地说,它是由60 000个矩阵组成的数组,每个矩阵由28×28个整数组成。咱们导入的这个数据集中,每个这样的矩阵都是一张灰度图像,元素取值在0和255之间。

我们用Matplotlib库(著名的Python数据可视化库)来显示这个3阶张量中的第7个数字:

代码如下

import matplotlib.pyplot as plt
digit = train_images[7]
plt.imshow(digit, cmap=plt.cm.binary)
plt.show()

显而易见,对应的标签是整数3。

在NumPy中操作张量

我们使用语法train_images[i]来沿着第一个轴选择某张数字图像。

选择张量的特定元素叫作张量切片(tensor slicing)。我们来看一下对NumPy数组可以做哪些张量切片运算。下面这个例子选择第10~100个数字(不包括第100个),并将它们放在一个形状为(90, 28, 28)的数组中。

小伙伴们可以使用下列代码尝试一下:

my_slice = train_images[10:100]
my_slice.shape

我的执行演绎如下:

它等同于下面这个更详细的写法——给出切片沿着每个张量轴的起始索引和结束索引。

注意,":" 等同于选择整个轴。

# ----等同于前面的例子
my_slice = train_images[10:100, :, :]
my_slice.shape

#----也等同于前面的例子
my_slice = train_images[10:100, 0:28, 0:28]
my_slice.shape

演绎如下:

一般来说,可以沿着每个张量轴在任意两个索引之间选择切片。

举例来说,要在所有图像的右下角选出14像素×14像素的区域,可以这么做:

my_slice = train_images[:, 14:, 14:]

也可以使用负数索引。

与Python列表类似,负数索引表示与当前轴终点的相对位置,要在图像中心裁剪出14像素×14像素的区域,可以这么做。

my_slice = train_images[:, 7:-7, 7:-7]

数据批量

通常来说,深度学习中所有数据张量的第一个轴(也就是轴0,因为索引从0开始)都是样本轴[samples axis,有时也叫样本维度(samples dimension)]。在MNIST例子中,样本就是数字图像。

此外,深度学习模型不会一次性处理整个数据集,而是将数据拆分成小批量。具体来看,下面是MNIST数据集的一个批量,批量大小为128。

batch = train_images[:128]

然后是下一个批量:

batch = train_images[128:256]

再然后是第n个批量:

n = 3
batch = train_images[128 * n:128 * (n + 1)]

对于这种批量张量,第一个轴(轴0)叫作批量轴(batch axis)或批量维度(batch dimension)。在使用Keras和其他深度学习库时,你会经常遇到“批量轴”这个术语。

现实世界中的数据张量实例

我们来具体看看你以后会遇到的几个数据张量实例,你要处理的数据几乎总是属于下列类别:

向量数据形状为(samples, features)的2阶张量,每个样本都是一个数值(“特征”)向量。

时间序列数据或序列数据形状为(samples, timesteps,features)的3阶张量,每个样本都是特征向量组成的序列(序列长度为timesteps)。

图像数据形状为(samples, height, width, channels)的4阶张量,每个样本都是一个二维像素网格,每个像素则由一个“通道”(channel)向量表示。

视频数据形状为(samples, frames, height, width,channels)的5阶张量,每个样本都是由图像组成的序列(序列长度为frames)。

向量数据

这是最常见的一类数据。

对于这种数据集,每个数据点都被编码为一个向量,因此一个数据批量就被编码为一个2阶张量(由向量组成的数组),其中第1个轴是样本轴,第2个轴是特征轴(features axis)

时间序列数据或序列数据

当时间(或序列顺序)对数据很重要时,应该将数据存储在带有时间轴的3阶张量中。

每个样本可被编码为一个向量序列(2阶张量),因此一个数据批量就被编码为一个3阶张量。

图像数据

 图像通常具有3个维度:高度、宽度和颜色深度。

虽然灰度图像(比如MNIST数字图像)只有一个颜色通道,因此可以保存在2阶张量中,但按照惯例,图像张量都是3阶张量。对于灰度图像,其颜色通道只有一维。因此,如果图像大小为256×256,那么由128张灰度图像组成的批量可以保存在一个形状为(128,256, 256, 1)的张量中,由128张彩色图像组成的批量则可以保存在一个形状为(128, 256, 256, 3)的张量中。

图像张量的形状有两种约定:通道在后(channels-last)的约定(这是TensorFlow的标准)和通道在前(channels-first)的约定(使用这种约定的人越来越少)。

通道在后的约定是将颜色深度轴放在最后:(samples, height, width,color_depth)。与此相对,通道在前的约定是将颜色深度轴放在紧跟批量轴之后:(samples, color_depth, height, width)。如果采用通道在前的约定,那么前面两个例子的形状将变成(128, 1, 256, 256)和(128, 3, 256,256)。Keras API同时支持这两种格式。

视频数据

视频数据是现实世界中为数不多的需要用到5阶张量的数据类型。视频可以看作帧的序列,每一帧都是一张彩色图像。由于每一帧都可以保存在一个形状为(height, width, color_depth)的3阶张量中,因此一个视频(帧的序列)可以保存在一个形状为(frames, height, width, color_depth)的4阶张量中,由多个视频组成的批量则可以保存在一个形状为(samples, frames,height, width, color_depth)的5阶张量中。

例如

一个尺寸为144×256的60秒视频片段,以每秒4帧采样,那么这个视频共有240帧。

4个这样的视频片段组成的批量将保存在形状为(4, 240,144, 256, 3)的张量中。这个张量共包含106 168 320个值!如果张量的数据类型(dtype)是float32,每个值都是32位,那么这个张量共有405 MB。这样算来,这个文件确实不小!但是你在现实生活中遇到的视频要小得多,因为它们不以float32格式存储,而且通常被大大压缩(比如MPEG格式)。


本篇将与下一篇一起将完成整个神经网络数学基础的核心概念演绎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1442865.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分享76个表单按钮JS特效,总有一款适合您

分享76个表单按钮JS特效,总有一款适合您 76个表单按钮JS特效下载链接:https://pan.baidu.com/s/1CW9aoh23UIwj9zdJGNVb5w?pwd8888 提取码:8888 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气,收集…

(坑点!!!)给定n条过原点的直线和m条抛物线(y=ax^2+bx+c,a>0),对于每一条抛物线,是否存在一条直线与它没有交点,若有,输出直线斜率

题目 思路: 1、区间端点可能是小数的时候,不能直接利用加减1将 < 转化为 <=,例如,x < 1.5 不等价于 x <= 2.5 2、该题中k在(b - sqrt(4 * a * c), b + sqrt(4 * a * c) 中,注意是开区间,那么可以将左端点向上取整,右端点向下取整,即sqrt(4 * a * c)向下取…

Netty中的常用组件(三)

ChannelPipeline 基于Netty的网路应用程序中根据业务需求会使用Netty已经提供的Channelhandler 或者自行开发ChannelHandler&#xff0c;这些ChannelHandler都放在ChannelPipeline中统一 管理&#xff0c;事件就会在ChannelPipeline中流动&#xff0c;并被其中一个或者多个Chan…

Mysql-Explain-使用说明

Explain 说明 explain SELECT * FROM tb_category_report;id&#xff1a;SELECT识别符&#xff0c;这是SELECT查询序列号。select_type&#xff1a;表示单位查询的查询类型&#xff0c;比如&#xff1a;普通查询、联合查询(union、union all)、子查询等复杂查询。table&#x…

房屋租赁系统的Java实战开发之旅

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

【Java多线程案例】实现阻塞队列

1. 阻塞队列简介 1.1 阻塞队列概念 阻塞队列&#xff1a;是一种特殊的队列&#xff0c;具有队列"先进先出"的特性&#xff0c;同时相较于普通队列&#xff0c;阻塞队列是线程安全的&#xff0c;并且带有阻塞功能&#xff0c;表现形式如下&#xff1a; 当队列满时&…

CSP-202012-2-期末预测之最佳阈值

CSP-202012-2-期末预测之最佳阈值 【70分思路】 本题的难点还是时间复杂度&#xff0c;暴力枚举会导致时间超限。对于每一个可能的阈值theta&#xff0c;代码都重新计算了整个predict数组&#xff0c;统计预测正确的数目&#xff0c;因为有两个嵌套的循环&#xff0c;使得时间…

各版本安卓的彩蛋一览

目录 前言前彩蛋纪Android 2.3 GingerbreadAndroid 3 HoneycombAndroid 4.0 Ice Cream SandwichAndroid 4.1-4.3 JellybeanAndroid 4.4 KitKatAndroid 5 LollipopAndroid 6 MarshmallowAndroid 7 NougatAndroid 8 OreoAndroid 9 PieAndroid 10 Queen CakeAndroid 11 Red Velvet…

分享66个相册特效,总有一款适合您

分享66个相册特效&#xff0c;总有一款适合您 66个相册特效下载链接&#xff1a;https://pan.baidu.com/s/1jqctaho4sL_iGSNExhWB6A?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不…

【Java EE初阶十】多线程进阶二(CAS等)

1. 关于CAS CAS: 全称Compare and swap&#xff0c;字面意思:”比较并交换“&#xff0c;且比较交换的是寄存器和内存&#xff1b; 一个 CAS 涉及到以下操作&#xff1a; 下面通过语法来进一步进项说明&#xff1a; 下面有一个内存M&#xff0c;和两个寄存器A,B; CAS(M,A,B)&am…

社区店营销新趋势:如何吸引并留住顾客?

作为一名资深的鲜奶吧创业者&#xff0c;我已经在这个行业摸爬滚打了五年。 这五年的时间&#xff0c;我见证了社区店营销的变迁&#xff0c;也积累了一些关于如何吸引并留住顾客的经验。今天&#xff0c;我想和大家分享一些留住顾客的核心干货。&#xff08;可以点赞收藏&…

YOLOv8改进 | 检测头篇 | 独创RFAHead检测头超分辨率重构检测头(适用Pose、分割、目标检测)

一、本文介绍 本文给大家带来的改进机制是RFAHead,该检测头为我独家全网首发,本文主要利用将空间注意力机制与卷积操作相结合的卷积RFAConv来优化检测头,其核心在于优化卷积核的工作方式,特别是在处理感受野内的空间特征时。RFAConv主要的优点就是增加模型的特征提取能力,…

MATLAB实现LSTM时间序列预测

LSTM模型可以在一定程度上学习和预测非平稳的时间序列&#xff0c;其具有强大的记忆和非线性建模能力&#xff0c;可以捕捉到时间序列中的复杂模式和趋势[4]。在这种情况下&#xff0c;LSTM模型可能会自动学习到时间序列的非平稳性&#xff0c;并在预测中进行适当的调整。其作为…

股票均线的使用方法和实战技术,看涨看空的均线形态与案例教学

一、教程描述 本套教程讲解了14种均线的特殊形态&#xff0c;通过直观图形以及大量案例的教学&#xff0c;将深奥、繁琐的均线变得生动与具体&#xff0c;广大投资者在认真学习以后&#xff0c;可以学会均线的使用方法&#xff0c;掌握最强的均线应用实战技术。本套教程不仅适…

Qt可视化大屏布局

科技大屏现在非常流行&#xff0c;这里分享一下某个项目的大屏布局&#xff08;忘了源码是哪个博主的了&#xff09; 展示 这个界面整体是垂直布局&#xff0c;分为两个部分&#xff0c;标题是一个部分&#xff0c;然后下面的整体是一个layout布局&#xff0c;为另外一部分。 l…

Shell脚本系列| SSH分发公钥方法 - expect脚本的使用

ssh原理&#xff1a;在SSH安全协议的原理中&#xff0c; 是一种非对称加密与对称加密算法的结合。用于确保远程登录和其他网络服务的会话安全&#xff0c;通过非对称加密、会话加密、多重验证机制等手段&#xff0c;保护数据传输的机密性和完整性。 ssh登录有2种方法&#xff1…

图书商城系统

文章目录 图书商城系统一、项目演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目&#xff08;9.9&#xffe5;带走&#xff09; 图书商城系统 一、项目演示 网上书城 二、项目介绍 基于SSM的图书商城网站 运行环境:idea或eclipse 数据库:mysql 开发语…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Web组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Web组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Web组件 提供具有网页显示能力的Web组件&#xff0c;ohos.web.webview提供web控制能…

4. TypeScript

目录 1 TypeScript 介绍 2 TypeScript 常用类型 2.1 类型标注的位置 2.2 字符串、数字、布尔类型 2.3 字面量类型 2.4 interface 类型 2.5 class 类型 Vue1&#xff1a;基础跟使用方式 Vue2&#xff1a;路由方面 Vue3&#xff1a;状态管理 vuex 状态管理库 1 TypeScrip…

鸿蒙原生应用再添新丁!央视新闻 入局鸿蒙

鸿蒙原生应用再添新丁&#xff01;央视新闻 入局鸿蒙 来自 HarmonyOS 微博2月9日消息&#xff0c;#央视新闻启动鸿蒙原生应用开发#中央广播电视总台旗舰央视新闻客户端正式宣布&#xff0c;将基于HarmonyOS NEXT鸿蒙星河版&#xff0c;启动央视新闻 鸿蒙原生应用开发&#xf…