青岛网站建设外贸,wordpress 移动端首页,wordpress doc 插件,昆明app制作公司在哪里进入人工智能领域免不了与算法打交道#xff0c;算法依托数学基础#xff0c;很多小伙伴可能新生畏惧#xff0c;不用怕#xff0c;算法没那么难#xff0c;也没那么玄乎#xff0c;未来人工智能时代说不得人人都要了解算法、应用算法。
本文试图以一篇文章#xff0c;…进入人工智能领域免不了与算法打交道算法依托数学基础很多小伙伴可能新生畏惧不用怕算法没那么难也没那么玄乎未来人工智能时代说不得人人都要了解算法、应用算法。
本文试图以一篇文章用程序演绎的方式给大家把这里面的数学基础先讲清楚以便于咱们未来深入呵呵。 第一次接触机器学习的小伙伴环境搭建参考我的这篇文章只参考这个里面关于环境搭建的部分就可以
政安晨的机器学习笔记——跟着演练快速理解TensorFlow适合新手入门https://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, cmapplt.cm.binary)
plt.show() 显而易见对应的标签是整数3。 在NumPy中操作张量
我们使用语法train_images[i]来沿着第一个轴选择某张数字图像。
选择张量的特定元素叫作张量切片tensor slicing。我们来看一下对NumPy数组可以做哪些张量切片运算。下面这个例子选择第10100个数字不包括第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格式。 本篇将与下一篇一起将完成整个神经网络数学基础的核心概念演绎