张量(tensor)

张量是神经网络的数据结构,张量是数值数据的容器。

张量的轴

张量的维度叫做张量的轴(axis),例如向量有1个轴,矩阵有两个轴,在python中可以使用numpy数组的ndim属性查看一个张量的轴的个数。张量按照轴的个数可以分为标量,向量,矩阵,3D张量和更高维张量。轴的个数叫做阶。

标量Scalar(0D张量)

包含一个数字的张量叫做标量,在numpy中包含一个float32或者float64的数字就是一个标量张量

import numpy as np
x=np.array(233)
#x=np.array([233])注意这种写法和上面的那种是不同的,这是1D向量,轴为1,上面才是标量
print(x.ndim)
print(x.shape)
print(x.dtype)

标量的轴为0,没有形状

向量Vector(1D张量)

向量是数组

import numpy as np
x=np.array([1,2,3,4])
print(x.ndim)
print(x.shape)

如果一个向量包含有n个元素,那么则可以称这个向量为nD向量,需要注意其余nD张量的区别,前者只有一个轴,沿着轴有5个维度。后者有n个轴,沿着每个轴有任意个维度。

矩阵matrix (2D张量)

矩阵是向量组成的数组 矩阵有两个轴,通常叫做行和列

import numpy as np
x=np.array(
[[1,2,3,4],
[5,6,7,8]]
)
print(x.ndim)

3D张量和更高维张量

3D张量是多个矩阵组成的新数组 通常,将多个nD张量合成一个新数组可以得到一个n+1D张量

x = np.array([[[5, 78, 2, 34, 0], [6, 79, 3, 35, 1], [7, 80, 4, 36, 2]], [[5, 78, 2, 34, 0], [6, 79, 3, 35, 1], [7, 80, 4, 36, 2]], [[5, 78, 2, 34, 0], [6, 79, 3, 35, 1], [7, 80, 4, 36, 2]]])
print(x.ndim)

张量的关键属性

维度

即轴的个数 可以使用ndim属性查看

形状

表示沿着每个轴的维度大小(元素个数) 可以使用shape属性查看

数据类型

张量中所包含数据的数据类型 可以使用dtype属性查看

张量的操作-张量切片

选择张量的特殊元素叫做张量切片,例如选取mnist数据集的第四个数字,就是张量切片

from tensorflow import keras as k
(train_images,train_labels),(test_iamges,test_labels)=k.datasets.mnist.load_data()
train_images[4]#张量切片

当然,我们也可以使用:截取一段区间

now=train_images[10:100]#选择第[10,100)个数字,注意左闭右开

也可以写成下面的形式,单独的:代表选取整个轴

now=train_images[10:100,:,:]
now=train_images[10:100,0:28,0:28]

另外也可以使用负数索引,负数索引代表与当前轴终点的相对位置。

now=train_images[:,14:,14]#截取所有图像的右下角的14*14像素区域
now=train_images[:,7:-7,7:-7]#在图像中心截取出一个14*14像素的区域

数据批量

通常来说,深度学习中所有数据张量的第一个轴(0轴)都是样本轴,也叫做样本维度,在mnist中,样本就是数字图像,mnist的图像张量是一个3D张量,第一个轴是样本轴,第二个轴是行,第三个轴是列。 深度学习模型不会同时处理整个数据集,而会将数据拆分成小批量

batch=train_images[:128]#mnist数据集的一个批量,批量大小为128
batch=train_images[128:256]#mnist数据集的下一个批量,批量大小为128
batch=train_images[128*n:128*(n+1)]#mnist数据集的第n个批量

故此,样本轴也叫做批量轴或者批量维度

现实世界中的数据张量

1.向量数据,2D张量,shape为(samples,features) 例如:人口统计数据 每个人的年龄邮编收入是一个3D向量,那么100000个人的数据集就是一个2D张量,第一个轴是样本轴,形状为(100000,3) 2.时间序列数据或者序列数据,3D张量,shape为(samples,timesteps,features) 例如股票价格数据集,推文数据集 3.图像,4D张量,shape为(samples,height,width,channels) 图像通常应该举有三个维度,高度宽度和颜色深度,灰度图像(例如mnist数字图像)只有一个颜色通道,所以可以保存在2D张量中,但是彩蛇图像则只能保存在3D张量中,因为需要三个颜色通道来确定色彩。例如一个大小为256*256的彩色图像可以保存在形状为(256,256,3)的张量中,而一张灰度图像只需要(256,256) 图像张量的形状有两种约定,通道在前和通道在后,前者在tensorflow中使用,后者在theano中使用,前者将图像深度轴放在最后(samples,height,width,color_depth),后者将图像深度轴放在批量轴之后(samples,colordepth,height,width) 4,视频,5D张量,形状为(samples,frames,height,width,channels) 视频可以看作是一连串的图片,专业点来讲,视频可以看作一系列帧,每一帧都是一张彩色图像,由于每一帧都可以保存在一个形状为 (height, width, color depth) 的 3D 张量中,因此一系列帧可以保存在一个形状为 (frames, height, width, color_depth) 的 4D 张量中

张量运算

逐元素运算

逐元素运算独立的应用于张量中的每一个元素,例如加法和relu运算

广播

张量点积

Last modification:December 7th, 2019 at 11:23 am
如果觉得我的文章对你有用,请随意赞赏