本文的ipynb 格式见CSDN下载。
0维张量/标量
标量是一个数字
1维张量/向量
1维张量称为“向量”。
2维张量
2维张量称为矩阵
3维张量
公用数据存储在张量
时间序列数据
股价
文本数据
图片
彩色图片
5D张量
结论
实际上,你可以使用一个数字的张量,我们称为0维张量,也就是一个只有0维的张量。
它仅仅只是带有一个数字的水桶。想象水桶里只有一滴水,那就是一个0维张量。
import numpy as np
x = np.array(5)
print(x)
x = np.array([1,2,3,4])
print(x)
#通过NumPy’s ndim函数,查看张量具有多个坐标轴。
x.ndim
x = np.array([[5,10,15,30,25],[20,30,65,70,90],[7,80,95,20,30]])
print(x)
x.ndim
y = np.array([[[5,10,15,30,25], [20,30,65,70,90], [7,80,95,20,30]],
[[3,0,5,0,45], [12,-2,6,7,90], [34,3436,4364,3434,566]],
[[17,13,25,30,15], [23,36,9,7,80], [1,-7,-5,22,3]]])
print(y)
y.ndim
(width, height, color_depth) = 3D
(sample_size, width, height, color_depth) = 4D
医学扫描——我们可以将脑电波(EEG)信号编码成3D张量,因为它可以由这三个参数来描述:
(time, frequency, channel)
这种转化看起来就像这样:
如果我们有多个病人的脑电波扫描图,那就形成了一个4D张量:
(sample_size, time, frequency, channel)
纽交所开市时间从早上9:30到下午4:00,即6.5个小时,总共有6.5 x 60 = 390分钟。
如此,我们可以将每分钟内最高、最低和最终的股价存入一个2D张量(390,3)。如果我们追踪一周(五天)的交易,我们将得到这么一个3D张量:
(week_of_data, minutes, high_low_price)
即:(5,390,3)
同理,如果我们观测10只不同的股票,观测一周,我们将得到一个4D张量
(10,5,390,3)
假设我们在观测一个由25只股票组成的共同基金,其中的每只股票由我们的4D张量来表示。那么,这个共同基金可以有一个5D张量来表示:
(25,10,5,390,3)
我们也可以用3D张量来存储文本数据,我们来看看推特的例子。
首先,推特有140个字的限制。其次,推特使用UTF-8编码标准,这种编码标准能表示百万种字符,
但实际上我们只对前128个字符感兴趣,因为他们与ASCII码相同。所以,一篇推特文可以包装成一个2D向量:
(140,128)
如果我们下载了一百万篇川普哥的推文(印象中他一周就能推这么多),我们就会用3D张量来存:
(number_of_tweets_captured, tweet, character)
这意味着,我们的川普推文集合看起来会是这样:
(1000000,140,128)
4D张量很适合用来存诸如JPEG这样的图片文件。之前我们提到过,一张图片有三个参数:高度、宽度和颜色深度。
一张图片是3D张量,一个图片集则是4D,第四维是样本大小。
MNIST图片是黑白的,这意味着它们可以用2D张量来编码,但我们习惯于将所有的图片用3D张量来编码,多出来的第三个维度代表了图片的颜色深度。
MNIST数据集有60,000张图片,它们都是28 x 28像素,它们的颜色深度为1,即只有灰度。
TensorFlow这样存储图片数据:
(sample_size, height, width, color_depth)
于是我们可以认为,MNIST数据集的4D张量是这样的:
(60000,28,28,1)
彩色图片有不同的颜色深度,这取决于它们的色彩(注:跟分辨率没有关系)编码。
一张典型的JPG图片使用RGB编码,于是它的颜色深度为3,分别代表红、绿、蓝。
这是一张我美丽无边的猫咪(Dove)的照片,750 x750像素,这意味着我们能用一个3D张量来表示它:
(750,750,3)
然后,如果我们有一大堆不同类型的猫咪图片(虽然都没有Dove美),
也许是100,000张吧,不是DOVE它的,750 x750像素的。我们可以在Keras中用4D张量来这样定义:
(10000,750,750,3)
(sample_size, frames, width, height, color_depth)
如果我们考察一段5分钟(300秒),1080pHD(1920 x 1080像素),每秒15帧(总共4500帧),颜色深度为3的视频,我们可以用4D张量来存储它:
(4500,1920,1080,3)
当我们有多段视频的时候,张量中的第五个维度将被使用。如果我们有10段这样的视频,我们将得到一个5D张量:
(10,4500,1920,1080,3)
这个5D张量中值的数量为:
10 x 4500 x 1920 x 1080 x 3 = 279,936,000,000
在Keras中,我们可以用一个叫dype的数据类型来存储32bits或64bits的浮点数
我们5D张量中的每一个值都将用32 bit来存储,现在,我们以TB为单位来进行转换:
279,936,000,000 x 32 = 8,957,952,000,000bit = 1.119744T
参考文献
Learning AI if You Suck at Math — P4 — Tensors Illustrated (with Cats!)
你真的懂TensorFlow吗?Tensor是神马?为什么还会Flow?