登 录
注 册
< 人工智能
深度学习
机器学习
大模型
深度学习介绍
现状和未来
数学基础
通用工作流程
Keras简介
过拟合与欠拟合
卷积神经网络
热门推荐>>>
中台架构
中台建设与架构
Hadoop
源码分析-NN启动(三)
HBase
HBased对接Hive
Linux
Nginx高可用
Python
数据导出工具
Flink
3分钟搭建Flink SQL测试环境
Kafka
Kafka对接Flume
数据结构与算法
选择合适的算法
MySQL
数据备份恢复
计算机系统
信号量同步线程
Hive
Hive调优参数大全
其他框架
Azkaban Flow1.0与2.0
ClickHouse
表引擎-其他类型
技术成长
最好的职业建议
精选书单
技术成长书单—机器学习
技术资讯
数据在线:计算将成为公共服务
开发工具
IntelliJ IDEA 20年发展回顾(二)
系统工具
Mac命令行工具
虚拟化
内存虚拟化概述
云原生
云原生构建现代化应用
云服务
一文搞懂公有云、私有云...
Java
Spring Boot依赖注入与Runners
Go
Go函数与方法
SQL
SQL模板
安全常识
一文读懂SSO
当前位置:
首页
>>
深度学习
>>
数学基础
数学基础
2020-07-04 15:47:54 星期六 阅读:3462
####神经网络的数据表示 #####张量的概念 前面提到的MINST数据存储在多维Numpy数组中,也叫张量。一般来说,`当前所有的机器学习系统都使用张量来作为基本数据结构`。张量对这个领域非常重要,重要到Google的TensorFlow都以它来命名。那么什么是张量? 张量这一概念的核心在于,它是一个数据容器。它包含的数据几乎总是数值数据,因此它是数字的容器。你可能对矩阵很熟悉,它是二维张量。张量是矩阵向任意维度的推广(张量的维度通常叫做轴),可用Numpy对象的ndim属性查看某个张量的维度。如下: ``` >>> import numpy as np >>> tensor = np.random.randn(4,3) >>> tensor array([[ 0.61702946, -0.51547409, 1.27388328], [-0.02672236, -0.2219784 , -1.5286901 ], [-0.69036742, 0.79137572, 1.2654383 ], [-0.01300756, 0.19492879, 0.55929041]]) >>> tensor.ndim 2 ``` #####张量一般分为如下几种 - 标量(0D张量) - - 仅包含一个数字的张量叫做标量 x = np.array(3) - 向量(1D张量) 矩阵(2D张量) 3D张量或更高维张量:可以直观的理解为数字组成的立方体,将多个3D张量组合成一个数组,可以创建一个4D张量,以此类推。深度学习处理的一般是0D到4D的张量,但处理视频数组时可能会遇到5D张量。 #####张量的关键属性 `轴的个数`:调用Numpy的ndim方法 `形状`:调用Numpy的shape方法 `数据类型`:在Python中数据类型通常叫做dtype,这是张量中所包含数据的类型,例如张量的类型可以是float32/uint8/float64等。在极少数情况下,你可能会遇到char张量。 注意,Numpy以及绝大多数其他库中不存在字符张量,因为张量存储在预先分配的连续内存段中,而字符串的长度是可变的,无法使用这种方式存储。 ####张量运算 #####逐元素运算 逐元素运算就是该运算独立地应用于张量中的每个元素,也就是说,这些运算非常适合大规模的并行实现。在实践中处理Numpy数组时,这些运算都是优化好的Numpy内置函数。比如,下面的示例对张量中的每个元素都跟0比较,如果比0大,则返回元素本省的值,如果比0小则返回0。 ``` >>> import numpy as np >>> tensor = np.random.randn(2,5) >>> tensor array([[-0.51289337, 0.27688632, -0.8623664 , -0.72634355, 0.0421322 ], [ 0.23619258, -0.17576975, 1.871791 , 0.45735059, -0.78693957]]) >>> tensor2 = np.maximum(tensor, 0.) >>> tensor2 array([[0. , 0.27688632, 0. , 0. , 0.0421322 ], [0.23619258, 0. , 1.871791 , 0.45735059, 0. ]]) ``` #####广播 比如不同形状的张量计算,较小的张量会沿着新轴重复,使其与较大张量形状相同。然后再计算。如下示例,两个不同形状的张量相加。 ``` >>> arr1 = np.array([1,2,3,4,5]) # 从0到100的整数中,随机选择15个,形状为3行5列 >>> arr3 = np.random.randint(100, size=(3,5)) >>> arr3 array([[41, 97, 41, 87, 71], [32, 98, 90, 41, 94], [66, 4, 42, 82, 29]]) >>> arr3 + arr1 array([[ 42, 99, 44, 91, 76], [ 33, 100, 93, 45, 99], [ 67, 6, 45, 86, 34]]) ``` #####张量点积 点积运算,也叫张量积(tensor product,不要与逐元素的乘积弄混),是最常见也最有用的 张量运算。与逐元素的运算不同,它将输入张量的元素合并在一起。 在 Numpy、Keras、Theano 和 TensorFlow 中,都是用 * 实现逐元素乘积。TensorFlow 中的 点积使用了不同的语法,但在 Numpy 和 Keras 中,都是用标准的 dot 运算符来实现点积。 ``` >>> x = np.array([1,2,3,4,5]) >>> y = np.array([2,4,6,8,9]) >>> z = np.dot(x, y) >>> z 105 # 我们也可以使用如下的方法来计算点积,只是稍微麻烦一点 >>> z = 0 >>> for i in range(x.shape[0]): ... z += x[i] * y[i] ... >>> z 105 ``` 两个向量(1D)张量之间的点积结果是一个标量,而且只有元素个数相同的向量之间才能做点积。 你还可以对一个矩阵x(2D张量)和一个向量y(1D张量)做点积,返回值是一个向量,其中每个元素是y和x的每一行之间做点积。 ``` # 从-10到10中随机选择12个数组成3行4列的矩阵 >>> x = np.random.randint(-10, high=10, size=(3,4)) >>> x array([[ -9, 7, 9, -2], [ -1, 4, 9, 5], [-10, 2, -7, 0]]) >>> y = np.array([2,2,2,2]) >>> y array([2, 2, 2, 2]) >>> z = np.dot(x, y) >>> z array([ 10, 34, -30]) ``` 注意,如果两个张量中有一个的 ndim 大于 1,那么dot(x, y) 不等于 dot(y, x) 当然,点积可以推广到具有人一个轴的张量,最常见的应用可能就是两个矩阵之间的点积。对于两个矩阵x和y,当且仅当x.shape[1] == y.shape[0]时,才可以对对它们进行点积操作dot(x, y)。得到的结果为一个形状为(x.shape[0], y.shape[1])的矩阵。 为了方便理解,我们可以先拿上面说的矩阵和向量点积的列子先说一下, 如果要实现一个矩阵(3行5列)能够跟一个向量实现点积运算,那么这个向量必须有5个元素,也就这个向量的shape为(5,)。得到的结果为一个3个元素的向量。 同样,我们推广到两个矩阵做点积,比如x.shape=(a, b),那么y.shape可以为(b, c)。得到的点积结果为(a, c)。下面是的示例x.shape=(3,5),y.shape=(5, 4),得到的结果为(3,4)。 ``` >>> x = np.random.randint(10, size=(3, 5)) >>> y = np.random.randint(10, size=(5, 4)) >>> x array([[6, 1, 4, 9, 8], [0, 9, 9, 8, 5], [2, 6, 2, 4, 5]]) >>> y array([[8, 8, 4, 0], [8, 3, 6, 6], [0, 6, 0, 7], [6, 0, 0, 1], [4, 4, 2, 9]]) >>> z = np.dot(x, y) >>> z array([[142, 107, 46, 115], [140, 101, 64, 170], [108, 66, 54, 99]]) ``` ####张量变形 第三个重要的张量运算就是张量变形,指的是改变张量的行和列,已得到想要的形状。变形后的张量的元素总个数与初始张量相同。如下列的示例: ``` >>> tensor = np.random.randint(10, size=(2, 3)) >>> tensor array([[6, 2, 6], [5, 5, 9]]) >>> tensor.reshape((6, 1)) array([[6], [2], [6], [5], [5], [9]]) >>> tensor.reshape((3, 2)) array([[6, 2], [6, 5], [5, 9]]) ``` 经常会遇到一种特殊的张量变形是转置(transposition),对矩阵做转置是指将行和列互换 ``` >>> tensor array([[6, 2, 6], [5, 5, 9]]) >>> np.transpose(tensor) array([[6, 5], [2, 5], [6, 9]]) ```