Fork me on CSDN

2.2神经网络的数据表示

当前所有机器学习系统都使用张量作为数据基本结构,它是一个数据容器,包含的数据基本上都是数值数据。张量是矩阵向任意维度的推广(张量的维度叫做轴(axis))

1.标量(0D张量)

仅包含一个数字的张量为标量。在Numpy数组中,一个float32或者float64的数字就是一个标量张量。可以用ndim属性查看一个Numpy张量的轴的个数。标量张量有0个轴(ndim==0)

import numpy as np

x = np.array(12)
print(x.ndim)

2.向量(1D张量)

数字组成的数组叫做向量。一维张量只有一个轴。

import numpy as np


x = np.array([12, 3, 6, 14, 7])
print(x.ndim)

3.矩阵(2D张量)

向量组成的数组为矩阵。矩阵有两个轴(行和列)。

import numpy as np

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

4.3D张量与更高维张量

将多个矩阵组合成一个新的数组,可以得到一个3D张量。

import numpy as np

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

将多个3D张量组成一个数组,可以组成一个4D张量。以此类推。。。

完整代码:

import numpy as np

x1 = np.array(12)
print(x1.ndim)

x2 = np.array([12, 3, 6, 14, 7])
print(x2.ndim)

x3 = np.array([[1, 2, 3],
             [4, 5, 6],
             [7, 8, 9]])
print(x3.ndim)

x4 = np.array([[[1, 2, 3]],
              [[4, 5, 6]],
              [[7, 8, 9]]])
print(x4.ndim)

5.关键属性

轴的个数(阶):3D张量有3个轴,矩阵有2个轴,即张量的ndim

形状:这是一个整数元组,表示张量沿每个轴的维度大小。前面例子中矩阵形状为(3,3),3D张量形状为(3,1,3),向量形状为(5,),标量形状为()

数据类型:张量的类型可以是float32,unit8,float64等。在极少数情况下,可能会遇到字符(char)张量

注:在Numpy(以及其他大多数库)中不存在字符串张量,因为张量存储在余弦分配好的连续内存段中,而字符串的长度是可变的,无法用这种方式存储。

完整代码:

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

print(train_images.ndim)
print(train_images.shape)
print(train_images.dtype)

 

 6.显示第四个数字

from keras.datasets import mnist
import matplotlib.pyplot as plt
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

digit = train_images[4]
plt.imshow(digit, cmap=plt.cm.binary)
plt.show()

 

 7.在Numpy中操作张量

前面使用语法train_images[i]来选择沿着第一个轴的特定数字。选择张量的特定元素叫做张量切片。

例:选择第10~100个数字(不包括第100个),并将其放在形状为(90,28,28)的数组中。

from keras.datasets import mnist
import matplotlib.pyplot as plt
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

my_slice = train_images[10:100]
print(my_slice.shape)

例:在所有图像的右下角选出14*14像素的区域

from keras.datasets import mnist
import matplotlib.pyplot as plt
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

my_slice = train_images[:, 14:, 14:]
print(my_slice.shape)

例:在图像中心裁剪出14像素×14像素的区域

from keras.datasets import mnist
import matplotlib.pyplot as plt
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

my_slice = train_images[:, 7:-7, 7:-7]
print(my_slice.shape)

8.数据批量的概念

通常来说,深度学习中所有数据张量的第一个轴(0轴,因为索引从0开始)都是样本轴,有时也称样本维度。此外,深度学习模型不会同时处理整个数据集,而是将数据拆分成小批量。

例:下面是一个MNIST数据集的一个批量,批量大小为128

batch = train_images[:128]
#下一个批量
batch = train_images[128:256]
#第n个批量
batch = train_images[128*n:128*(n+1)]

对于这种批量张量,第一个轴(0轴)叫做批量轴或者批量维度。

9.现实世界中的数据张量

向量数据:2D张量,形状为(samples, features)

时间序列数据或者序列数据:3D张量,形状为(samples,timesteps, features)

图像:4D张量,形状为(samples,height,width,channels)或(samples,channels,height,width)

视频:5D张量,形状为(samples,frames,height,width,channels)或(samples,frames,channels,height,width)

9.向量数据

对于这种数据集,每个数据点都被编码成一个向量,因此一个数据批量就被编码成2D张量,其中第一个轴是样本轴,第二个为特征轴。

例1:人口统计数据集,其中包括每个人的年龄、邮编和收入。每个人可以表示为包含 3 个值的向量,而整个数据集包含 100 000 个人,因此可以存储在形状为 (100000, 3) 的 2D张量中。

例2:文本文档数据集,我们将每个文档表示为每个单词在其中出现的次数(字典中包含20 000 个常见单词)。每个文档可以被编码为包含 20 000 个值的向量(每个值对应于字典中每个单词的出现次数),整个数据集包含 500 个文档,因此可以存储在形状为(500, 20000) 的张量中。

10.时间序列数据或序列数据

 

例1:股票价格数据集。每一分钟,我们将股票的当前价格、前一分钟的最高价格和前一分钟的最低价格保存下来。因此每分钟被编码为一个 3D 向量,整个交易日被编码为一个形状为 (390, 3) 的 2D 张量(一个交易日有 390 分钟),而 250 天的数据则可以保存在一个形状为 (250, 390, 3) 的 3D 张量中。这里每个样本是一天的股票数据。

例2:推文数据集。我们将每条推文编码为 280 个字符组成的序列,而每个字符又来自于 128个字符组成的字母表。在这种情况下,每个字符可以被编码为大小为 128 的二进制向量(只有在该字符对应的索引位置取值为 1,其他元素都为 0)。那么每条推文可以被编码为一个形状为 (280, 128) 的 2D 张量,而包含 100 万条推文的数据集则可以存储在一个形状为 (1000000, 280, 128) 的张量中。
11.图像数据
图像张量的形状有两种约定:通道在后(channels-last)的约定(在 TensorFlow 中使用)和通道在前(channels-first)的约定(在 Theano 中使用)。Google 的 TensorFlow 机器学习框架将颜色深度轴放在最后:(samples, height, width, color_depth)。与此相反,Theano将图像深度轴放在批量轴之后:(samples, color_depth, height, width)。如果采用 Theano 约定,前面的两个例子将变成 (128, 1, 256, 256) 和 (128, 3, 256, 256)。Keras 框架同时支持这两种格式。

12.视频数据

        视频数据是现实生活中需要用到 5D 张量的少数数据类型之一。视频可以看作一系列帧,每一帧都是一张彩色图像。由于每一帧都可以保存在一个形状为 (height, width, color_depth) 的 3D 张量中,因此一系列帧可以保存在一个形状为 (frames, height, width,color_depth) 的 4D 张量中,而不同视频组成的批量则可以保存在一个 5D 张量中,其形状为(samples, frames, height, width, color_depth)。
        举个例子,一个以每秒 4 帧采样的 60 秒 YouTube 视频片段,视频尺寸为 144×256,这个视频共有 240 帧。4 个这样的视频片段组成的批量将保存在形状为 (4, 240, 144, 256, 3)的张量中。总共有 106 168 320 个值!如果张量的数据类型(dtype)是 float32,每个值都是32 位,那么这个张量共有 405MB。好大!你在现实生活中遇到的视频要小得多,因为它们不以float32 格式存储,而且通常被大大压缩,比如 MPEG 格式。

 

posted @ 2021-05-15 16:48  追风赶月的少年  阅读(346)  评论(0编辑  收藏  举报